2. 了解U-Boot配置系统

任务目标

本案例要求理解U-Boot配置系统中Kconfig与defconfig的分工,并掌握通过menuconfig进行交互式配置的方法。完成本案例后,你应能解释“defconfig提供默认值、Kconfig定义选项结构、menuconfig生成最终.config”这一链路,并能实际操作生成自定义配置。

核心概念与配置链路

U-Boot采用与Linux内核相同的Kconfig配置系统,其工作流程如下:

  1. Kconfig文件:分布在源码各目录中,定义配置选项的层次结构、类型、依赖关系和帮助文本。例如arch/arm/Kconfig定义CPU架构选项,common/Kconfig定义通用功能。
  2. defconfig文件:位于configs/目录,是某板卡的最小默认配置,只包含与默认值不同的选项。例如configs/stm32mp15_basic_defconfig仅列出该板卡需要覆盖的几十个选项。
  3. menuconfig:基于.config的交互式界面,读取Kconfig结构后允许逐项修改,最终写回.config。

三者关系:make xxx_defconfig将defconfig展开为完整.config(未指定的选项取Kconfig中的默认值);make menuconfig在.config基础上可视化调整;最终.config驱动编译过程。

环境准备

本案例以U-Boot v2024.01源码树为例(任意近期版本均可)。需确保已安装ncurses开发库(menuconfig依赖):

# Ubuntu/Debian
sudo apt install libncurses5-dev libncursesw5-dev
# 若尚未下载源码
git clone https://github.com/u-boot/u-boot.git
cd u-boot
git checkout v2024.01

操作步骤与验证

以下操作在U-Boot源码根目录执行:

# 1. 生成默认配置(以qemu-arm为例)
make qemu_arm_defconfig

# 2. 查看生成的.config(确认defconfig已展开为完整配置)
grep CONFIG_CMD_BOOTM .config

# 3. 启动menuconfig交互界面
make menuconfig

在menuconfig界面中:

  • 进入Command line interface -> Shell commands,找到bootm命令,按Y选中、N取消、M设为模块(U-Boot中通常仅Y/N)。
  • 按/键可搜索选项名,例如输入BOOTM查看其依赖关系与当前位置。
  • 修改后选择Save保存到.config,然后Exit退出。

验证方法:退出menuconfig后执行grep CONFIG_CMD_BOOTM .config,观察其值是否与你在界面中的选择一致。若你取消了bootm,则显示# CONFIG_CMD_BOOTM is not set;若保留则显示CONFIG_CMD_BOOTM=y。同时对比configs/qemu_arm_defconfig文件内容——该文件通常不包含CONFIG_CMD_BOOTM,说明该选项取的是Kconfig默认值,而你在menuconfig中的修改只影响当前.config,不会改动defconfig文件本身。

Kconfig与defconfig的差异验证

为直观理解两者分工,执行以下对比:

# 查看defconfig中实际设置的选项数量
wc -l configs/qemu_arm_defconfig

# 查看完整.config的选项数量
wc -l .config

典型结果:defconfig约50~80行,而.config超过2000行。这证明defconfig仅覆盖少量非默认选项,其余全部由Kconfig的default属性补齐。若要查看某个选项的默认值来源,可打开对应Kconfig文件搜索该选项定义,例如grep -n "config CMD_BOOTM" -A 10 cmd/Kconfig,其中default y即默认启用原因。

常见问题

  • menuconfig无法启动:报错Unable to find the ncurses libraries,按上文安装依赖后重新执行。
  • 修改未生效:menuconfig保存后必须确认写入的是.config而非其他文件名;若误存为.config.old,需手动覆盖。
  • defconfig被意外修改:menuconfig只写.config,不会改动configs/下的文件。若需永久修改默认配置,应编辑defconfig文件后重新执行make xxx_defconfig。

配置依赖关系示意

Kconfig 文件 定义选项结构/默认值 arch/arm/Kconfig 等 defconfig 文件 板卡默认配置覆盖 configs/qemu_arm_defconfig .config 完整配置(展开后) make xxx_defconfig 生成 menuconfig 交互式修改 .config 保存 驱动编译

上图展示了配置生成与回写的完整路径:make xxx_defconfig合并Kconfig默认值与defconfig覆盖项生成.config;menuconfig读取并允许修改.config,保存后写回;最终编译阶段读取.config决定编译哪些文件、启用哪些功能。

关键代码位置参考

本案例不涉及编写C代码,但需了解以下文件在配置系统中的作用:

  • scripts/kconfig/conf.c:defconfig解析与.config生成的主程序。
  • scripts/kconfig/mconf.c:menuconfig界面实现。
  • Kconfig(根目录):顶层配置入口,通过source引入各子目录Kconfig。

若需自定义板卡配置,标准做法是:在configs/下新建myboard_defconfig,写入CONFIG_XXX=y形式的覆盖项,然后执行make myboard_defconfig即可生成对应.config。