3. 使用QEMU模拟器运行Coreboot

任务目标

本案例目标是在无真实硬件的情况下,使用QEMU模拟器启动一个最小化的Coreboot固件,验证Coreboot的编译产物能够在模拟的x86环境中完成基本的初始化并跳转到payload执行。通过本案例,你将掌握Coreboot的配置、交叉编译以及QEMU运行验证的完整闭环。

环境与依赖

  • 操作系统:Linux(Ubuntu 22.04+ 或 Debian 12+,x86_64 主机)
  • 依赖包:build-essential、git、flex、bison、libncurses-dev、qemu-system-x86
  • Coreboot源码:版本 24.02 或更新(本案例以 24.02 为例)

安装依赖:

sudo apt update && sudo apt install -y build-essential git flex bison libncurses-dev qemu-system-x86

实现步骤

1. 获取Coreboot源码并准备工具链

git clone https://github.com/coreboot/coreboot.git
cd coreboot
git checkout 24.02
make crossgcc-i386 CPUS=$(nproc)   # 构建i386交叉编译器,耗时较长

2. 配置Coreboot(使用默认QEMU目标)

make menuconfig   # 或使用以下非交互方式直接写入 .config

在menuconfig中依次设置:

  • Mainboard → Mainboard vendor → Emulation → QEMU x86 i440fx/piix4
  • Payload → Add a payload → SeaBIOS(或选择 coreinfo 作为轻量payload)
  • 其余选项保持默认,保存退出。

若使用非交互方式,可直接创建 .config 文件(内容见下方代码块),然后执行 make olddefconfig 生成完整配置。

3. 编译Coreboot

make -j$(nproc)

编译完成后,生成的核心文件为 build/coreboot.rom。

关键完整代码

以下为最小化的 .config 文件内容(可直接保存为 .config 使用),它指定了QEMU目标主板、串口调试输出以及SeaBIOS作为payload:

CONFIG_VENDOR_EMULATION=y
CONFIG_BOARD_EMULATION_QEMU_X86_I440FX=y
CONFIG_PAYLOAD_SEABIOS=y
CONFIG_DRIVERS_UART_8250IO=y
CONFIG_CONSOLE_SERIAL=y
CONFIG_CONSOLE_SERIAL_UART0=y
CONFIG_UART_FOR_CONSOLE=0
CONFIG_HAVE_MONOTONIC_TIMER=y
CONFIG_USE_OPTION_TABLE=n
CONFIG_NO_POST=y
CONFIG_BOOTBLOCK_NORMAL=y
CONFIG_CBFS_SIZE=0x200000

保存后执行:

make olddefconfig
make -j$(nproc)

运行与验证

启动QEMU

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

参数说明:-M pc 模拟i440fx芯片组,-serial stdio 将串口输出重定向到终端,-display none 禁用图形窗口。

验证方法与通过条件

  1. 串口输出:终端应显示Coreboot启动日志,包含类似 coreboot-24.02 ... booting 的信息,随后SeaBIOS启动并显示版本号。
  2. Payload执行:SeaBIOS启动后,若配置了启动设备,会尝试从QEMU的虚拟磁盘引导;若未配置磁盘,则进入SeaBIOS的交互菜单(按F12选择启动设备)。
  3. 判定通过:看到串口输出中出现 SeaBIOS 版本行,且无 FATAL 或 ERROR 字样,即表示Coreboot在QEMU中成功完成初始化并跳转至payload。

预期输出(确定性结果)

由于QEMU环境固定且Coreboot启动流程确定,串口输出的前几行应为:

coreboot-24.02-0-g-- Tue Jan  1 00:00:00 UTC 2024 booting (use timestamps)
...

随后出现SeaBIOS的版本信息:

SeaBIOS (version 24.02)

常见问题

  • 编译失败提示缺少ncurses:安装 libncurses-dev 后重新执行 make menuconfig。
  • QEMU无输出:确认 -serial stdio 参数已添加,且 .config 中串口控制台已启用(CONFIG_CONSOLE_SERIAL=y)。
  • SeaBIOS无法引导磁盘:本案例仅验证固件启动,不涉及磁盘镜像;如需引导系统,需额外创建QEMU虚拟磁盘并安装操作系统,不属于本案例范围。