启动顺序配置——从硬盘软盘光盘还是网络启动
boot 关键字格式
boot: device1, device2, device3
有效值:floppy(软盘 A)、disk(ATA 硬盘)、cdrom(ATA 光盘)、network(PXE 网络)、none。逗号分隔多个表示"依次尝试,哪个能引导就用哪个"。
示例:
boot: disk
→ 只从硬盘启动,不行就报错。
boot: floppy, disk, cdrom
→ 先试软盘,不行试硬盘,最后试光盘。
OS 开发场景的典型配置
场景一:用软盘引导 Bootloader
Bootloader 实验最常用的起步方式——在软盘镜像 boot.img 首扇区写入 512 字节引导代码:
floppyA: type=1_44, path="boot.img", status=inserted
boot: floppy
BIOS 上电后会从软盘 0 道 0 头 1 扇区读 512 字节到物理地址 0x7c00,然后跳转到 0x7c00 执行——这就是你的 Bootloader。
场景二:硬盘引导完整内核
Bootloader 从软盘转移到硬盘后:
ata0-master: type=disk, path="os.img", mode=flat, cylinders=121, heads=16, spt=63
boot: disk
场景三:光盘引导 Linux 安装
ata0-master: type=disk, path="winxp.img", mode=flat, cylinders=1040, heads=255, spt=63
ata1-master: type=cdrom, path="linux.iso", status=inserted
boot: cdrom, disk
先试光盘(如果是 Linux 安装盘就进入安装器),不行回退到硬盘启动 Windows XP。
启动顺序的底层含义
真实 PC 上,启动顺序由 BIOS 的 BBS(Boot BIOS Specification)表决定。Bochs 的 boot: 关键字简化了这个机制——你写的设备名决定了 Bochs BIOS 在 POST 结束后按什么顺序尝试加载引导扇区。
"能引导"的判断标准很简单:读取设备的第一个扇区(引导扇区),检查最后两字节是否是 0x55 0xAA。这就是常说的引导扇区签名。
OS 开发者写 Bootloader 时必须在引导扇区的 511 和 512 字节位置(偏移 0x1FE 和 0x1FF)写入这两个字节,否则 BIOS 不会认它是可引导的。
报错与排查
Boot failed: could not read the boot disk
Bochs 找不到可引导设备。检查:
- bochsrc 里
boot:写了什么——如果你只写了disk但没配ata0-master,自然找不到 - 磁盘镜像是否正确插入(
status=inserted) type=unknown让 Bochs 自动检测时可能识别失败,改成显式type=disk或type=cdrom
Boot from CD-ROM... 然后黑屏
BIOS 检测到光盘可引导(读到 0x55AA 签名),开始加载光盘引导代码,但引导代码本身有问题——这不是 Bochs 的配置问题,是你写入光盘 ISO 的引导器有问题。
设置 boot: none 可以让 Bochs 启动到 BIOS POST 界面后就停住(不尝试引导任何设备),方便 OS 开发者在这个时机手动做一些硬件初始化调试。