3. 使用QEMU运行Coreboot

任务目标

在本案例中,我们将构建一个最小的Coreboot固件镜像,并使用QEMU虚拟机启动它,验证固件能够正常执行并输出调试信息。通过本案例,你将掌握Coreboot的编译流程、QEMU运行环境配置以及固件启动成功的基本判定方法。

环境与依赖

  • 操作系统:Linux(推荐Ubuntu 22.04+)
  • 必要工具:git、make、gcc、g++、flex、bison、libncurses-dev、qemu-system-x86
  • Coreboot源码:版本4.21或更新(本案例使用4.21)

安装依赖(Ubuntu/Debian):

sudo apt update
sudo apt install -y git make gcc g++ flex bison libncurses-dev qemu-system-x86

实现步骤

1. 获取Coreboot源码并配置

git clone https://github.com/coreboot/coreboot.git
cd coreboot
git checkout 4.21
make crossgcc-i386 CPUS=$(nproc)   # 编译i386交叉工具链,约需10-20分钟

2. 配置Coreboot构建

使用make menuconfig进行配置,关键选项如下:

make menuconfig

在菜单中设置:

  • Mainboard → Mainboard vendor → Emulation
  • Mainboard model → QEMU x86 i440fx/piix4
  • Chipset → 保持默认(自动匹配QEMU的i440fx芯片组)
  • Devices → Graphics initialization → 保持默认(不需要图形输出)
  • Console → Console output → 确保Serial console和VGA console已启用(默认启用)
  • Payload → 选择none(本案例仅验证Coreboot自身启动,不加载额外负载)

保存并退出。

3. 编译Coreboot镜像

make -j$(nproc)

编译完成后,生成的镜像文件位于build/coreboot.rom。

4. 使用QEMU运行

qemu-system-x86_64 -M q35 -m 512M -serial stdio -display none -bios build/coreboot.rom

参数说明:

  • -M q35:使用Q35芯片组(与Coreboot的QEMU目标匹配)
  • -serial stdio:将串口输出重定向到终端
  • -display none:禁用图形显示(纯串口验证)
  • -bios:指定Coreboot镜像

验证方法与判定标准

运行上述QEMU命令后,观察终端输出。判定成功的标准:

  1. 终端出现Coreboot启动日志,包含类似以下内容:
coreboot-4.21-0-g... Mon Jan  1 00:00:00 UTC 2024 starting...
...
  1. 日志中出现coreboot: starting...或Welcome to coreboot字样,表明固件已成功执行到主初始化流程。
  2. 若配置了串口控制台,日志中会显示UART: configured等串口初始化信息。
  3. QEMU进程不会崩溃退出,而是持续运行(等待进一步指令或保持空闲)。

如果看到上述输出,说明Coreboot已在QEMU中成功启动。若没有任何输出或QEMU立即退出,请检查:

  • 是否选择了正确的板卡型号(Emulation → QEMU x86 i440fx/piix4)
  • 串口重定向参数是否正确(-serial stdio)
  • 交叉工具链是否完整编译(make crossgcc-i386)

常见问题

  • 编译失败:确认已安装所有依赖,且make crossgcc-i386成功完成。
  • QEMU无输出:尝试去掉-display none,使用-vga std查看VGA输出;或检查串口参数是否与Coreboot配置一致。
  • 芯片组不匹配:确保QEMU使用-M q35,与Coreboot的QEMU目标匹配。

本案例完成了从源码编译到QEMU运行的最小闭环,验证了Coreboot固件的基本启动能力。后续案例将在此基础上添加Payload和更多外设支持。