第3阶段——内核启动分析之make menuconfig内核配置(2)

目标:

分析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做了什么

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linux驱动

第3阶段——内核启动分析之make menuconfig内核配置(2)

目标: 分析make menuconfig内核配置过程 在上1小结中(内核编译试验)讲到了3种不同的配置: (1)通过make menuconfig 直接从头到...

2015
来自专栏乐沙弥的世界

ulimit: open files: cannot modify limit: Operation not permitted

      在从root用户切换到oracle用户时,碰到了ulimit: open files: cannot modify limit: Operation...

2592
来自专栏SDNLAB

ONOS1.3.0集群实验

1.环境准备与实验内容 本次集群安装准备了四台虚拟机: VM1:oxp@192.168.0.71 VM2:oxp@192.168.0.72 VM3:oxp@19...

2766
来自专栏移动安全

移动安全-应用加固命令行工具jar包使用说明

为方便用户快速集成到自动化任务中,乐固加固推出命令行工具。该工具是一个jar包(支持基础版、专业版、企业版),提供上传apk、下载加固包功能。下载的加固包需要用...

5898
来自专栏黑白安全

PHP文件包含漏洞总结

PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码...

1133
来自专栏向治洪

android定义新的api解决一些低版本不能运行的问题

Android Call requires API level 11 (current min is 8)的解决方案 【错误描述】     在用Eclipse开...

1716
来自专栏java思维导图

提高效率,eclipse上你可能不知道的技巧

一张思维导图 ? 公众号回复“eclipse技巧”可下载源导图 1、控制台(console )日志输出另保存 经常会遇到这种情况,习惯性的清掉控制台上的输出日志...

2786
来自专栏idba

一款基于go语言的agent

一 介绍 在构建数据库自动化运维系统的时候,数据库服务器上必须要有一个agent来执行web服务器端发起的命令,我们研究了好几种技术Celery,Redis ...

1120
来自专栏Golang语言社区

Golang语言--日志库glog解析

glog简介 glog是著名的google开源C++日志库glog的golang版本,glog是一个轻量级的日志库,上手简单不需要配置文件并且稳定高效,但是可以...

4406
来自专栏酷玩时刻

10分钟用Jitpack发布开源库

项目开发中无论Java web 还是Android 都会用到很多开源库,他们一般通过Maven/Gradle依赖进来的。

963

扫码关注云+社区