一、Linux内核源码结构
Linux内核文件数目很多,除去其他CPU架构的代码,支持S3C2440、S3C2410这两款芯片的完整内核文件就有1万多个,这些文件的组织结构并不复杂,都是位于顶层目录下的17个子目录。个子目录功能如下图,最后两个目录不包含内核代码:
我们常需要用到的是 arch 目录,driver目录,kernel目录。
二、Linux的Makefile分析
在编译内核时,内核中的哪些文件将被编译?它们是怎样被编译的?它们链接时的顺序如何确定?哪个文件在最前面?哪些文件或函数先执行?这些都是通过makefile来管理的,Makefile最主要的三个作用:
1.决定编译哪些文件
2.怎样编译这些文件
3.怎样链接这些文件,它们的顺序是怎样的?
内核源码中Makefile文件分为以下5类:
由于能力时间有限,以后再来具体分析各级Makefile的实现。这是一个很庞大的工程,想要学习可以看下内核文档Documentation/kbuild/makefiles.txt,这个文件对Makefile讲解的非常清楚透彻,可惜是30页左右英文档,可能要花上好长一段时间来学习。
下面简要总结一下Makefile的功能:
1.顶层Makefile决定内核根目录下哪些子目录被编译进内核
2.arch/$(ARCH)/Makefile 决定arch/$(ARCH)目录下哪些文件、哪些目录被编译进内核
3.各级子目录下的Makefile决定所在目录下的哪些文件将被编译进内核,那邪恶文件将被编译成模块(驱动),进入哪些子目录继续调用它们的Makefile
4. .config文件在配置内核时生成(make menuconfig时会读取该文件),Makefile结合.config来决定哪些文件编译进内核,哪些编译成模块,涉及到哪些子目录
5.顶层Makefile和arch/$(ARCH)/Makefile设置了可以影响所有文件的编译、链接选项:CFLAGS、AFLAGS、LDFLAGS、ARFLAGS
6.各级子目录下的Makefile中可以设置能够影响当前目录下文件的编译、链接选项:EXTRA_CFLAGS、EXTRA_AFLAGS、EXTRA_LDFLAGS、EXTRA_ARFLAGS;还可设置可以影响某个文件的编译、链接选项:CFLAGS_$@、AFLAGS_$@
7.顶层Makefile按照一定的顺序组织文件,根据链接脚本arch/$(ARCH)/kernel/vmlinux.lds 生成vmlinux,继而生成内核镜像文件uImage。
三、Linux内核配置过程
有三种方法:
1.直接进行make menuconfig。这是最麻烦的一种方法,所有的配置都需要你来操作。
2.在默认配置上自己修改,也就是修改defconfig文件。使用 find -name "*defconfig*"查找你的架构对应的默认配置文件。在arch/arm/configs找到自己板子的默认配置文件。执行defconfig文件: make XXX_defconfig。XXX是你具体使用的板子型号。执行这一操作后,结果保存在.config文件。然后再执行make menuconfig命令。这时的配置就是在默认配置上稍加修改就可以了。
3.使用厂家的配置文件。如果你的硬件有厂家提供的config文件那是最轻松的。直接cp XXX .config。然后执行make menuconfig。
make menuconfig后会出来一个图形化界面,手动配置内核,一般进行驱动开发,会在这里选择,要把哪些驱动包含进内核,是直接编译进内核,还是编译成模块.ko文件,Y表示编译进内核,N表示不包含,M表示编译成模块
对于ARCH变量可以在执行 make时传入,如"make ARCH=arm s3c2410_defconfig"
以第二种方法为例:
执行命令 make ARCH=arm s3c2410_defconfig 后,生成了.comfig文件
接着执行 make menuconfig,出现图形化配置界面:
要配置某个驱动,上面有介绍怎么配置,移动到某个选项,按大写“Y”就显示[*],表示编译进内核;按大写“M”就显示[M],表示编译成模块;按大写“N”就显示[],表示不编译该文件。如下图
配置完成后,执行 make 或者 make uImage 编译生成Linux内核镜像文件uImage。
下一节学习下,Linux内核启动过程
参考 《嵌入式Linux应用开发完全手册》
参考:http://www.cnblogs.com/CrazyCatJack/p/6121231.html