4. 使用QEMU启动U-Boot并进入命令行

任务目标

本案例要求使用U-Boot源码树自带的默认配置完成一次通用编译,最终在源码目录下生成u-boot.bin(或u-boot ELF文件)等关键构建产物。该过程验证交叉编译工具链与源码配置的匹配性,为后续针对具体开发板的定制编译建立基线。

环境与依赖

  • Linux主机(x86_64或aarch64均可),已安装make、gcc等基础构建工具。
  • 交叉编译工具链(若目标为ARM板卡):arm-linux-gnueabihf- 系列,需提前加入PATH。
  • U-Boot源码树(版本≥2020.01),已解压至工作目录。

实现步骤与代码

U-Boot的编译分为两步:先加载默认配置,再执行编译。以下命令在U-Boot源码根目录下执行。

# 1. 加载通用默认配置(以qemu-arm为例,该配置不依赖具体硬件外设)
make qemu-arm_defconfig

# 2. 执行编译,生成u-boot.bin
#    若使用交叉编译,需指定CROSS_COMPILE前缀
make CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)

若主机未安装ARM交叉工具链,可先使用原生x86配置验证编译流程:

# 原生编译(仅用于验证工具链与源码完整性)
make sandbox_defconfig
make -j$(nproc)

关键产物说明

编译成功后,源码根目录下应出现以下文件(以qemu-arm_defconfig为例):

  • u-boot:ELF格式的U-Boot可执行文件,含调试符号。
  • u-boot.bin:纯二进制镜像,可直接烧录或加载。
  • u-boot.map:链接映射文件,记录符号地址分布。
  • config.mk / include/config.h:由默认配置自动生成的编译配置头文件。

验证方法与判定标准

执行以下命令确认构建产物完整且可识别:

# 检查关键文件是否存在且非空
ls -l u-boot u-boot.bin

# 查看二进制文件头,确认架构正确(ARM 32位输出 "ELF 32-bit LSB executable, ARM")
file u-boot

判定通过的三个条件:

  1. make命令以退出码0结束,无Error或undefined reference报错。
  2. u-boot.bin文件存在且大小大于100KB(不同配置略有差异,但不应为0字节)。
  3. file u-boot输出的架构信息与CROSS_COMPILE指定的目标架构一致(例如ARM交叉编译应显示ARM架构)。

常见问题

  • 错误:arm-linux-gnueabihf-gcc: command not found —— 工具链未安装或未加入PATH,请先安装交叉编译器或使用路径。
  • 错误:make[1]: *** No rule to make target 'qemu-arm_defconfig' —— 源码目录不正确或源码不完整,确认在U-Boot根目录执行,且configs/目录下存在对应defconfig文件。
  • 编译中断于scripts/dtc —— 缺少设备树编译器依赖,执行apt install device-tree-compiler(Debian/Ubuntu)后重新编译。

本案例仅验证通用编译流程,生成的u-boot.bin为QEMU虚拟平台镜像,不可直接烧录至真实ARM开发板。针对具体板卡的配置与编译将在后续案例中展开。