当我们执行make menuconfig
时,系统到底帮我们做了什么?
这里面一共涉及到了以下几个文件,下面我们逐个的讲解:
-
Linux内核根目录下的
scripts
文件夹 -
arch/$ARCH/Kconfig
文件、各层目录下的Kconfig
文件 -
Linux内核根目录下的
makefile
文件、各层目录下的makefile
文件 -
Linux内核根目录下的的
.config
文件、arch/$ARCH/
下的.config
文件 -
Linux内核根目录下的
include/generated/autoconf.h
文件
一、scripts
文件夹下存放的是跟make menuconfig
配置界面的图形绘制相关的文件,我们作为使用者无需关心这个文件夹的内容
二、当我们执行make menuconfig
命令出现蓝色配置界面以前,系统帮我们做了以下工作:
- 系统会读取
arch/$ARCH/
目录下的Kconfig
文件生成整个配置界面选项(Kconfig
是整个linux
配置机制的核心)
那么ARCH
环境变量的值等于多少呢?它是由linux内核
根目录下的makefile
文件决定的,在makefile
下有此环境变量的定义: 或者通过
make ARCH=arm menuconfig
命令来生成配置界面,默认生成的界面是所有参数都是没有值的.
比如教务处进行考试,考试科数可能有外语、语文、数学等科,这里相当于我们选择了arm科
可进行考试,系统就会读取arch/arm/Kconfig
文件生成配置选项。系统还提供了x86科
、mips科
等很多门功课的考试题。
三、假设教务处比较“仁慈”,还给我们准备了一份参考答案(默认配置选项),存放在arch/$ARCH/configs
下,对于arm科
来说就是arch/arm/configs
文件夹: 此文件夹中有许多选项,系统会读取哪个呢?
内核默认会读取linux内核根目录下.config
文件作为内核的默认选项(试题的参考答案),我们一般会根据开发板的类型从中选取一个与我们开发板最接近的系列到Linux内核根目录下(选择一个最接近的参考答案)
cp arch/arm/configs/s3c2410_defconfig .config
四、config
假设教务处留了一个心眼,他提供的参考答案并不完全正确(.config
文件与我们的板子并不是完全匹配),这时我们可以选择直接修改.config
文件然后执行make menuconfig
命令读取新的选项。
但是一般我们不采取这个方案,我们选择在配置界面中通过空格
、Esc
、回车
选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项(正确的参考答案)更新到.config
中,此时我们可以把.config
重命名为其它文件保存起来(当你执行make distclean
时系统会把.config
文件删除),以后我们再配置内核时就不需要再去arch/arm/configs
下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config
文件复制为.config
即可。
五、经过以上的步骤,我们就可以正确的读取、配置我们需要的界面了
那么他们如何跟makefile文件建立编译关系呢?
当你保存make menuconfig
选项时,系统除了会自动更新.config
外,还会将所有的选项以宏的形式保存在Linux内核根目录下的 include/generated/autoconf.h
文件下 内核中的源代码都会包含以上
.h
文件,根据宏的定义情况进行条件编译。当我们需要对一个文件有选择是否编译的功能时,还需要修改对应的makefile
文件,例如: 我们选择是否要编译
s3c2410_ts.c
这个文件时,makefile
会根据CONFIG_TOUCHSCREEN_S3C2410
来决定是编译此文件,此宏是在Kconfig
文件中定义,当我们配置完成后,会出现在.config
及autoconf.h
中。至此,以上列举出来的文件我们都已经提到了。
六、总结 最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig
、makefile
文件以及对应的源文件
。比如我们如果想要给内核增加一个功能,并且通过make menuconfig
控制其生成过程:
- 首先需要做的工作是:修改对应目录下的
Kconfig
文件,按照Kconfig
语法增加对应的选项 - 其次执行
make menuconfig
选择编译进内核或者不编译进内核,或者编译为模块,.config
文件和autoconf.h
文件会自动生成; - 最后修改对应目录下的
makefile
文件完成编译选项的添加 - 最后的最后执行
make zImage
命令进行编译