Linux内核移植之二:Kconfig分析

内容来自 韦东山《嵌入式Linux应用开发完全手册》

 

        在内核日录下执行“make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-”时,就会看到一个如图16.3所示的菜单,这就是内核的配置界面。通过配置界面,可以选择芯片类型、选择需要支持的文件系统,去除不需要的选项等,这就称为“配置内核”。注意,也有其他形式的配置界面,比如“make config”命令启动字符配置界面,对于每个选项都会依次出现一行提示信息,逐个回答;“make xconfig”命令启动X-windows图形配置界面。

        所有配置工具都是通过读取arch/$(ARCH)/Kconfig文件来生成配置界面,这个文件是所有配置文件的总入口,它会包含其他目录的Kconfig文件。配置界面如图16.3所示。

Linux内核移植之二:Kconfig分析_第1张图片

        内核源码每个子日录中,都有一个Makefile文件和Kconfig文件。Makefile的作用前面已经讲述,Kconfig用于配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。

        内核的配置界面以树状的菜单形式组织,主菜单下有若干个子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项可以有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖项的父项已经被选中,子项才会显示。

        Kconfig文件的语法可以参考Documentation/kbuild/kconfig-language.txt文件,下面讲述几个常用的语法,并在最后介绍菜单形式的配置界面操作方法。

1.Kconfig文件的基本要素:config条目(entry)

        config条目常被其他条目包含,用来生成菜单、进行多项选择等。

        config条目用来配置一个选项,或者这么说,它用于生成一个变量,这个变量会连同它的值一起被写入配置文件.config中。比如有一个config 条目用来配置CONFIG_LEDS_S3C24XX,根据用户的选择,.config文件中可能出现下面3种配置结果中的一个。

CONFTG_LEDS_S3C24XX=y  #对应的文件被编进内核
CONEIG_LEDS_S3C24XX=m  #对应的文件被编成模块
#CONFIG_LEDS_S3C24xx   #对应的文件没有被使用

        以一个例子说明config条目格式,下面代码选自fs/Kconfig文件,它用于配置CONFIG JFFS2FS POSIX_ACL选项。

1255 config JFFS2_FS_POSIX_ACL
1256 bool"JFFS2 POSIX Access Control Lists"
1257 depends on JFFS2_FS_XATTR
1258 default y
1259 select FS_POSTX_ACL
1260 help
1261 posix Access Control Lists(ACLs)support permissions for users and
1262 groups beyond the owner/group/world scheme.
1263
1264 To learn more about Access Control Lists,visit the Posix ACLs for
1265 Linux website .
1266
1267 If you don't know what Access Control Lists are,say N
1268

        代码中包含了几乎所有的元素,下面一一说明。

        第1255行中,config是关键字,表示一个配置选项的开始:紧跟着的JFFS2_FS POSIXACL是配置选项的名称,省略了前缀“CONFIG_”。

        第1256行中,boot表示变量类型,即CONFIG_JFFS2_FS_POSIX_ACL的类型。有5种类型:bool、tristate、string、hex和int,其中的tristate和string是基本的类型,其他类型是它们的变种。boot变量取值有两种:y和n;tristate变量取值有3种:y、n和m;string变量取值为字符串:hex变量取值为十六进制的数据;int变量取值为十进制的数据。

     “boot”之后的字符串是提示信息,在配置界面中上下移动光标选中它时,就可以通过按空格或回车键来设置CONFIGJFFS2_FSPOSIXACL的值。提示信息的完整格式如下,如果使用“if ”,则当expr为真时才显示提示信息。在实际使用时,prompt 关键字可以省略。

"prompt"["if"]

        第1257行表示依赖关系,格式如下。只有JFFS2_FSXATTR配置选项被选中时,当前配置选项的提示信息才会出现,才能设置当前配置选项。注意,如果依赖条件不满足,则它取默认值。

"depends on"/"requires"

        第1258行的表示默认值为y,格式如下:

"default"["if"]

        第1259行表示当前配置选项FFS2FSPOSIX_ACL被选中时,配置选项FS_POSIXACL也会被自动选中,格式如下:

"select"["if"]

        第1260行表示下面几行是帮助信息,帮助信息的关键字有如下两种,它们完全一样。当遇到一行的缩进距离比第一行帮助信息的缩进距离小时,表示帮助信息已经结束。比如第1268行的缩进距离比第126的缩进距离小,帮助信息到第1267行结束。

“help"or"---help---"

        注意除第1255行的关键字及配置选项的名称、第256行的变量类型外,其他信息都是可以省略的。

2.menu条目

        menu条目用于生成菜单,格式如下:

"menu"


"endmenu"

        它的实际使用并不如它的标准格式那样复杂,下面是一个例子。

menu"Floating point emulation"
config FPE_NWFPE 
...
config FPE_NWEPE_XP 
...
endmenu 

        menu之后的字符串是菜单名,“menu”和“endmenu”之间有很多config条目。在配置界面上会出现如下字样的菜单,移动光标选中它后按回车键进入,就会看到这些config条目定义的配置选项。

Floating point emulation--->

 

3.choice条目

         choice条目将多个类似的配置选项组合在一起,供用户单选或多选,格式如下:

"choice"


"endchoice"

         实际使用中,也是在“choice”和“endchoice”之间定义多个config条目,比如arch/arm/Kconfig中有如下代码:

choice 
    prompt"ARM system type"
    default ARCH_VERSATILE 
config ARCH_AAEC2000
...
config ARCH_INTEGRATOR 
...
endchoice 

        prompt"ARM system type”给出提示信息“ARM system type”,光标选中它后按回车键进入,就可以看到多个config条日定义的配置选项。

        choice条目中定义的变量类型只能有两种:bool和ristate,不能同时有这两种类型的变量。对于bool类型的choice条日,只能在多个选项中选择一个:对于tristate类型的choice条目,要么就把多个(可以是一个)选项都设为m;要么就像bool类型的choice条目一样,只能选择一个。这是可以理解的,比如对于同一个硬件,它有多个驱动程序,可以选择将其中之一编译进内核中(配置选项设为y),或者把它们都编译为模块(配置选项设为m)。

4.comment条目

        comment条目用于定义一些帮助信息,它在配置过程中出现在界面的第一行;并且这些帮助信息会出现在配置文件中(作为注释),格式如下:

"comment"

        实际使用中也很简单,比如arch/arm/Kconfig中有如下代码:

menu"Floating point emulation"
comment"At least one emulation must be selected"
...

        进入菜单“Floating point emulation-->”之后,在第一行会看到如下内容:

-—-At least one emulation must be selected

        而在.config文件中也会看到如下内容:

#At least one emulation must be selected

5.source条目

        source条目用于读入另一个Kconfig文件,格式如下:

"source" 

        下面是一个例子,取自arch/arm/Kconfig文件,它读入net/Kconfig文件。

source "net/Kconfig"

6.菜单形式的配置界面操作方法

        配置界面的开始几行就是它的操作方法,如图16.4所示。

Linux内核移植之二:Kconfig分析_第2张图片

        内核scripts/kconfig/mconfc文件的注释给出了更详细的操作方法,讲解如下。

        一些特定功能的文件可以直接编译进内核中,或者编译成一个可加载模块,或者根本不使用它们。还有一些内核参数,必须给它们赋一个值:十进制数、十六进制数,或者一个字符串。配置界面中,以[*]、或[]开头的选项表示相应功能的文件被编译进内核中、被编译成一个模块,或者没有使用。尖括号~表示相应功能的文件可以被编译成模块。

        要修改配置选项,先使用方向键高亮选中它,按键选择将它编译进内核,按键选择将它编译成模块,按-N>键将不使用它。也可以按空格键进行循环选择,例如:Y-N-M一Y。

        上/下方向键用来高亮选中某个配置选项,如果要进入某个子菜单,先选中它,然后按回车键进入。配置选项的名字后有“>”表示它是一个子菜单。配置选项的名称中有一个高亮的字母,它被称为“热键”(hotkey),直接输入热键就可以选中该配置选项,或者循环选中具有相同热键的配置选项。

        可以使用翻页键来移动配置界面中的内容。要退出配置界面,使用左/右方向键选中键或键退出。

        按键可以在