linux内核配置原理

linux内核配置的关键是得到.config文件。

(1).config以 . 开头,是一个隐藏文件,平时看不到,需要使用ls -a查看

(2)默认情况下(或执行make distclean以后)是没有.config文件的,配置的两步就是为了得到内容合适的.config文件。

(3).config文件是linux内核在编译过程中很重要的一个文件,其作用类似于uboot中的include/configs/x210_sd.h,内核在编译过程中会读取.config中的配置项,并且用这些配置项去知道整个编译链接过程。

(4).config文件的格式类似于脚本文件,其中的内容是类似于CONFIG_XXX=y的一个个的配置项。这些配置项就类似于脚本文件中定义的一个个变量。所以就可以理解为定义了一个变量CONFIG_XXX,这个变量的值为y

(5).config文件中每一行都是一个配置项,从.config文件的规模可以看出linux内核的可配置项有两三千个,所以linux内核是高度可配置的。而且linux内核的配置项很难全部搞明白,因为linux内核的配置项太多太繁杂,超出了人的大脑能够记忆和处理的数量级,因此linux内核不像uboot那样可以直接手工配置,而是发明了一个图像化的配置工具menuconfig。

 

make xx_defconfig和make menuconfig相互配合

(1)第一步的make xx_defconfig解决了大部分配置项(99%的配置项已经正确),接下来就是对个别不同的针对自己的开发板进行细节调整,细节调整就是通过make menuconfig来完成。

(2)make xx_defconfig这一步其实是参考别人已经做好的,这样做有很多好处:减少很多工作量,避开了很多自己不同的配置项(例如内存管理、调度系统等模块的配置),只管需要管的。

(3)make menuconfig其实就是读取第一步得到的.config,然后提供一个图像化界面,这样可以更加容易地找到要修改的配置项,然后修改它。

总结:两步结合的配置方式就是为了对.config文件中的两三千个配置项做合适的配置,当然如果记忆里足够好,大脑足够厉害,也可以手工去书写/配置.config文件来完成内核配置,只要.config文件的内容是正确的,就不会印象编译过程。

 

make xx_defconfig到底做了什么

(1)make x210ii_qt_defconfig其实相当于:cp arch/arm/configs/x210ii_qt_defconfig .config

(2)arch/arm/configs目录下的这么多个xxx_defconfig哪里来的?其实这些文件都是别人配置好适合某个开发板的.config文件后,将.config文件保存过去的。例如这里的S5PV210开发板的这个SoC,针对这个SoC的开发板的最初配置肯定是三星工程师做的。

 

menuconfig的使用

1.基本用法

menuconfig中操作相关的几个按键:Enter、Esc、上下左右、/、?

Enter    --->    选中并执行Select、Exit、Help

Esc      --->    返回上一层

上下     --->    在选择项菜单中目录浏览时上下翻

左右     --->    在菜单选项(Select、Exit、Help)间切换

/           --->    搜索

?        --->    帮助

2.用法翻译

箭头键导航菜单。<Enter>选择子菜单--->。突出显示的字母是热键。按<Y>包括、按<N>排除、按<M>模块化特性。按<Esc><Esc>退出,<?>表示帮助,</>表示搜索。说明:[ * ] 编入、[ ] 排除;< M > 模块化、< > 空

注:[ ]不可以模块化,< >才可以模块化。

3.说明

linux内核中一个模块有三种编译方法:一种是编入、一种是去除、一种是模块化。所谓编入就是将这个模块的代码直接编译链接到zImage中去,去除就是将这个模块不编译链接到zImage中去,模块化是将这个模块编译但是不会链接到zImage中,会将这个模块单独链接成一个内核模块.ko文件,将来linux系统内核启动起来后可以动态的加载或卸载这个模块。

 

menuconfig的工作原理及menuconfig与Kconfig、.config的关系

1.menuconfig本身由一套软件支持

(1)linux为了实现图形化界面的配置,专门提供了一条配置工具menuconfig。

(2)ncurses库是linux中用来实现文字式的图形界面,linux内核中使用了ncurses库来提供menuconfig。

(3)scripts/kconfig/lxdialog目录下的一些C文件就是用来提供menuconfig的那些程序源代码的。

2.menuconfig读取Kconfig文件

(1)menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑(例如在menuconfig中通过上下左右键来调整光标等),并不负责提供内容(菜单里的项目)。

(2)menuconfig显示的菜单内容(一方面是菜单的目录结构,另一方面是每一个菜单项目的细节)是由内核源码树各个目录下的Kconfig文件来支持的。Kconfig文件中按照一定的格式包含了一个又一个的配置项,每一个配置项在make menuconfig中都会成为一个菜单项目。而且menuconfig中显示的菜单目录结构和源码目录中的Kconfig的目录结构是一样的。

(3)在相应的Kconfig文件中删除一个config项,则再次make menuconfig时这个项目已经看不到了。

3.menuconfig读取/写入.config文件

(1)上面已经知道menuconfig的菜单内容来自于Kconfig文件,但是每一个菜单的选择结果(Y、N、M)却不是保存在Kconfig文件中的。Kconfig文件是不变的,Kconfig文件只是决定有没有这个菜单项,并不管这个菜单项的选择结果。

(2)在make menuconfig后,menuconfig会读取.config文件,并且用.config文件中的配置选择结果来初始化menuconfig中各个菜单项的选择值。

总结:菜单项的项目内容从Kconfig文件来,菜单项的选择值从.config文件来。

(3)当退出menuconfig时,menuconfig会首先检查有没有更改某些配置项的值,如果本次没有更改过任意一个配置项的值,那么直接退出;如果有改动,那么会提示是否保存。如果此时点保存,会将更改过的配置重新写入.config文件中记录,下一次再次打开menuconfig时,会再次加载.config,最终编译内核时编译链接程序会考虑.config中的配置值直到整个编译链接过程。

 

Kconfig文件详解

Kconfig按照一定的格式来书写,menuconfig程序可以识别这种格式,然后从中提取出有效信息组成menuconfig中的菜单项。

在做驱动移植工作时,有时需要添加Kconfig中的一个配置项来将某个设备驱动添加到内核的配置项目中,这时候就需要对Kconfig的配置格式有所了解,否则就不会添加。

1.#开头的行是注释行

2.menuconfig表示菜单(本身属于一个菜单中的项目,但是又有子菜单项目),config表示菜单中的一个配置项(本身并没有子菜单下的项目)。

3.menuconfig或者config后面用空格隔开的大写字母组成的字符串(比如NET)就是这个配置项的名字,这个字符串前面添加CONFIG_就构成了.config中的配置项的名字。

4.一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。

5.内核源码目录树中每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证所有的Kconfig项目都被包含进menuconfig中。这个也说明:如果在linux内核中添加一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件。

6.tristate和bool的含义:tristate的意思是三态(3种状态,对应Y、N、M三种选择方式),bool是真假(对应Y、N),所以tristate的意思是这个配置项可以被三种选择,bool的意思是这个配置项只能被两种选择。

7.depends的含义

(1)depends的中文意思是“取决于”或者“依赖于”,所以depends在这里的意思是:本配置项依赖于另一个配置项。如果那个配置项为Y或者M,则本配置项才有意义;如果依赖的那个配置本身被设置为N,则本配置项根本没有意义。

(2)depends项会导致make menuconfig的时候找不到一些配置项,所以如果在menuconfig中找不到一个配置项,而这个配置项在Kconfig中却是有的,则可能的原因就是这个配置项依赖的另一个配置项是不成立的。

(3)depend并不要求依赖的配置项一定是一个,可以是多个,而且还能有逻辑运算,这种时候只要依赖项的运算的逻辑结果为真则逻辑成立。

8.help:帮助信息,告诉我们这个配置项的含义,以及如何去配置它。

 

Kconfig、.config与Makefile三者的关联

1.配置项被配置成Y、N、M会影响.config文件中的CONFG_XXX变量的配置值

2.这个.config文件中的配置值(=y、=m、无)会影响最终的编译链接过程。如果=y则会被编入(build-in),如果=m会被单独链接成一个ko模块,如果无则对应的代码不会被编译,那这是怎么实现的呢?都是通过Makefile实现的。

3.obj-$(CONFIG_DM9000) += dm9000.o:如果CONFIG_DM9000变量值为y,则obj += dm9000.o,因此dm9000.c会被编译;如果CONFIG_DM9000变量未定义,则dm9000.c不会被编译;如果CONFIG_DM9000变量值为m,则会被链接成ko模块(这个是在linux内核的Makefile中定义的规则)。

总结:把menuconfig中的菜单项、Kconfig中的配置项、.config中的一行、Makefile中的一行这4个东西结合起来理解,那么整个的linux内核配置体系就明了了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值