内容来自 韦东山《嵌入式Linux应用开发完全手册》
在内核日录下执行“make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-”时,就会看到一个如图16.3所示的菜单,这就是内核的配置界面。通过配置界面,可以选择芯片类型、选择需要支持的文件系统,去除不需要的选项等,这就称为“配置内核”。注意,也有其他形式的配置界面,比如“make config”命令启动字符配置界面,对于每个选项都会依次出现一行提示信息,逐个回答;“make xconfig”命令启动X-windows图形配置界面。
所有配置工具都是通过读取arch/$(ARCH)/Kconfig文件来生成配置界面,这个文件是所有配置文件的总入口,它会包含其他目录的Kconfig文件。配置界面如图16.3所示。
内核源码每个子日录中,都有一个Makefile文件和Kconfig文件。Makefile的作用前面已经讲述,Kconfig用于配置内核,它就是各种配置界面的源文件。内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件.config。
内核的配置界面以树状的菜单形式组织,主菜单下有若干个子菜单,子菜单下又有子菜单或配置选项。每个子菜单或选项可以有依赖关系,这些依赖关系用来确定它们是否显示。只有被依赖项的父项已经被选中,子项才会显示。
Kconfig文件的语法可以参考Documentation/kbuild/kconfig-language.txt文件,下面讲述几个常用的语法,并在最后介绍菜单形式的配置界面操作方法。
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
"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行的变量类型外,其他信息都是可以省略的。
menu条目用于生成菜单,格式如下:
"menu"
它的实际使用并不如它的标准格式那样复杂,下面是一个例子。
menu"Floating point emulation"
config FPE_NWFPE
...
config FPE_NWEPE_XP
...
endmenu
menu之后的字符串是菜单名,“menu”和“endmenu”之间有很多config条目。在配置界面上会出现如下字样的菜单,移动光标选中它后按回车键进入,就会看到这些config条目定义的配置选项。
Floating point emulation--->
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)。
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
source条目用于读入另一个Kconfig文件,格式如下:
"source"
下面是一个例子,取自arch/arm/Kconfig文件,它读入net/Kconfig文件。
source "net/Kconfig"
配置界面的开始几行就是它的操作方法,如图16.4所示。
内核scripts/kconfig/mconfc文件的注释给出了更详细的操作方法,讲解如下。
一些特定功能的文件可以直接编译进内核中,或者编译成一个可加载模块,或者根本不使用它们。还有一些内核参数,必须给它们赋一个值:十进制数、十六进制数,或者一个字符串。配置界面中,以[*]、
要修改配置选项,先使用方向键高亮选中它,按
上/下方向键用来高亮选中某个配置选项,如果要进入某个子菜单,先选中它,然后按回车键进入。配置选项的名字后有“>”表示它是一个子菜单。配置选项的名称中有一个高亮的字母,它被称为“热键”(hotkey),直接输入热键就可以选中该配置选项,或者循环选中具有相同热键的配置选项。
可以使用翻页键
按
要想阅读某个配置选项的帮助信息,选中它之后,再选中
对于choise条目中的多个配置选项,使用方向键高亮选中某个配置选项,按或空格键选中它:也可以通过输入配置选项的首字母,然后按或空格键选中它。
对于int、hex或string类型的配置选项,要输入它们的值时,先高亮选中它,按回车键,输入数据,再按回车键。对于十六进制数据,前缀0x可以省略。
配置界面的最下面,有如下两行:
Load an Alternate Configuration File
Save an Alternate Configuration File
前者用于加载某个配置文件,后者用于将当前的配置保存到某个配置文件中去。需要注意的是,如果不使用这两个选项,配置的加载文件、输出文件都默认为.config文件;如果加载了其他的文件(假设文件名为A),然后在它的基础上进行修改,最后退出保存时,这些变动会保存到A中去,而不是.config。
当然,可以先加载(Load an Alternate Configuration File)文件A,然后修改,最后保存(Save an Alternate Configuration File)到.config中去。