曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9613|回复: 0
打印 上一主题 下一主题

2.6 内核的 Kconfig

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2010-7-22 17:48:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2.6 内核的源码树目录下一般会有两个文件: Kconfig 和 Makefile,如:/usr/src/linux/drivers/char/Kconfig 。分布在各个目录下的的 Kconfig 构成了一个分布式的内核配置数据库,每个Kconfig 分别描述了所属目录源文件相关的内核配置菜单。在内核配置 make menuconfig 时,从 Kconfig 中读出配置菜单,用户配置完成后,保存在 .config 中 (该文件位于内核源码树顶层目录下).在编译内核时,主 Makefile 通过调用 .config 文件就能知道用户对内核的配置情况。

Kconfig 文件的说明文档位于内核内核源码树目录下 Documentation/kbuild/kconfig-language.txt 的文件中有详细说明。

内核配置数据库将内核配置选项以树的组织形式展现出来,如:
      +- Code maturity level options
        |  +- Prompt for development and/or incomplete code/drivers
        +- General setup
        |  +- Networking support
        |  +- System V IPC
        |  +- BSD Process Accounting
        |  +- Sysctl support
        +- Loadable module support
        |  +- Enable loadable module support
        |     +- Set version information on all module symbols
        |     +- Kernel module loader
        +- ...
更直观的,在 make menuconfig 里如:

上面,每一行配置项称为一个配置入口,每个入口还可以展开看到其下的子入口。每个入口都有自己的依赖关系,这些依赖关系决定了入口是否可见。当父入口可见时,子入口才能可见,否则不可见。

菜单入口
大多数的入口都定义了一个配置项,这个配置项常以下面的形式定义:
config MODVERSIONS
        bool "Set version information on all module symbols"
        depends MODULES
        help
          Usually, modules have to be recompiled whenever you switch to a new
          kernel.  ...
如在 2.6.15.5 内核源码树中的 drivers/char/Kconfig 文件中有一项关于定义 s3c2410 RTC 驱动的配置项如:
config S3C2410_RTC
        bool "S3C2410 RTC Driver"
        depends on ARCH_S3C2410
        help
          RTC (Realtime Clock) driver for the clock inbuilt into the
          Samsung S3C2410. This can provide periodic interrupt rates
          from 1Hz to 64Hz for user programs, and wakeup from Alarm.
上面,没一行都以关键字开始,关键字后可接多个参数。
config 表示定义了一个新入口,其下几行定义了这个 config 选项(S3C2410_RTC)的属性。这些属性可以是 config 选项的类型,还可以是输入提示,依赖关系,帮助信息与默认值。同名 config 选项还可以被定义多次,但每个定义仅能够有唯一一个输入提示,并且要保证其类型不能够冲突。

菜单属性
一个菜单入口可以有多个属性。
1. 类型定义
可以有这么几种类型:
bool, tristate, string, hex, int
每一个 config 选项必须要有一种类型。有两种基本类型是 tristate 和 string,而其余的类型都基于这两种类型。在类型定义中还可以使用输入提示,所以下面两种定义是等价的:
bool "Networking support"
bool
prompt "Networking support"
2.输入提示
格式为:
"prompt" <prompt> ["if" <expr>]
每一个菜单入口最多只能有一个输入提示。可选地,这个提示后面可以用 if 来添加依赖关系。

3.默认值
格式为:
"default" <expr> ["if" <expr>]
一个 config 选项可以有一个默认值。
比如修改:
config S3C2410_RTC
        bool "S3C2410 RTC Driver"
        #depends on ARCH_S3C2410
        default y
上面,在默认的 Kconfig 中,没有 default,这里我们自行添加。为了能够在菜单中出现编译项,还要注释掉 depends on 项。然后,我们重新 make menuconfig 后,就可以看到:
  • S3C2410 RTC Driver (NEW)
  • 这里,由于 default 默认是 y,所以这个选项被默认选上。如果 default 设为 n,那么此项默认不会被选上,需要手动选择。

    如果有多个默认值,那么只有第一个定义的默认值可用。也就是说,如果像上面,我们在 default y 后面再添加 default n 一行,那么起作用的是 default y,而不是 default n。

    4. 依赖关系
    格式:"depends on"/"requires" <expr>
    为一个菜单入口定义一个依赖关系。可以定义多个依赖关系,这些依赖之间要用 "&&" 连接起来。依赖关系也可以应用在这个菜单里的其它选项。下面的两个例子是等同的:
    bool "foo" if BAR
    default y if BAR
    depends on BAR
    bool "foo"
    default y
    5. 反向依赖关系
    格式:"select" <symbol> ["if" <expr>]
    depends 能限定一个 symbol 的上限,即如果 A 依赖于 B,则在 B 被配置为 ”Y“ 的情况下,A 可以为 "Y", "M" 和 "N";在 B 被配置为 "M" 的情况下,A 可以被配置为 “M” 或 "N"; B 在被配置为 "N" 的情况下,A 只能为 “N”(Y--编译入内核;M--编译为内核模块;N--不编译)。

    select 能限定一个 symbol 的下限,若 A 反向依赖于 B,则 A 的配置值会高于或等于 B (正好与 depends 相反)。如果 symbol 反向依赖于多个对象,则它的下限值是这些对象的最大值。

    依赖关系表达式语法
    表达式定义如下:
    <expr> ::= <symbol>                           
               <symbol> '=' <symbol>            
               <symbol> '!=' <symbol>           
               '(' <expr> ')'                  
               '!' <expr>                          
               <expr> '&&' <expr>              
               <expr> '||' <expr>
    第1行,将 symbol 赋给 expr 。布尔型(boolean) 和 三态型(tristate) 的 symbols 直接赋给相应的表达式。所有其他类型的 symbol 都赋为 'n' 。
    第2行,如果两个 symbol 相等,则返回 'y' ,否则返回 'n'。
    第3行,如果两个 symbol 相等,则返回 'n',否则返回 'y'。
    第4行,返回表达式的值,用于改变优先级。
    第5行,返回 (2-/expr/) 的结果。
    第6行,返回 min(/expr/, /expr/) 的结果。
    第7行,返回 max(/expr/, /expr/) 的结果。

    一个表达式的值可以是 'n','m','y' (或者计算的结果分别是 0, 1, 2)。一个菜单项只有当表达式的值算得为 'm' 或 'y‘ 时才是可见的。

    symbol 有两种类型,一种是常数型,另一种是非常数型。非常数型 symbol 用得最为普遍,由 config 关键字定义。非常数型 symbol 由数字、字符以及下划线组成。常数型 symbol 仅是表达式的一部分。常数 symbols 总是用淡引号或双引号引起来。在引号里,可以使用任何字符,但是引号本身要用 '\' 符号来进行转义。

    6. 数据范围
    格式:"range" <symbol> <symbol> ["if" <expr>]
    为 int 和 hex 类型的 symbol 设置可接受的输入值范围。用户只能输入一个大于或等于第一个 symbol 而小于或等于第二个 symbol 的值。

    7. 帮助信息
    格式:"help" or "---help---"
    定义了一个帮助信息。帮助信息完全靠文本缩进识别结束。也就是说,文本结束在比第一行短(或等于)的那一行。"help" 和 "---help---" 在作用上没有区别,设计 "---help---" 的初衷在于将文件中的配置逻辑与给开发人员的提示分开。

    菜单结构
    菜单入口在菜单结构树中的位置可由两种方法决定。地一种方式如下所示:
    menu "Network device support"
            depends NET

    config NETDEVICES
            ...

    endmenu
    所有处于 "menu" 和 "endmenu" 之间的菜单入口都会成为 "Network device support" 的子菜单。而且,所有子菜单选项都会继承父菜单的依赖关系。比如,“Networking device support” 对 "NET" 的依赖被加到了配置选项 NETDEVICES 的依赖列表中。
    另一种方式是通过分析依赖关系生成菜单结构。如果菜单选项在一定程度上依赖于前面的选项,它就能成为该选项的子菜单。如果父选项为 "N",则自选项不可见;如果父选项为 "Y" 或 "M",则自选项可见。例如:
    config MODULES
            bool "Enable loadable module support"

    config MODVERSIONS
            bool "Set version information on all module symbols"
            depends MODULES

    comment "module support disabled"
            depends !MODULES
    MODVERSIONS 直接依赖 MODULES,如果 MODULES 不为 "N",则该选项才可见。

    除此之外,Kconfig 中还可能使用 "choices ... endchoice"、"comment"、"if...endif" 这样的语法结构。其中 "choices ... endchoice" 的结构如下所示:
            "choice"
            <choice options>
            <choice block>
            "endchoice"
    它定义一个选择群,其接受的选项 (choice options) 可以是前面描述的任何属性。在一个硬件有多个驱动的情况下使用,使用选择可以实现最终只有一个驱动被编译进内核或模块。选择群还可以接受另一个选项是 "optional",这样菜单入口就被设置为 "N"(没有被选中)。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

    GMT+8, 2024-4-30 00:27 , Processed in 0.075734 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表