内核启动流程分析(二)配置详解

总体概述

配置详解

配置的最终目的,是生成了.config文件,查看下这个文件,

#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.22.6
# Wed Dec 30 18:30:33 2009
#
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_GENERIC_GPIO=y
# CONFIG_GENERIC_TIME is not set
# CONFIG_GENERIC_CLOCKEVENTS is not set
CONFIG_MMU=y
CONFIG_NO_IOPORT=y
CONFIG_GENERIC_HARDIRQS=y
.....
CONFIG_DM9000=y                 #来分析这个配置项目

其中都是一些xxx=y,yyy=m,zzz=一个数值等配置项这些,区别:若是=y的话,该项会被编译进内核;若是=m的话,该项会被编译为一个模块,这个模块以后可以动态加载。下面取其中一行 CONFIG_DM9000=y来分析,先搜索下包含CONFIG_DM9000文件内容

grep "CONFIG_DM9000" * -nwR

搜索后会发现含有“CONFIG_DM9000”配置项的文件主要是:

①c源码里有:CONFIG_DM9000

②子目录的Makefile(drivers/net/Makefile)里有:CONFIG_DM9000

③include/config/auto.conf里有:CONFIG_DM9000

④include/linux/autoconf.h里有:CONFIG_DM9000

这些文件之间以及与.config配置文件之间的关系是怎样的?下面逐一分析:

 

  • 1、忽略掉默认配置文件(以defconfig命名的),可以看到c代码含有CONFIG_DM9000,从c语言语法上可知CONFIG_DM9000应该是一个宏,这些宏肯定是在c文件中或者头文件中定义,这里的宏其实是来源于下面第4点中的include/linux/autoconf.h
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:200:#endif /* CONFIG_DM9000 */
arch/arm/plat-s3c24xx/common-smdk.c:250:#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
  • 2、子目录下的Makefile(drivers/net/Makefile)中含有CONFIG_DM9000,下面第4点中对于=Y和=M的差别体现不出来,其实这些差别是在这里的makefile(子目录下的makefile)中体现的,这里会区分是编译为模块(=M)还是编译为内核(=Y),这里子目录下的CONFIG_DM9000是在下面第3点include/config/auto.conf中定义的
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

插讲:子目录下的Makefile格式:

子目录的Makefile格式比较简单,一般都是obj_y += xxx.o或者obj_m += yyy.o,这表示该子目录下的xxx.c会被编译进内核去,yyy.c会被编译为yyy.ko作为一个可加载的模块。比如obj-$(CONFIG_DM9000) +=dm9dev9000c.o,若这里CONFIG_DM9000被第3点include/config/auto.conf定义为CONFIG_DM9000=y的话,则有obj-y +=dm9dev9000c.o,dm9dev9000c.c会被编译进内核。

 

  • 3、在include/config/auto.conf下含有CONFIG_DM9000,这个文件是自动生成的,内容很明显来源于.config,上面第2点中根据这个编译模块还是内核.这个文件会被顶层makefile包含,里面的内容最终会被第2点中子目录下的makefile拿来使用。
include/config/auto.conf:144:CONFIG_DM9000=y
  • 4、include/linux/autoconf.h里含有CONFIG_DM9000配置项,这个头文件是在make内核时,make机制根据.config自动产生的,它里面的内容来源于.config,在.config文件中不论配置项为=Y或者为=M(模块),在autoconf.h中这些配置项都被定义为1,autoconf.h被第1点中提到的源代码所使用,这里体现不出=M与=Y的区别,是在子目录下的Makefile中体现的。
include/linux/autoconf.h:145:#define CONFIG_DM9000 1
//该文件下的内容都是类似的如下
#define CONFIG_DM9000 1
#define CONFIG_SOLARIS_X86_PARTITION 1
#define CONFIG_SERIAL_NONSTANDARD 1
#define CONFIG_BLK_DEV_RAM_BLOCKSIZE 1024

转载:https://www.cnblogs.com/zongzi10010/p/10023694.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值