内核的Kconfig文件详解

内核是个复杂庞大的系统,对它进行配置、裁剪、编译原本非常的复杂和困难,但现在我们却只需要简单的2个命令make menuconfig和make uImage就搞定了,原因是在其背后有一个设计精巧的内核构造系统帮我们精确完成了各项任务。内核构造系统最关键的组成元素就是各个目录下的Kconfig文件和Makefile文件,本文将对这2类文件进行介绍,以使大家了解内核构造系统的基本情况,从而能够修改他们,以完成向内核中添加功能组件的目的。

一、Kconfig文件

Kconfig文件的作用是:控制make menucofig时,出现的配置选项;并根据用户在配置界面中的选择,将配置结果保存在.config配置文件(该文件将供Makefile使用,以决定要编译的内核组件以及如何编译)。

主(初始)Kconfig文件是arch/arm/Kconfig(打开来看看吧!并试着改一改,看看当你make menuconfig的时候会出现什么样的变化)。 

Kconfig文件的语法和语义,详情可查阅内核源码中的Documentation/kbuild/kconfig-language.txt文件。 

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

config REISERFS_FS_POSIX_ACL
        bool 
        prompt "ReiserFS POSIX Access Control List”
        default y
        depends on REISERFS_FS_XATTR
        select FS_POSIX_ACL
        help
          Posix Access Control Lists (ACLs) support 
          If you don’t know what Access Control Lists are, say N 

上面的config条目,各个部分的含义是: 

  • REISERFS_FS_POSIX_ACL为变量名,将在.config中以CONFIG_REISERFS_FS_POSIX_ACL=y或n的形式出现;
  • bool为变量取值的类型,可为y或n
  • prompt为出现在配置菜单中的文字,没有它,将使得用户不能在配置界面中显示并配置它
  • default为变量缺省值,可被用户设置值覆盖
  • depends on表示该变量必须在REISERFS_FS_XATTR被设置的情况下才能进行设置,否则取值为n,即使default为y
  • select表示它将影响到变量FS_POSIX_ACL,使得FS_POSIX_ACL至少应该配置为y或m(如果它最终取值为y或m)
  • help中的文字将作为配置界面中的帮助信息

附加说明: 

  • 无depends on ,default 为y :默认为y。 一般用于必须要设置的选项,此时不要设置prompt
  • 有depends on ,default 为y :所依赖的条目已设置,则默认为y;所依赖的条目未设置,则为n
  • 有depends on ,default 为n :所依赖的条目已设置,则默认为n;所依赖的条目未设置,则为n
  • 无depends on ,default 为n :默认为n。在未设置prompt的情况下,此选项想要被设置,需要由其它选项来select它 

2、Kconfig中变量的取值类型总共有5种。其中最常见的是tristate和bool,分别对应于配置界面中[ ]和< >选项

  • tristate:可取y、n、m
  • bool (其为tristate的变体) :可取y、n
  • string:取值为字符串,如:CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0"
  • hex (其为string的变体) :取值为十六进制数据,如:CONFIG_VECTORS_BASE=0xffff0000
  • int (其为string的变体) :取值为十进制数据,如:CONFIG_SPLIT_PTLOCK_CPUS=4096

3、Kconfig文件的要素:menu

在menu和endmenu中间可配置若干config条目; 

体现在配置菜单上为 System type —>,按下该条目后,将出现各个config条目 

4、Kconfig文件的要素:choice 

在choice和endchoice之间可定义若干config条目; 

体现在配置菜单上为 ARM system type —>,按下该条目后,将出现各个config条目; 

choice中的config条目变量只能有2种类型:bool或tristate,且不能同时有这2种类型的变量。对于bool型变量只能在多个选择中选择1个为y;对于tristate型变量要么将多个(当然也可以是1个)设为m,要么仅将1个设为y,其余为n。这好比一个硬件有多个驱动,要么选择1个编入内核,要么把多个全编为模块 

5、Kconfig文件的要素:comment 

用于定义帮助信息,将出现在配置界面的第一行;并且还会出现在配置文件.config中(作为注释) 

6、Kconfig文件的要素:source 

由于内核源代码中大多数目录下都有各自的Kconfig文件,因此需要一种手段将所有的Kconfig文件组织为一个整体。这就是source的功能,它用于引入另一个Kconfig文件,有点类似于C语言中的#include 

二、.config文件 

make menuconfig配置完成退出时,选择保存,则用户所作的选择将保存在内核源代码顶层目录的.config文件中。下面.config文件的片断显示内核配置者作了如下选择:将BLK_DEV_LOOP、CONFIG_BLK_DEV_RAM功能编译进zImage;不编译BLK_DEV_COW_COMMON、BLK_DEV_CRYPTOLOOP、BLK_DEV_UB功能;将BLK_DEV_NBD功能编译为模块。 

484 #
485 # Block devices
486 #
487 # CONFIG_BLK_DEV_COW_COMMON is not set
488 CONFIG_BLK_DEV_LOOP=y
489 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
490 CONFIG_BLK_DEV_NBD=m
491 # CONFIG_BLK_DEV_UB is not set
492 CONFIG_BLK_DEV_RAM=y 


你可能感兴趣的:(操作系统)