linux 内核配置、编译过程

 

 

linux 内核配置、编译、移植
1、前言
     Linux内核:   3.14
     目   标  板:   Exynos4412-FS4412开发板
     学习 目标:   从 www.kernel.org下载一个全新的Linux内核,并将linux 内核经过配置、编译之后,移植到我们的目       标版。
2、linux内核的配置
配置之前:首先拿到我们的板子,首先要做的就是找到相关的资料、pdf、源码等等,拿到这些资料之后,接下  
 来要做的就是直观重要的一步就是判断该linux是否支持我们的板子,这里说的支持就是在架构和板  子两方面都支持,判断方法如下:
 linux3.14/arch 目录下为架构
     arch/arm/configs/  以arm架构和本板子为例,在此目录下找到 exynos_defconfig  
 这说明支持我们的板子,如果发现不支持我们的板子,我们可以选择高版本的linux内核看看支持不支  持,或者向购买板子的厂商要,再或者向公司同事、组长、老板要,总会有解决的办法。
 
<1> make mrproper

该命令会删除所有的之前编译生成文件、内核配置文件(.config文件)和各种备份文件,
所以几乎只在第一次执行内核编译前才用这条命令
注:
make clean命令则是用于删除大多数的编译生成文件,但是会保留内核的配置文件.config,
还有足够的编译支持来建立扩展模块。所以你若只想删除前一次编译过程的残留数据,
只需执行make clean命令。
总而言之,make mrproper删除的范围比make clean大,
实际上,make mrproper在具体执行时第一步就是调用make clean
<2> 修改linux-3.14目录下 Makefile
ARCH=arm    /* 告诉make在编译的时候 去根据arm架构的配置 去编译,默认X86 */
/* make exynos_fs4412_config 去arch/arm/configs/去找  ,不配置 找不到*/
CROSS_COMPILE=arm-linux-
<3>选择一个和开发板接近的编译配置
配置的模板在arch/arm/configs/下
 
cp arch/arm/configs/exynos_defconfig    arch/arm/configs/exynos_fs4412_defconfig
 
make exynos_fs4412_config  ---> 用exynos_fs4412_defconfig 将.config 覆盖掉
或者:cp       arch/arm/configs/exynos_fs4412_defconfig         .config
<4> 执行配置命令(裁剪内核)
make menuconfig

make  menuconfig 图形化界面,选择需要的功能,保存(也是保存到.config)
需要装 sudo apt-get install libncurse-dev
比如说打开网卡、NFS等驱动功能。---->内核比uboot 编译简单

3、内核编译
注:
1、uboot-2013/tools目录下是为内核等提供的一些工具命令。
    编译内核时就用到mkimage命令(生成镜像文件)
2、拷贝到 linux-3.14/usr/bin 让make 能找到命令

<1> make uImage -j4  (双核:选4   四核:选8  -->最多8) 
-----> mkimage not found ---> 见上面的注释
(编译, u代表 uboot启动   zImage 其他启动)


<2> 找一个和板子相近的设备树【描述真实物理硬件--使用硬件必须添加进来】


 arch/arm/boot/dts 设备树目录 (板子的设备树)--> 【描述板子上有哪些真实的物理硬件设备】
 
 cp arch/arm/boot/dts/exynos4412-origen.dts   arch/arm/boot/dts/exynos4412-fs4412.dts
 vi arch/arm/boot/dts/Makefile
exynos4412-origen.dtb  ----> exynos4412-fs4412.dtb
 cd linux-3.14
 make dtbs  (编译arch/arm/boot/dts/所有的设备树)
 
 cp arch/arm/boot/uImage ~/tftp
 cp arch/arm/boot/dts/exynos4412-fs4412.dtb~/tftp
<3> 下载----> 现象:启动时停在某处
 
  在板子上设置以下环境变量:(根文件系统通过nfs以挂载好)
  setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;
  bootm 41000000 - 42000000
save 
下载完成之后:

提示信息:cannot open root "nfs"  fsroot not mount(挂载根文件系统)
1、内核中的的nfs(客户端)没有打开?
---->
make  menuconfig
 /NFS  查找相关NFS_Client 的内容 打开 保存 编译 
File systems-->Network File System -->NFS client support (Y) 
------> 下载之后:依旧不行
2、内核中网络功能没开启?没配置?
---> Networking Support -->Networking options--->
打开 IP: kernel level autoconfiguration (从Uboot 获取IP serverip)
File systems-->Network File System -->
NFS client support --->Y
   --->Root file system on NFS (Y)
 
----> 依旧停在那!
注意:uboot kernel 是两个不同的软件,独立的,kernel 看不起uboot 会从头开始初始化


3.网卡没打开? 
make  menuconfig---->搜索dm9000--->打开
Device Drivers --> Network device support --->Ethernet driver support
现象:---> 依旧有问题
4、设备树中是否真的添加了dm9000硬件设备?  

vi arch/arm/boot/dts/exynos4412-fs4412.dts 观察是否有dm9000的节点?----> 并没有
---->现在我们来添加这个节点,是不是有点犯蒙呢?怎么添加呢?
---->还好内核给我们提供了一些案例,拿来改一改
linux-3.14/Documentation/devicetree/bindings/net/davicom-dm9000.txt

注:linux-3.14/Documentation 下有soc上的内容在arm/,也有外部的net/

ethernet@18000000 {
compatible = "davicom,dm9000";
reg = <0x05000000 0x2 0x05000004 0x2>;   //Index ADDR 、Index长度 、DATA ADDR、 长度
interrupt-parent = <&gpx0>;         //DM9000中断引脚 接到哪儿  根据头文件往上追gpx0 的定义
interrupts = <6 4>;           // 6 -->22号中断  4  gic.txt  
local-mac-address = [00 00 de ad be ef];
davicom,no-eeprom;
};
---->将上面的节点添加到设备树中,再次下载,终于看见了阳光!感觉生命又有了色彩!


4、至此,我们的内核已经编译和移植完毕,在我们的板子上已经完全可以使用啦!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值