3. config 关键字:定义单个配置选项

config 是 Kconfig 语法中最核心的关键字,用于定义一个独立的配置选项。每个 config 块对应 Linux 内核配置菜单中的一个开关或输入项,用户可以通过 make menuconfig、make xconfig 等工具修改其值,从而控制内核的编译行为。

3.1 config 基本语法结构

一个完整的 config 条目由关键字 config 后跟配置选项名称(通常以 CONFIG_ 为前缀)组成,其下属属性通过缩进排列。基本模板如下:

config CONFIG_EXAMPLE
    bool "Enable Example Feature"
    default y
    help
      This is an example configuration option.
      Say Y here to enable the example feature.
语法要点:
  • config 关键字必须顶格书写,后跟一个空格和选项名。
  • 下属属性(类型、默认值、依赖等)必须缩进一个 Tab 或固定空格。
  • 选项名通常全大写,使用下划线分隔单词。
  • 字符串引号内的文本会显示在配置菜单界面上。

3.2 配置选项的五大类型

每个 config 条目必须指定一个类型,类型决定了该选项的取值范围和菜单界面的交互方式。Kconfig 支持五种基本类型:

类型 关键字 取值范围 菜单界面表现 典型用途
布尔 bool y / n 复选框([ ] 或 [*]) 功能开关,编译或不编译某模块
三态 tristate y / m / n 尖括号(< > 或 <M> 或 <*>) 驱动或模块,支持编译进内核、编译为模块、不编译
字符串 string 任意文本 文本输入框 设备路径、版本号、参数名称
整数 int 整数值(可设范围) 数字输入框 缓冲区大小、超时秒数、端口号
十六进制 hex 十六进制数(0x 前缀) 十六进制输入框 内存地址、寄存器掩码、硬件 ID
类型选择建议: 对于纯功能开关,优先使用 bool;对于可编译为独立模块的驱动,使用 tristate;对于用户自定义参数,根据数据格式选择 string、int 或 hex。

3.3 默认值(default)

default 属性为配置选项指定一个初始值,当用户首次进入配置菜单或未手动修改时,该选项将采用此默认值。默认值的写法与类型密切相关:

# bool 类型默认值
config CONFIG_FEATURE_A
    bool "Enable Feature A"
    default y

# tristate 类型默认值
config CONFIG_DRIVER_B
    tristate "Driver B support"
    default m

# string 类型默认值
config CONFIG_PATH_C
    string "Path to firmware"
    default "/lib/firmware/"

# int 类型默认值
config CONFIG_BUF_SIZE
    int "Buffer size (bytes)"
    default 4096
    range 256 65536

# hex 类型默认值
config CONFIG_BASE_ADDR
    hex "Base address"
    default 0x10000000
    range 0x10000000 0x1FFFFFFF

3.4 类型与默认值的对应关系

类型 默认值写法 合法默认值示例 注意事项
bool default y 或 default n y, n 不能写 m,否则语法错误
tristate default y/m/n y, m, n 三种状态均可作为默认值
string default "文本" "/data", "v1.0" 必须用双引号包裹
int default 数字 1024, 0, -1 不带引号,可配合 range 限制范围
hex default 0x十六进制 0xFF, 0x80000000 必须带 0x 前缀
常见错误:
  • 对 bool 类型使用 default m,Kconfig 解析会报错。
  • 对 hex 类型忘记 0x 前缀,默认值会被当作非法值。
  • 对 string 类型漏写双引号,导致字符串被解析为其他关键字。

3.5 配置选项的完整生命周期

下图展示了一个 config 选项从定义到影响编译的完整流程:

config 选项生命周期流程图 config 选项生命周期 Kconfig 定义 配置工具解析 用户交互 .config 生成 Makefile 条件编译 最终二进制 流程说明: 1. 开发者在 Kconfig 文件中使用 config 关键字定义选项及其类型、默认值。 2. 配置工具(menuconfig/xconfig)读取 Kconfig,生成交互菜单。 3. 用户选择或修改值后,工具将最终结果写入 .config 文件。 4. Makefile 根据 .config 中的 CONFIG_* 变量决定是否编译对应源文件。

3.6 综合示例:一个完整的 config 块

以下示例展示了一个实际项目中可能出现的 config 定义,综合了类型、默认值、范围限制和帮助信息:

config CONFIG_USB_STORAGE
    tristate "USB Mass Storage support"
    depends on USB && SCSI
    default m
    help
      Say Y here to include USB Mass Storage support in the kernel.
      This driver provides support for USB flash drives, external
      hard drives, and other USB storage devices.
      
      If unsure, say M (module) to reduce kernel size.

config CONFIG_USB_STORAGE_DEBUG
    bool "USB Storage verbose debug"
    depends on CONFIG_USB_STORAGE
    default n
    help
      Enable verbose debug messages for USB storage driver.
      Only enable this for development/debugging purposes.

config CONFIG_USB_STORAGE_MAX_SECTORS
    int "Maximum number of sectors per transfer"
    depends on CONFIG_USB_STORAGE
    default 64
    range 8 256
    help
      Maximum number of sectors transferred in a single command.
      Larger values may improve performance but increase memory usage.
关键点总结:
  • 每个 config 必须且只能有一个类型关键字(bool/tristate/string/int/hex)。
  • default 是可选的,但建议显式指定以避免未定义行为。
  • range 仅对 int 和 hex 类型有效,用于限制输入范围。
  • depends on 用于控制选项的可见性,将在后续章节详细讲解。
  • help 文本为开发者提供说明,在配置界面中按 ? 或 H 键可查看。