linux kernel源码目录分析Kbuild,Kernel Build,管理内核编译的文件Makefile,kernel工程的Makefile。arch体系架构,arch目录下的子目录存放的是不同种类的架构block,块设备,一般是存储设备,存放的块设备管理的相关代码crypto,加密相关,存放加密算法实现代码Documentation说明文档,drivers设备驱动模块,存放各种设备类型驱动模块firmware,固件fs,文件系统,子目录存放各种文件系统include,头文件,子目录存放通用的各种模块的头文件init,kernel启动时初始化的代码ipc,进程间通信机制的代码kernel,kernel本身的代码lib,通用的库函数mm,内存管理net,网络协议栈,子目录存放各种网络协议scripts,辅助对kernel进行配置编译的脚本security,kernel安全机制相关的代码 。sound音频相关的代码tools,工具相关usr,kernel启动相关 virt,虚拟机相关。
1.看内核是否支持芯片
我们需要去arch/arm/configs目录下查看内核是否支持我们的芯片(exynos4412),找到之后我们需要对我们需要编译的芯片进行配置生成配置文件,这样编译的时候才知道我们需要对哪一个芯片进行编译
make exynos4412_defconfig
但是会发现执行的时候会出现问题:
因为在makefile中默认是在x86架构下,所以我们需要进入makefile文件进行修改:
2.配置内核
我们可以进入配置工具图形界面配置一些内容更加方便
make menuconfig
但是我们会发现会报错
原因是我们没有安装libncurses包:执行下述命令进行安装:
sudo apt-get install libncurses5-dev
3.编译uImage内核
make uImage -j8
现在我们可以对芯片进行编译了,但是最后却发生了一些错误导致编译失败:
需要安装依赖包 sudo apt-get install uboot-mkimage
提示”现在没有可用的软件包 uboot-mkimage,但是它被其它的软件包引用了,这可能意味着这个缺失的软件包可能已被废弃,按照其提示,安装”u-boot-tools“即可 sudo apt-get install u-boot-tools
随后我们再进行编译,即可得到uImage文件
4.编译设备树文件 make dts
每一个设备树文件都对应一个型号的开发板
(1)在主目录下,执行 make dtbs---会编译所有的设备树文件
(2)所以我们需要查找对应的设备树(找不到去找厂家,或者去新版uboot去找,实在不行就找芯片相同板子的设备树拷贝修改成我们自己的)
(3)修改 dts/Makefile ---增加我们的设备树文件
(4)编译 make dtbs注意:内核的移植主要是在功能的增加和减少,以及内核的大小上体现
在arch/arm/boot/dts下将原本的相同的设备树文件复制并改名为我们的设备名,随后去makefile文件中将我们的新增的设备树添加到对应位置,然后就可以进行编译得到dtb设备树文件了(因为之前配置了对应的芯片所以只会编译对应芯片的设备树文件)
问题:
在完成上述移植后,我们我们在执行ifconfig eth0 ip 配置网络时发现找不到这个设备,这说明我们复制的那个设备树文件没有网卡这个设备,可能是我们参考的那个板子本身就缺少网卡设备所以我们需要去找相同网卡设备的设备树文件里将网卡设备的代码参考过来我们使用的网卡设备dm9000 可以使用下面这个查找指令进行查找
(指令find ./ | grep -IR dm9000)
找到对应的代码后将他复制并修改它的起始地址和对应的中断管脚(找芯片手册)适应我们的硬件适配。在完成上述操作后发现还是找不到网卡设备,可能是因为没有添加设备的驱动,那么我们可以总结一下,如果我们需要添加一个硬件设备的话,那么我们需要添加两个东西:设备树文件和相应的驱动配置
1.设备树文件
2.在内核中配置网卡驱动
make menuconfig--->/dm9000
找到路径
选中网卡驱动,保存,退出
重新编译uImage烧写之后我们就可以找到网卡设备了
5.自动配置ip功能
make menuconfig
进入menuconfig配置界面
Network support-->network options--->IP:kernel ...............将ip放到启动参数bootargs中,那么启动的时候就会自动将ip给内核进行自动配置
6.增加网络文件系统nfs
nfs主要用于实现网络文件的挂载,实际上是实现网络文件的共享,在开发的过程中,通常在系统移植的最后一步会制作文件系统,那么这是可以把制作好的文件系统放置在我们开发主机PC的相应位置,开发板通过nfs服务进行挂载,从而测试我们制作的文件系统是否正确,在整个过程中并不需要把文件系统烧录到Flash中去,而且挂载是自动进行挂载的,bootload启动后,kernel运行起来后会根据我们设置的启动参数进行自动挂载,因此,对于开发测试来讲,这种方式非常的方便,能够提高开发效率。
1.服务端:一般部署在高性能主机(ubuntu)
安装nfs
sudo apt-get install nfs-kernel-server
将根文件系统解压到用户目录下修改nfs的配置 vi /etc/exports,将rootfs目录共享,添加到最后
重启nfs
sudo /etc/init.d/nfs-kernel-server restart2.客户端
menuconfig配置界面
搜索nfs找到路径nfs client进行配置make uImage 重新编译内核
3.修改启动参数
bootargs root=/dev/nfs nfsroot=192.168.3.11:/home/hqyj/myfile/rootfs,v3 rw console
=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.3.164.加载命令
不需要下载根文件系统了
bootm 内核 - 设备树
根文件系统的制作
根文件系统是存放运行,维护系统所必须的各种工具软件,库文件,脚本,配置文件和其他特殊文件的地方,也可以安装各种软件包
首先我们来看看根文件主要包含了哪些目录
程序文件目录:
配置基本的Linux命令,需要用到我们的busybox来制作:
1.busybox解压
2.make menuconfig进行配置:静态库 和交叉编译环境3.编译make
4.安装 make install----->bin linuxrc sbin user
5. 补齐目录:mkdir lib etc dev proc sys mnt opt tmp var
6、填充内容:
1)lib --》cp gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/* _install/lib/ -af
2)etc --》fstab init.d/rcS inittab profile