2. 配置串口调试输出

任务目标

在Coreboot配置中启用UART串口(以16550兼容串口为例),使启动日志能够通过串口输出到调试终端。本案例基于QEMU x86平台完成最小可复现配置与验证。

环境与依赖

  • Coreboot源码(4.21及以上版本),已安装构建依赖(gcc、make、flex、bison等)
  • QEMU模拟器(用于验证,无需真实硬件)
  • 串口终端工具:Linux下使用screen或minicom,或QEMU的-serial stdio直接输出到当前终端

配置步骤

Coreboot的串口配置分为两个层面:主板的Kconfig配置(决定是否编译串口驱动)和bootblock/romstage/ramstage的运行时初始化。对于QEMU x86(i440fx)平台,使用默认的qemu-i440fx主板配置即可,只需修改其Kconfig开启串口支持。

进入Coreboot源码目录,执行以下操作:

  1. 选择主板:make menuconfig,依次进入 Mainboard → Mainboard vendor → Emulation → QEMU x86 i440FX(或直接编辑configs/config.emulation_qemu-i440fx)。
  2. 启用串口:在 Devices 菜单中,确保 Serial port on Super I/O 和 Enable early (bootblock) console output 已开启。对于QEMU i440fx,还需确认 Console → Send console output to a serial port 被选中,且串口地址为默认的 0x3f8(COM1)。

为便于自动化构建,直接使用以下配置片段(保存为.config关键行):

关键完整代码

以下为最小配置修改(基于Coreboot 4.21的configs/config.emulation_qemu-i440fx,仅列出与串口相关的差异项):

# 在configs/config.emulation_qemu-i440fx中追加或修改:
CONFIG_CONSOLE_SERIAL=y
CONFIG_UART_FOR_CONSOLE=0
CONFIG_DRIVERS_UART_8250IO=y
CONFIG_CONSOLE_CBMEM_DUMP_TO_UART=n
CONFIG_EARLY_PCI_BRIDGE=n
CONFIG_BOOTBLOCK_CONSOLE=y
CONFIG_POST_DEVICE=n
CONFIG_HAVE_ACPI_RESUME=n

其中:

  • CONFIG_CONSOLE_SERIAL:总开关,启用串口作为控制台输出。
  • CONFIG_UART_FOR_CONSOLE=0:选择UART0(I/O端口0x3f8)。
  • CONFIG_DRIVERS_UART_8250IO:使用8250 I/O映射驱动(QEMU默认支持)。
  • CONFIG_BOOTBLOCK_CONSOLE:在bootblock阶段即输出日志(早期调试必需)。

若使用menuconfig手动配置,上述选项对应位置为:Console → Send console output to a serial port、Console → UART for console、Drivers → UART 8250 I/O。

构建与运行

# 1. 清理旧配置并加载修改后的配置
make distclean
make defconfig KBUILD_DEFCONFIG=configs/config.emulation_qemu-i440fx
# 若手动修改了.config,则直接执行:
# make olddefconfig

# 2. 编译(生成build/coreboot.rom)
make -j$(nproc)

# 3. 用QEMU启动,串口重定向到当前终端
qemu-system-x86_64 -bios build/coreboot.rom -serial stdio -display none

验证方法与判定标准

执行上述QEMU命令后,当前终端应立即开始滚动Coreboot启动日志。判定通过的标志:

  1. 日志首行出现类似 coreboot-4.21-xxxx Mon Jan 01 00:00:00 UTC 2024 bootblock starting... 的信息。
  2. 日志中包含 UART: configured 或串口初始化成功的提示(具体文本随版本略有差异)。
  3. 日志持续输出至 Jumping to boot code 或 Payload loaded 为止,期间无乱码、无重复字符。

若终端无输出,按以下顺序排查:

  • 确认.config中CONFIG_CONSOLE_SERIAL=y且CONFIG_UART_FOR_CONSOLE=0(而非其他值)。
  • 确认QEMU命令包含-serial stdio,且未同时使用-nographic(两者会冲突)。
  • 检查是否误将CONFIG_DRIVERS_UART_8250IO关闭——QEMU i440fx不提供PCI串口,必须使用I/O映射的16550。

常见问题

  • 日志输出到VGA而非串口:检查CONFIG_CONSOLE_SERIAL是否为y,且CONFIG_CONSOLE_VGA是否为n(两者可同时开启,但串口必须为y)。
  • bootblock阶段无输出但romstage有输出:确认CONFIG_BOOTBLOCK_CONSOLE=y,否则早期初始化失败信息无法看到。
  • 串口输出乱码:波特率不匹配。Coreboot默认115200 8N1,QEMU的-serial stdio直接透传不校验波特率,但若使用真实串口工具需设置为115200。