U-Boot分析【学习笔记】(3)

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 onyselect等语法。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
  1. config KD
    含义: 定义一个配置项的唯一标识符。
    深层作用:
    在生成的 .config 文件中,它对应 CONFIG_KD=y(如果被选中)。
    在 C 语言代码中,通过 CONFIG_KD 这个名字来引用它(例如 #ifdef CONFIG_KD)。
    注意: 前缀 CONFIG_ 是系统自动加上的,你在 Kconfig 里只需要写标识符本身。
  2. bool "test for kd"
    类型定义: bool 表示这是一个布尔类型。它的值只有两种:选中(y)或不选中(n)。
    显示提示词: 引号里的 "test for kd" 是在 make menuconfig 图形界面中显示的文本说明。
    如果没有这个字符串,该配置项就会变成"不可见的"(Invisible),通常用于被其他选项自动通过 select 选中。
  3. default y
    含义: 设置默认状态。
    深层作用: * 当你第一次打开 menuconfig 或者执行 make defconfig 时,如果没有其他地方修改它,这个选项会自动处于"已勾选"状态。
    如果不写这一行,默认值通常是 n。
  4. help
    含义: 帮助信息的关键字。
    作用: 告诉 conf 工具,接下来的缩进文本是该选项的详细说明。
    交互: 在 make menuconfig 界面中,当用户选中这一行并按下键盘上的 ? 键(或点击 Help 按钮)时,会弹出下面定义的详细解释内容。
  5. this is a test for menueconfig study
    含义: 具体的帮助文本。
    规范: 必须比 help 关键字多一级缩进。它不会参与编译,仅供开发者阅读,解释该功能的作用、风险或使用方法。

其中

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

选中选项,选择 save 进行保存后执行

c 复制代码
vi .config

可以看到 .config 文件中 出现了 CONFIG_KD=y

若在图形化界面中取消勾选,则为出现以下代码

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

相关推荐
烛衔溟1 小时前
TypeScript 接口继承与混合类型
linux·ubuntu·typescript
智者知已应修善业1 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
MediaTea1 小时前
Scikit-learn:从数据到结构——无监督学习的最小闭环
人工智能·学习·算法·机器学习·scikit-learn
智者知已应修善业2 小时前
【51单片机如何让LED灯从一亮到八,再从八亮到一】2023-10-13
c++·经验分享·笔记·算法·51单片机
@杰克成2 小时前
Java学习26
java·学习·idea
蜡笔婧萱2 小时前
Linux--远程登录服务ssh
linux·服务器·ssh
qeen872 小时前
【数据结构】二叉树相关经典函数C语言实现
c语言·数据结构·c++·笔记·学习·算法·二叉树
dingxingdi2 小时前
如何学习一个新的 Coding CLI 工具
学习
伏加特遇上西柚2 小时前
Loki+Alloy+Grafana日志采集部署
java·linux·服务器·spring boot·grafana·prometheus