目标:
分析make menuconfig内核配置过程
在上1小结中(内核编译试验)讲到了3种不同的配置:
(1)通过make menuconfig 直接从头到尾配置.config文件
(2) 通过make s3c2410_deconfig 命令在默认的配置上进行自动修改.config文件
(3)使用厂家提供的配置config_ok文件覆盖.config文件
所以,所有的配置结果都是配置.config文件
1 在linux下通过vi指令查看.config内核配置文件
如上图所示:就是一堆配置项: CONFIG_XXX=y/CONFIG_XXX=m/ CONFIG_XXX=n
=y:表示编进内核
=m:表示编译成模块,提供动态加载
=n:表示不参与编译
输入grep “CONFIG_DM9000” -nwR
(grep指令详细介绍入口链接http://www.cnblogs.com/lifexy/p/7009706.html)
可以看到4个地方在使用它
(1) include/linux/autoconf.h中定义宏DM9000
include/linux/autoconf.h:129:#define CONFIG_DM9000 1
然后通过vi include/linux/autoconf.h得到,不管menuconfig中是y/m/n, autoconf.h所有宏都等于1,供C源码使用
(2)在C源码里通过判断autoconf.h的宏DM9000
arch/arm/plat-s3c24xx/common-smdk.c:46:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/plat-s3c24xx/common-smdk.c:162:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
arch/arm/plat-s3c24xx/common-smdk.c:250:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
(3)在include/config/auto.conf中设置COMFIG_DM9000=y,供./drivers/net/ Makefile使用
include/config/auto.conf:128:CONFIG_DM9000=y
通过vi include/config/auto.conf如下图可以看出,和.config配置文件非常相似, 它被顶层Makefile包含,被子目录Makefile使用
(4)在./drivers/net/ 子目录Makefile中添加DM9000文件到obj-$(CONFIG_DM9000)中,其中CONFIG_DM9000=y,所以编译进内核中.
drivers/net/Makefile:197:obj-$(CONFIG_DM9000) += dm9dev9000c.o
drivers/net/Makefile:198:#obj-$(CONFIG_DM9000) += dm9000.o
drivers/net/Makefile:199:#obj-$(CONFIG_DM9000) += dm9ks.o
因为, 当make uImage编译内核刚开始时,内核会根据.config自动生成auto.conf和autoconf.h这两个文件( 其中autoconf.h是供c源码使用(宏开关),而auto.conf被顶层Makefile包含,供子目录Makefile使用)
2.通过子目录Makefile得出: 如果auto.conf中CONFIG_xxx=y,对应的源码文件会被Makefile编译进内核; 如果auto.conf中CONFIG_xxx=m,对应的源码文件会被Makefile编译成xxx.ko模块文件 如果auto.conf中CONFIG_xxx=n,对应的源码文件不会被makefile编译;
接下来分析Makefile来找到内核编译过程,明白make uImage做了什么