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.
endmenu
2
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