引言:内核配置生成了 .config
文件,那么这个文件都做了什么?
一、分析过程
我们从网卡的配置,来分析:
vim ./config
/dm9000
593 #
594 # Ethernet (10 or 100Mbit)
595 #
596 CONFIG_NET_ETHERNET=y
597 CONFIG_MII=y
598 # CONFIG_SMC91X is not set
599 CONFIG_DM9000=y
600 # CONFIG_CS89x0 is not set
601 # CONFIG_NET_POCKET is not set
602 CONFIG_NETDEV_1000=y
603 CONFIG_NETDEV_10000=y
CONFIG_DM9000=y
等于y说明对网卡的支持编译进内核;
如果等于m,会编译成模块,动态加载,相当于驱动。
grep "CONFIG_DM9000" * -nwr
就可以看到哪些config文件配置了网卡,有哪些文件有配置网卡呢?
1、c源码
arch/arm/plat-s3c24xx/common-smdk.c:46:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
…
2、子目录里的makefile文件
drivers/net/Makefile:197:obj-KaTeX parse error: Expected 'EOF', got '#' at position 59: …t/Makefile:198:#̲obj-(CONFIG_DM9000) += dm9000.o
3、include/config/auto.conf
4、include/linux/autoconf.h
c源码文件里的宏是在include/linux/autoconf.h里定义的
autoconf.h这个文件是自动生成,里面的内容来源于.config;
我们查看autoconf.h,里 #define CONFIG_DM9000 1 将DM9000定义为1,那么y和m是在哪里定义的呢?
我们查看下drivers/net/Makefile
补充一个知识点,子目录下的makefile文件
obj -y += xxx.o 则xxx.c文件最后会被编译进内核;
obj -m += yyy.o 则yyy.c文件最后会被编译成可加载的模块 ==> yyy.ko。
198 #obj-$(CONFIG_DM9000) += dm9000.o
199 #obj-$(CONFIG_DM9000) += dm9ks.o
因此如果CONFIG_DM9000=y 就会编译进内核;CONFIG_DM9000=m 就会编译成可加载的模块。
那么CONFIG_DM9000=y还是=m是在哪里定义?
在include/config/auto.conf这个文件里定义的,说明这个文件也是自动生成的,被顶层makefile包含。
二、从分析过程整理出.config文件都做了什么
make uImage是都会发生什么?
生成的.config 会自动生成autoconf.h和auto.conf ;其中autoconf.h被c源代码使用),auto.conf(包含在顶层makefile)。