4. U-Boot 裁剪与定制的核心逻辑
4.1 四个核心文件的关系
| 文件/命令 | 对应角色 | 作用描述 |
|---|---|---|
| Kconfig | 菜单 | 定义规则:规定了有哪些选项(功能开关)、是什么类型(bool/string)、依赖关系(使用该选项前需要选择哪些前置选项)。 |
| defconfig | 默认配置 | 默认值:厂家提供的"预设配置"。针对特定板子(如 i.MX6ULL)的一组预设配置。 |
| make menuconfig | 功能增减 | 交互工具:把 Kconfig 的文本逻辑变成图形界面,让你在 defconfig 的基础上增加或减少功能。 |
| .config | 最终配置 | 决策结果:这是配置阶段的最终产物,决定了本次编译到底要包含哪些代码。 |
全流程:
第一步:初始化------从 defconfig 到 .config
当执行 make mx6ull_14x14_evk_defconfig 时:
构建系统调用 scripts/kconfig/conf 工具。
该工具读取 configs/mx6ull_14x14_evk_defconfig。
它将这些预设值 写入根目录下的 .config 文件。
结果:此时的 .config 是厂家的标准配置。
第二步:交互修改------make menuconfig当执行 make menuconfig 时:
会出现以下界面,它是 U-Boot(及 Linux 内核)配置系统的可视化交互界面。通过图形化界面,让用户在数万个源码配置项中,安全、直观地完成定制,并最终将结果翻译给编译器看
工具(conf)会递归扫描源码树中所有的 Kconfig 文件,构建出菜单树。
它会加载当前的 .config,把已有的勾选项显示在界面上。
关键关联:你在界面上看到的"文字描述"、"依赖逻辑"全部来自 Kconfig;而界面上"勾选还是不勾选",则反映了 .config 的现状。当你保存并退出时,它会将你的修改覆盖写回 .config
文字描述:Kconfig 提供"菜单模板"当运行 make menuconfig 时,系统会首先去读根目录下的 Kconfig 文件,并递归读取所有子目录下的 Kconfig。
你在界面上看到的每一个菜单名字、每一个勾选项,都是在某个 Kconfig 文件里用 config 关键字定义的。
依赖逻辑:Kconfig 定义"逻辑约束"界面上为什么有的选项是灰色不可选?为什么选了 A 之后自动跳出了 B?
这全是因为 Kconfig 文件里写了 depends ony 或 select等语法。menuconfig 负责执行这些逻辑。
第三步:编译转换------从 .config 到 C 源码.config 虽然生成了,但编译器并不认识它。此时系统会进行两个转换:
Makefile 引用:.config 被 Makefile 包含,决定哪些 .o 文件会被链接进 u-boot.bin。
生成 autoconf.h:系统会自动生成 include/generated/autoconf.h,将 .config 里的 CONFIG_XXX=y 变成 C 语言的 #define CONFIG_XXX 1。
总结:
.config 文件 是 Makefile 需要读取的文件,make 程序会读取 .config ,根据里面的 CONFIG_XXX=y 来决定编译哪些 .c 文件,这里记录了哪些文件需要进行编译,这个文件最开始是由厂家的 defconfig 文件进行默认配置的,但是用户可以编程 Kconfig 文件增减功能,并通过 make menuconfig 在厂家默认配置的基础上进行增减,最终会生成一个新的 .config 文件
4.2 Kconfig 文件与图形化界面的关系
在 U-Boot 根目录下执行
c
vi Kconfig
在文件末尾输入以下代码:
shell
config KD
bool "test for kd"
default y
help
this is a test for menueconfig study
- config KD
含义: 定义一个配置项的唯一标识符。
深层作用:
在生成的 .config 文件中,它对应 CONFIG_KD=y(如果被选中)。
在 C 语言代码中,通过 CONFIG_KD 这个名字来引用它(例如 #ifdef CONFIG_KD)。
注意: 前缀 CONFIG_ 是系统自动加上的,你在 Kconfig 里只需要写标识符本身。- bool "test for kd"
类型定义: bool 表示这是一个布尔类型。它的值只有两种:选中(y)或不选中(n)。
显示提示词: 引号里的 "test for kd" 是在 make menuconfig 图形界面中显示的文本说明。
如果没有这个字符串,该配置项就会变成"不可见的"(Invisible),通常用于被其他选项自动通过 select 选中。- default y
含义: 设置默认状态。
深层作用: * 当你第一次打开 menuconfig 或者执行 make defconfig 时,如果没有其他地方修改它,这个选项会自动处于"已勾选"状态。
如果不写这一行,默认值通常是 n。- help
含义: 帮助信息的关键字。
作用: 告诉 conf 工具,接下来的缩进文本是该选项的详细说明。
交互: 在 make menuconfig 界面中,当用户选中这一行并按下键盘上的 ? 键(或点击 Help 按钮)时,会弹出下面定义的详细解释内容。- this is a test for menueconfig study
含义: 具体的帮助文本。
规范: 必须比 help 关键字多一级缩进。它不会参与编译,仅供开发者阅读,解释该功能的作用、风险或使用方法。

其中

可以看到在图形化界面中出现来刚刚在 Kconfig 中添加的选项,并且默认是勾选的状态,选中该选项按下 ? 或 h 会弹出帮助信息:

选中选项,选择 save 进行保存后执行
c
vi .config

可以看到 .config 文件中 出现了 CONFIG_KD=y
若在图形化界面中取消勾选,则为出现以下代码

此外,Kconfig 还有 depend on ,menu 等语法,读者可自行查找资料,这里只是引入一个简单例子方便读者理解原理。
