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 选项从定义到影响编译的完整流程:
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键可查看。