linux内核Kconfig文件分析
对于阅读linux内核源码的同学来说,走出第一步大多从阅读相关linux内核书籍开始,但是大量的linux内核架构图书中都未提到Kconfig和Makefile文件在内核源码中的含义,然而,当我们脱离书籍,阅读和理解源码时,势必要依赖于对这两个文件的阅读,才能理清源码文件的功能和组织方式。遂写此文。
根据linux内核文档linux3.5.4/Documentation/kbuild/kconfig-language.txt的说明:
图【1】根据kconfig语法说明choice选项中依然使用config来定义编译选项,source选项很面的属性为引入的外部kconfig文件的路径,comment选项只用来给用户编译内核时提供提示信息,因此所有的编译选项以及菜单的名称均位于config、menuconfig和menu关键字之后。
位于config、menuconfig以及menu关键字后的名字为编译选项和目录的名字。是我们需要需要抓取的目标,其中menuconfig与config选项基本是等价的,都定义了编译选项,menuconfig在此基础上还控制了其子项可视性,例如如果该menuconfig设置为n,那么其子编译选项为不可设置的。如下图所示:
当某些嵌入式设备不许要块设备的内核支持时,将BLK_DEV设置为n,那么接下来在“if BLK_DEV”与“endif”之间的内容也就不再允许用户对其进行配置了。因此这样BLK_DEV与例子中的BLK_DEV_FD也就存在了一种隐式的依赖关系,在爬取编译选项之间依赖关系时,应将这种依赖关系爬出。
如上述内核文档中的说明可以知道在编译选项的属相中关于编译选项的类型的关键字有bool、tristate、string、hex、int五种,由文档的说明可以看出,这五种关键字可以归类为两类,即string和tristate两种。另外def_bool或者def_trisate类型是default关键字与bool、trisate关键字的缩写版本,并非新的类型关键字。因此我们只需要抓取与每个config、menuconfig选项的属性中的上述关键字就可以爬取出其编译选项的类型。
位于linux3.5.4/Kconfig文件为linux内核配置的入口,在其中使用了mainmenu关键字,这是整个内核编译选项菜单的起始点,如下图所示:
通过SRCARCH选项决定了整个内核源码编译是针对与何种计算机体系结构的。
同时“source”关键字将内核源码中所有的Kconfig关联起来,从而组成了一个内核编译选项菜单,供用户进行配置。我们的爬取思路也是递归的遍历source关键字引用的kconfig文件,利用栈结构与“menu/endmenu”实现对所有编译选项之间父子关系的爬取。
编译选项之间的依赖关系的定义使用depends on/select关键字,一个编译选项与多个编译选项之间存在依赖关系时,还会使用逻辑表达式的形式来表现,因此数据库中需要记录整个逻辑表达式。另外使用bool “foo” if BAR这样的写法的依赖关系定价与depand on BAR,在爬取过程中不容忽视。















