1_5.3.2_内核配置裁剪及启动流程_内核启动流程分析之配置_P

配置结果:生成一个.config文件

以配置项:CONFIG_DM9000为例。

使用vim打开.config,搜索DM9000,可以看到CONFIG_DM9000=y,表示编译内核时DM9000会被链接,编入内核。
在这里插入图片描述

有一些参数等于m,表示编译后作为模块,不编入内核但可以动态加载这个模块。
在这里插入图片描述

在这里插入图片描述
使用grep “CONFIG_DM9000” * -nwR指令在全部文件中搜索CONFIG_DM9000。

可以看到,在以下四种地方可以搜索到CONFIG_DM9000。

  1. C源码:CONFIG_DM9000(主要是宏,在autoconf.h文件中定义)
  2. 子目录Makefile:drivers/net/Makefile
  3. include/config/auto.conf
  4. 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时:

  1. 根据.config文件,生成了autoconf.h,这个文件是在源代码中使用的,决定是否编译;
  2. 根据.config文件,还生成了auto.conf文件,这个文件是在Makefile中使用的,决定是否链接;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值