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/piix4Payload→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 禁用图形窗口。
验证方法与通过条件
- 串口输出:终端应显示Coreboot启动日志,包含类似
coreboot-24.02 ... booting的信息,随后SeaBIOS启动并显示版本号。 - Payload执行:SeaBIOS启动后,若配置了启动设备,会尝试从QEMU的虚拟磁盘引导;若未配置磁盘,则进入SeaBIOS的交互菜单(按F12选择启动设备)。
- 判定通过:看到串口输出中出现
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虚拟磁盘并安装操作系统,不属于本案例范围。