Linux内核源代码组织了一个配置系统,该配置系统可以生成内核配置菜单,方便内核配置。配置系统主要包含Makefile、Kconfig和配置工具,可以生成配置界面。其中,配置界面是通过配置工具来生成的,配置工具通过Makefile编译执行,配置界面中的选项则是通过各级的Kconfig(老版本也称Config.in)和Makefile(老版本也称Kbuild)文件定义。
Linux内核配置系统也被移植到其它软件(如Busybox、glibc、uclibc等)中,来提供同样的配置界面以方便有选择性的配置。
1.2 内核配置工具Linux内核配置命令主要有:make config、make menuconfig、make xconfig和make gconfig,分别是字符界面、ncurses光标菜单、QT图形窗口和GTK图形窗口的配置界面。字符界面配置方式需要回答每一个选项提示,逐个回答进行配置并不方便,而光标和图形配置界面界面友好,方便实用。
make config是完全命令行的配置方式,make menuconfig依赖于ncurses库,make xconfig依赖于QT图形库,make gconfig依赖于GTK图形库。
不同的内核配置方式,分别通过不同的配置工具来完成。scripts目录下提供了各种内核配置工具,表1是这些工具的说明。
表1 内核配置工具说明
配置工具 |
Makefile相关目标 |
依赖的程序 |
conf |
config defconfig oldconfig … |
conf.c、zconf.tab.c |
mconf |
menuconfig |
mconf.c、zconf.tab.c |
qconf |
xconfig |
qconf.c、kconfig_load.c、zconf.tab.c |
gconf |
gconfig |
gconf.c、kconfig_load.c、zconf.tab.c |
其中zconf.tab.c程序实现了解析Kconfig文件和内核配置主要函数。Zconf.tab.c程序还直接包括了下列一些C程序,这样各种配置功能都包含在zconf.tab.o目标文件中了。
其中,lex.zconf.c实现lex语法解析器,
util.c实现配置工具,
confdata.c实现.config等相关数据文件保存,
expr.c实现表达式函数,
symbol.c实现变量处理函数,
menu.c实现菜单控制函数。
1.3 内核配置方式在顶层的Makefile中,可以查找到如下几行定义的规则:
这就是生成内核配置界面的命令规则,它也定义了执行的目标和依赖的前提条件,还有要执行的命令。这条规则定义的目标为config %config,通配符%意味着可以包括config、menuconfig、xconfig、gconfig等。依赖的前提条件是scripts_basic outputmakefile,这些在Makefile中也是规则定义,主要用来编译生成配置工具。这条规则执行的命令就是执行scripts/kconfig/Makefile制定的规则。
根据配置工具的不同,内核有不同的配置方式。有命令行方式,还有图形界面方式。表2是各种内核配置方法的说明。
表2 内核配置方法的说明
配置方法 |
功能 |
config |
通过命令行程序更新当前配置 |
menuconfig |
通过菜单程序更新当前配置 |
xconfig |
通过QT图形界面更新当前配置 |
gconfig |
通过GTK图形界面更新当前配置 |
oldconfig |
通过已经提供的.config文件更新当前配置 |
Randconfig |
对所有的选项随机配置 |
Defconfig |
对所有的选项缺省配置 |
allmodconfig |
对所有的选项尽可能选择“m” |
allyesconfig |
对所有的选项尽可能选择“y” |
allnoconfig |
对所有的选项尽可能选择“n”的最小配置 |
这些内核配置方式是在scripts/kconfig/Makefile中通过规则定义的。从这个Makefile中,可以找到下面一些规则定义。如果把变量或者通配符带进去,就可以明白要执行的操作。
这里的ARCH以arm为例来说明。
执行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用QT图形库生成配置界面,arch/arm/Kconfig是菜单的主配置文件,每种配置方式都需要。
执行命令:scripts/kconfig/qconf arch/arm/Kconfig,使用GTK图形库生成配置界面。
执行命令:scripts/kconfig/mconf arch/arm/Kconfig,使用lxdialog工具,生成光标配置菜单。
执行命令:scripts/kconfig/conf (-o/s) arch/arm/Kconfig,完全命令行的内核配置方式。使用“-o”选项,直接读取已经存在的.config文件,要求确定内核新的配置项。使用“-s”选项,直接读取已经存在的.config文件,提示但不要求确认内核新的配置项。
通过上述各种方式都可以完成配置内核的工作,在顶层目录下生成.config文件。这个.config文件保存大量的内核配置项,.config会自动转换成include/linux/autoconf.h头文件。在include/linux/config.h文件中,将包含使用include/linux/autoconf.h头文件。