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 等语法,读者可自行查找资料,这里只是引入一个简单例子方便读者理解原理。

相关推荐
LinXunFeng2 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
zzzzzz31015 小时前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode16 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒3 天前
TShark:基础知识
linux
AlfredZhao3 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334664 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪4 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql