内核配置和编译
Posted linux-37ge
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核配置和编译相关的知识,希望对你有一定的参考价值。
一. 相关重要文件
1.1. Kconfig
1.1.1. 什么是kconfig文件
a. Kconfig文件分布在各目录下构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单(描述了Menuconfig的内容)
1.1.2. Kconfig的格式
1.1.2.1. Kconfig按照一定的格式来书写,menuconfig程序可以识别这种格式,然后从中提取出有效信息组成menuconfig中的菜单项。
1.1.2.2. 将来在做驱动移植等工作时,有时需要自己添加Kconfig中的一个配置项来将某个设备驱动添加到内核的配置项目中,这时候就需要对Kconfig的配置项格式有所了解,否则就不会添加。
1.1.2.3. #开头的行是注释行
1.1.2.4. menuconfig表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)、config表示菜单中的一个配置项(本身并没有子菜单下的项目)。
1.1.2.5. menuconfig或者config后面空格隔开的大写字母表示的类似于 NETDEVICES 的就是这个配置项的配置项名字,这个字符串前面添加CONFIG_后就构成了.config中的配置项名字。
1.1.2.6. 一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。
1.1.2.7. 内核源码目录树中每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。这个也告诉我们:如果你自己在linux内核中添加了一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件。
1.1.2.8. tristate和bool的含义
a. tristate意思是三态(3种状态,对应Y、N、M三种选择方式),
b. bool是要么真要么假(对应Y和N)
1.1.2.9. depends的含义
a. depends中文意思是“取决于”或者“依赖于”,所以depends在这里的意思是:本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。
b. depends项目会导致make menuconfig的时候找不到一些配置项。所以你在menuconfig中如果找不到一个选项,但是这个选项在Kconfig中却是有的,则可能的原因就是这个配置项依赖的一个配置项是不成立的。
c. depends并不要求依赖的配置项一定是一个,可以是多个,而且还可以有逻辑运算。这种时候只要依赖项目运算式子的裸机结果为真则依赖就成立。
1.1.2.10. select:表示depends on的值有效时,下面的select也会成立,将相应的内容选上。
1.1.2.11.default:表示depends on的值有效时,下面的default也会成立,将相应的选项选上,有三种选项,分别对应y,n,m。
1.1.2.12. help: 帮助信息,告诉我们这个配置项的含义,以及如何去配置他。
1.2. .config
1.2.1. 什么是.config
a. .config以.开头,是一个隐藏文件,因此平时是看不到的,需要ls -a来看
b. 当我们make distclean后(也就是说默认情况下)是没有.config文件的,我们配置的两步过程就是为了得到内容合适的.config文件
c. .config文件是linux内核在编译过程中很重要的一个文件,其作用类似与uboot中的include/configs/x210_sd.h,内核在编译过程中会读取.config中的配置项,并且用这些配置项去指导整个编译链接过程。
d. .config文件的格式类似于脚本文件,其中内容为类似于于:CONFIG_ARM=y的一个一个的配置项。这些配置项就类似于脚本文件中定义的一个一个变量,所以这一行可以被理解为定义了一个变量CONFIG_ARM,这个变量的值为y。
e. .config文件中每一行都是一个配置项,从.config文件的规模可以看出linux内核的可配置项有两三千个。所以linux内核是高度可配置的,而且linux内核的所有配置项很难全部搞明白。因为linux内核的配置项太多太繁杂超出了人的大脑能够记忆和处理的数量级,因此linux内核不像uboot那样直接手工配置,而是发明了一个图形化的配置工具menuconfig。
1.3. Makefile
a. 关于Makefile见之前博客简介,linux中Makefile和uboot作用相识,也是用于指导编译,链接
二. 配置流程
2.1. make distclean
a. make distclean要清除之前所有生成的文件,主要是清除.config。
2.2. make xxx_defconfig
2.2.1. make xxx_defconfig作用
a. make x210ii_qt_defconfig其实相当于:cp arch/arm/configs/x210ii_qt_defconfig .config
b. arch/arm/configs目录下的这么多个xxx_defconfig哪里来的?其实这些文件都是别人手工配置好适合一定的开发板的.config文件后自己把.config文件保存过去的。譬如说我们用S5PV210这个SoC,针对这个SoC的开发板的最初配置肯定是三星的工程师去做的。
2.3. make menuconfig
2.3.1. make menuconfig原理
2.3.1.1. menuconfig本身由一套软件支持
a. linux为了实现图形化界面的配置,专门提供了一套配置工具menuconfig。
b. ncurses库是linux中用来实现文字式的图形界面,linux内核中使用了ncurses库来提供menuconfig
c. scriptskconfiglxdialog目录下的一些c文件就是用来提供menuconfig的那些程序源代码。
2.3.2. menuconfig内容来源
2.3.2.1. menuconfig读取Kconfig文件获取具体内容
a. menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑(譬如在menuconfig中通过上下左右箭头按键来调整光标,Enter ESC键等按键按下的响应),而并不负责提供内容(菜单里的项目)。
b. menuconfig显示的菜单内容(一方面是菜单的目录结构,另一方面是每一个菜单项目的细节)是由内核源码树各个目录下的Kconfig文件来支持的。Kconfig文件中按照一定的格式包含了一个又一个的配置项,每一个配置项在make menuconfig中都会成为一个菜单项目。而且menuconfig中显示的菜单目录结构和源码目录中的Kconfig的目录结构是一样的。
2.3.3. menuconfig进行内容配置
a. menuconfig的菜单内容来自于Kconfig文件,但是每一个菜单的选择结果(Y、N、M)却不是保存在Kconfig文件中的。Kconfig文件是不变的,Kconfig文件只是决定有没有这个菜单项,并不管这个菜单项的选择结果。
b. menuconfig工作时在我们make menuconfig打开时,他会读取.config文件,并且用.config文件中的配置选择结果来初始化menuconfig中各个菜单项的选择值。
c. 当我们配置完menuconfig并保存,则会将我们更改过的配置重新写入.config文件中记录,下一次再次打开make menuconfig时会再次加载.config,最终去编译内核时编译连接程序会考虑.config中的配置值指导整个编译连接过程。
三. 总结
3.1. menuconfig和.config的关系
a. make menuconfig时,会读取.config中的配置值来初始化menuconfig中的配置项。
b. menuconfig中修改了(按Y、N、M)配置项的值,然后退出时保存,则这个保存结果会修改.config文件中的相应行。
3.2. menuconfig和Kconfig的关系
a. menuconfig读取Kconfig的内容作为菜单项目内容。
3.3. 验证验证menuconfig和Makefile的关系
a. Makefile里面的条件编译是由.config中的宏决定的,而.config中的宏是否被注释又是有make menuconfig中选择决定的,而make menuconfig中的是否存在这个配置选项则是由Kconfig决定的,由此串联起来了四者的关系
参考《朱老师.2.15.内核的配置和编译原理》
以上是关于内核配置和编译的主要内容,如果未能解决你的问题,请参考以下文章