在 X86 架构,内核启动之前需要先运行 BIOS 初始化基础的硬件,将硬件环境初始化到一个已知状态,以便将内核加载到一个可靠的环境里. 本文基于 BiscuitOS 的 SeaBIOS 提供了一种调试 BIOS 代码逻辑的工具,以便开发者可以实践和调试 BIOS 代码逻辑,接下来一步步介绍如何实践,参考如下命令(在部署之前请确保已经部署 BiscuitOS 开发环境,如果未部署请参考 《BiscuitOS 用户手册 - 1.2》:

# 切换到 BiscuitOS 项目目录
cd */BiscuitOS
# 选择开发环境,如果已经选择过可以跳过,这里与 linux 6.10 X86 为例
make linux-6.10-x86_64_defconfig
make docker
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig

  [*] Package  --->
      [*] BiscuitOS Debug Stub Set
          [*] BiscuitOS BOOT BIOS

# 配置完毕保存,然后进行部署
make

# 切换到实践案例所在目录
cd /BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-DEBUG-BOOT-BIOS-default
# 准备依赖工具
make prepare
# 编译实践案例
make download
# 编译 seaBIOS
make

运行上述命令之后,系统会自动下载最新的 SeaBIOS 源码,然后编译 SeaBIOS,编译成功之后,准备两个终端,使用如下命令:

# 终端 1
cd /BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-DEBUG-BOOT-BIOS-default/BiscuitOS-DEBUG-BOOT-BIOS-default/src
vi post.c +197

# 终端 2
cd /BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-DEBUG-BOOT-BIOS-default
make debug-client

# 终端 3
cd /BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-DEBUG-BOOT-BIOS-default
make debug

“终端1” 用于查看 BIOS 源码, “终端2” 用于输出 BIOS 阶段的调试信息,”终端3” 则用于编译和运行 BIOS. 开发者可以在源码中使用 “dprintf(1, “Hello BiscuitOS”);” 方式向 “终端2” 输出调试信息.