1. 构建最小Coreboot固件

任务目标

从Coreboot源码构建一个针对QEMU(x86_64)的最小固件镜像,该镜像集成SeaBIOS作为payload,并能在QEMU中成功启动,最终进入SeaBIOS的启动菜单或直接引导默认启动设备。

环境与依赖

  • 操作系统:Linux(本文以Ubuntu 22.04为例)
  • 构建工具链:gcc、make、flex、bison、libncurses-dev、git
  • QEMU:qemu-system-x86(版本 ≥ 6.0)
  • Coreboot源码:版本 4.21 或更新(本文以4.21为例)

构建步骤

首先获取Coreboot源码并更新子模块(SeaBIOS作为payload需要从子模块获取):

git clone https://github.com/coreboot/coreboot.git
cd coreboot
git checkout 4.21
git submodule update --init --recursive

安装必要依赖(Ubuntu/Debian):

sudo apt-get install -y gcc make flex bison libncurses-dev libssl-dev python3-distutils

配置与编译

使用Coreboot的默认QEMU配置作为起点,通过make menuconfig进行最小化配置。关键配置项如下:

# 进入配置界面
make menuconfig

# 关键配置项(在menuconfig中设置):
# Mainboard -> Mainboard vendor: Emulation
# Mainboard -> Mainboard model: QEMU x86 q35
# Chipset -> Include northbridge initialization code: 保持默认
# Payload -> Add a payload: SeaBIOS
# Payload -> SeaBIOS version: master(或指定版本)
# 其余选项保持默认即可

保存配置后执行编译:

make -j$(nproc)

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

运行与验证

使用QEMU启动该固件镜像:

qemu-system-x86_64 -bios build/coreboot.rom -m 256M -serial stdio

验证通过条件:

  • QEMU窗口出现SeaBIOS版本信息(如“SeaBIOS (version ...)”);
  • 串口输出(-serial stdio)显示SeaBIOS启动日志,包含“Booting from”等字样;
  • 若未连接启动设备,SeaBIOS最终进入启动菜单(按F12可呼出),或显示“No bootable device”提示——这均表示Coreboot已成功将控制权移交给SeaBIOS payload。

最小化配置说明

上述配置中,Mainboard -> Mainboard model选择QEMU x86 q35是Coreboot官方为QEMU提供的虚拟主板支持,该配置会自动选择合适的内存控制器和CPU初始化代码。Payload选择SeaBIOS后,Coreboot会在启动流程末尾将控制权转交给SeaBIOS,由SeaBIOS负责后续的BIOS中断服务与启动设备选择。

若编译过程中出现缺少Kconfig依赖错误,请确认已执行git submodule update --init --recursive,因为3rdparty子模块(包含blobs和vfct等)是编译所必需的。

常见问题

  • 编译失败提示缺少__ASSEMBLER__定义:请更新gcc到版本8以上,或安装gcc-multilib。
  • QEMU启动后黑屏无输出:确认使用-serial stdio参数,Coreboot早期日志通过串口输出;若仍无输出,尝试-nographic参数。
  • SeaBIOS无法找到启动设备:这是正常现象,因为当前未挂载任何磁盘镜像。如需测试引导,可添加-hda disk.img参数挂载一个包含引导扇区的磁盘镜像。