04、Kconfig的使用
一、图形化界面的操作
在内核源码目录下输入make menuconfig命令,打开图形化配置界面。

在Linux内核开发或嵌入式系统配置过程中,menuconfig作为交互式文本图形界面配置工具,提供了直观高效的配置管理能力。
通过终端执行make menuconfig命令后,界面将基于ncurses库构建文本模式的树状结构配置界面。系统会自动加载当前的.config配置文件,形成包含多层级菜单的交互式布局。界面布局通常包含:
- 主菜单栏:顶部显示功能快捷键提示(如
?查看帮助) - 配置树结构:左侧以树状目录展示配置项分类(如
Device Drivers、Kernel Features) - 配置选项区:右侧显示当前选中菜单的具体配置项及描述
核心操作指令集:
| 操作类型 | 键位组合 | 功能描述 |
|---|---|---|
| 菜单导航 | ↑↓/PgUp/PgDn | 垂直滚动配置项列表 |
←→ | 展开/折叠子菜单层级 | |
| 配置项选择 | 回车 | 进入子菜单或展开详细配置选项 |
空格 | 切换布尔型配置项(Y/N)或三态型(Y/M/N) | |
| 全局搜索 | / | 按名称或关键字快速定位配置项(支持正则表达式) |
| 依赖关系查看 | H | 显示当前配置项的依赖关系及警告信息 |
| 配置保存退出 | Esc(两次) | 逐层退出并保存配置,或直接按/输入exit后确认保存 |
配置项类型解析:
menuconfig支持三种核心配置类型:
- 布尔型(Bool):二元选择项(如
CONFIG_NETFILTER=y) - 三态型(Tristate):包含编译进内核(
Y)、编译为模块(M)、禁用(N)三种状态 - 字符串型(String):接受文本输入的配置项(如
CONFIG_LOCALVERSION="custom")
技术实现:配置项的元数据存储在Kconfig文件中,其语法定义包含config、menuconfig、depends on等关键字,通过kconfig工具链解析生成配置界面。
二、Kconfig 语法简介
Kconfig 类似食材(厨房告诉前台,我有这道菜,前台就可以把这个才放到菜单)
上一小节我们打开的图形化配置界面是如何生成的呢?图形化配置界面中的每一个界面都会对应一个 Kconfig 文件。所以图形化配置界面的每一级菜单是由 Kconfig 文件来决定的。图形化配置界面有很多菜单。所以就会有很多 Kconfig 文件,这也就是为什么我们会在内核源码的每个子目录下,都会看到 Kconfig 文件的原因,那掌握 Kconfig 文件相关的知识是不是就非常重要呢。
::: kernel/drivers/Kconfig 文件如下: :::

基本语法
menu: menu“菜单标题”- 配置选项:
config CONFIG_NAME - 依赖关系:
depends on DEPENDENCY_EXPRESSION - 帮助信息:
help“帮助信息”
三、.config 配置文件介绍
比喻:客户选完菜,生成需要制作的清单
我们在图形化配置界面配置好了以后,会得到一个.config 配置文件。在编译内核的时候会根据这个.config 文件来编译内核。这样是不是就实现了通过图像化界面的配置来配置内核呀。
用通俗的话来说,Kconfig 就是饭店的菜单,.config 就是客人点完的菜。然后厨师会根据客人点的菜,也就是.config 来做菜,对应的操作就是编译内核。那.config 是如何产生的呢?对应上面的例子就是要有服务员给我们点菜呀。
当我们使用make menuconfig的时候,会通过 mconf 程序去解析Kconfig 文件,然后生成对应的配置文件.config。所以这个 mconf 就是服务员。
mconf 程序源码在内核源码 scripts/kconfig 目录下,如下图所示,这里不对 Kconfig 文件的解析流程进行分析,感兴趣的同学可以自行分析下 mconf 的源码。

有了.config 配置文件以后,内核就可以根据这个配置文件来编译内核,比如控制某些驱动编译进内核,或者控制 某些驱动不编译内核。那他是怎么实现的呢?
.config 会通过 syncconfig 目标将.config 作为输入然后输出需要文件,这里我们重点更关注 auto.conf 和 autoconf.h。
在 auto.conf 文件中,存放的是配置信息。

在内核源码的顶层 Makefile 中会包含 auto.conf 文件,以此引用其中的变量来控制 Makefile 的动作,如哪些驱动编译,哪些驱动不编译。
四、deconfig 配置文件
比喻:老顾客(食谱清单已确定)
kernel/arch/arm64/configs/rockchip_linux_defconfig

defconfig 文件和.config 文件都是 linux 内核的配置文件,defconfig 文件在内核源码的arch/$(ARCH)/configs 目录下,是 Linux 系统默认的配置文件。比如说瑞芯微平台 Linux 源码默认的配置文件为:kernel/arch/arm64/configs/rockchip_linux_defconfig。
.config 文件位于 Linux 内核源码的顶层目录下,编译 Linux 内核时会使用.config 文件里面的配置来编译内核镜像。
如果.config 文件存在,make menuconfig 界面的默认配置也就是当前.config 文件的配置,如果修改了图形化配置界面的设置并保存,那么.config 文件会被更新。
如果.config 文件不存在,使用命令“make XXX_defconfig”命令会根据 arch/$(ARCH)/configs目录下的 XXX_defconfig 自动生成.config。make menuconfig 界面的默认配置则为 defconfig 文件中的默认配置,比如说瑞芯微平台 Linux 内核源码目录下输入“make rockchip_linux_defconfig” 会自动生成.config 文件。那么此时 rockchip_linux_defconfig 的配置项和.config 的配置项是相同的。
五、实验
我们对上一小节进行改造:
步骤1:
obj-y += test/
变更为:
obj-$(CONFIG_TEST) += test/2
3
4
5

步骤2:
增加Kconfig,方便后续make menuconfig手动打开:
# SPDX-License-Identifier: GPL-2.0
menu "test"
config TEST
bool "TEST"
default n
help
test module.
endmenu2
3
4
5
6
7
8
9
步骤3:
修改kernel/drivers/Kconfig
source "drivers/test/Kconfig"
步骤4:
修改rockchip_linux_defconfig文件,增加CONFIG_TEST=y
步骤5:
重新编译内核
./build.sh kernel