配置结果:生成一个.config文件。
以配置项:CONFIG_DM9000为例。
使用vim打开.config,搜索DM9000,可以看到CONFIG_DM9000=y,表示编译内核时DM9000会被链接,编入内核。
有一些参数等于m,表示编译后作为模块,不编入内核但可以动态加载这个模块。
使用grep “CONFIG_DM9000” * -nwR指令在全部文件中搜索CONFIG_DM9000。
可以看到,在以下四种地方可以搜索到CONFIG_DM9000。
- C源码:CONFIG_DM9000(主要是宏,在autoconf.h文件中定义)
- 子目录Makefile:drivers/net/Makefile
- include/config/auto.conf
- include/linux/autoconf.h(从文件名可以看出,是根据一些命令和.config自动生成的)
查看autoconf.h,发现在autoconf.h中,不论是定位为y还是m,在该文件中都被定义为1。
那么y和m的差别在哪里体现呢?
答:是在子目录的Makefile中体现的。之前有说过,y是会被链接进内核,m只是生成一个模块,需要的时候再动态加载,也就是说y和m都会被编译,只是一个是会被链接而另一个只是生成模块不被链接。
查看子目录的Makefile,可以看到一个obj-$(CONFIG_DM9000) += dm9dev9000c.o
先对obj做一个说明,如果子目录的Makefile中有以下两种语句的话,那么:
- obj-y += xxx.o,表示最后会被编译进内核;
- obj-m += yyy.o,表示yyy.c最后会被编译为可加载的模块yyy.ko;
也就是说,当CONFIG_DM9000 = y时,dm9dev9000c.c会被编译进内核;当CONFIG_DM9000 = m时,dm9dev9000.c会被编译为可加载的模块。
那么,这个CONFIG_DM9000 从哪里来?来源于auto.conf。
查看auto.conf,搜索DM9000,发现在这个文件中CONFIG_DM9000=y,那么这个等于y从哪里来呢?答:也是来源于.config。
显然,这个auto.conf要想起作用,是要被其他文件包含的,那么是什么文件包含的呢?
答:是顶层的Makefile包含的,顶层的Makefile包含了这个文件,同时也包含了其他子目录的Makefile,这样其他子目录的Makefile和auto.conf文件就联系起来了。
所以,当make uImage时:
- 根据.config文件,生成了autoconf.h,这个文件是在源代码中使用的,决定是否编译;
- 根据.config文件,还生成了auto.conf文件,这个文件是在Makefile中使用的,决定是否链接;