编译linux内核时.config ,Kconfig, make menuconfig的联系

我们在编译linux内核时都会用到几个文件 .config文件 Kconfig文件 Makefile文件以及make menuconfig命令出现的菜单,那他们之间有什么联系呢?

首先,Makefile文件不用多讲,这是linux内核的编译文件,使用make uImage或make zImage时就是用Makefile文件来编译的。

对于make menuconfig来讲,这是一个菜单配置内核文件,菜单文件中主要包括下面几种情况

(1)[ ] 方括号类型
按下空格键来选择,
*     <====>   y    如果选择为y,则代表该配置选项(功能)被编译进内核
make uImage      (led.c驱动要放在对应目录中)

空格           不选
(2)< >  尖括号类型

                               有三种状态  *代表选中    没有*代表未选中    M代表模块
M     <====>   M    编译成模块 ,没有编译成内核。使用时可以通过make modules 生成.ko文件,然后手动加载。   
         (3)( )
圆括号类型

          某个小括号可能存放了十进制整数,也可能存放十六进制整数,还有可能存放字符串。

编译linux内核时.config ,Kconfig, make menuconfig的联系

上图是make menuconnfig中字符驱动下的菜单显示


Kconfig和make menuconfig是一一对应的。源码下有多个Kconfig文件,对应make menuconfig中的每一页。我们看一下源码下的Kconfig

编译linux内核时.config ,Kconfig, make menuconfig的联系

和主菜单(下图)实际上是一样的,最后一行是包含的目录,这样就可以继续向下寻找了。

编译linux内核时.config ,Kconfig, make menuconfig的联系

简单了解一下在Kconfig中的语法规则,我们来看一下驱动中字符设备中的Kconfig

编译linux内核时.config ,Kconfig, make menuconfig的联系

菜单中对应如下

编译linux内核时.config ,Kconfig, make menuconfig的联系


首先是

第一行 config  XXXXXXX 打头的,这里的XXXXXX是要和.config配合使用的

第二行 是对应刚才说的[] <> ()三种类型以及显示在menu中名字,

             bool 对应[]

             tristate 对应<>  triple state 三态的简称

             string 对应()

             后面引号中跟着的是显示在menu中信息

第三行 设置一下默认值 y代表是选中 n为不选中

第四行 可以添加一些帮助信息给用户显示

要添加一个模块,就根据类似写法在Kconfig中添加 就能在make menuconfig中显示了。

对于.config属于内核的配置文件,我们来看一看对应的字符驱动

编译linux内核时.config ,Kconfig, make menuconfig的联系

之前说到Kconfig中的第一行会和.confi*生联系,.config中会自动在Kconfig中起的名字前加上大写的CONFIG_。y表示选中。这个配置是如何起作用的呢?

我们来看看对应驱动字符设备的Makefile

编译linux内核时.config ,Kconfig, make menuconfig的联系

是否编译对应文件 就看CONFIG_XXXXX设置为何值了。

添加一个模块 要在两个地方进行添加,1是在对应文件的Kconfig中添加,然后就进入make menuconfig中设置,设置完.config中就自动有了对应的配置。2然后在对应的Makefile中进行编译配置。