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参数挂载一个包含引导扇区的磁盘镜像。