光盘与软盘镜像——ISO 启动和软盘引导的 bochsrc 配置
光盘(ISO)镜像配置
基本用法
ata1-master: type=cdrom, path="debian.iso", status=inserted
boot: cdrom, disk
| 字段 | 说明 |
|---|---|
type | cdrom(光盘专用,不要用 disk) |
path | ISO 文件路径 |
status | inserted(已插入)或 ejected(弹出) |
model | 光驱型号字符串(可选) |
biosdetect | BIOS 是否检测(默认 auto) |
光盘不需要 C/H/S 参数——ISO 9660 文件系统有自己的扇区布局,Bochs 能自动识别。
典型场景
Linux 发行版安装
ata0-master: type=disk, path="linux.img", mode=flat, cylinders=2482, heads=16, spt=63
ata1-master: type=cdrom, path="debian-12.iso", status=inserted
boot: cdrom, disk
先从光盘启动进入 Debian 安装器,装完改 boot: disk 从硬盘启动。
Windows XP 安装
ata0-master: type=disk, path="winxp.img", mode=flat, cylinders=1040, heads=255, spt=63
ata1-master: type=cdrom, path="winxp-sp3.iso", status=inserted
boot: cdrom, disk
注意 Windows 安装盘需要把启动顺序放在首位——boot: cdrom, disk。
动态弹出/更换
Bochs Launcher 或 bochsrc 都可以动态更换光盘:
- Launcher:菜单里找 CD-ROM → Change / Eject
- bochsrc:启动后通过运行时配置修改(需 Bochs 3.0+)
经典场景:装完系统,换一张驱动光盘继续装驱动。
软盘镜像配置
基本用法
floppyA: type=1_44, path="boot.img", status=inserted
boot: floppy
| 字段 | 说明 |
|---|---|
type | 软盘尺寸(决定容量和几何) |
path | 软盘镜像文件 |
status | inserted / ejected |
biosdetect | BIOS 是否检测(默认 auto) |
软盘的 type 值:
| type | 容量 | 说明 |
|---|---|---|
1_44 | 1.44 MB | 最常用的 3.5" 高密度盘 |
720k | 720 KB | 3.5" 低密度 |
2_88 | 2.88 MB | ED(Extra High Density) |
2_880 | 同上 | 别名 |
type 隐含了软盘的 C/H/S 参数——1.44MB 软盘默认是 80 cylinders × 2 heads × 18 sectors/track。
OS 开发场景:用软盘引导 Bootloader
这是 Bochs OS 开发实验的经典起步方式——因为软盘 0 道 0 头 1 扇区就是 Bootloader 的加载位置,恰好是物理地址 0x7c00。
# 1. 创建空白软盘镜像
bximage -q -create -fd -size 1_44M -filename boot.img
# 2. 写入 512 字节 Bootloader
dd if=bootloader.bin of=boot.img bs=512 count=1 conv=notrunc
# 3. bochsrc 里
floppyA: type=1_44, path="boot.img", status=inserted
boot: floppy
然后 bochsdbg 启动后:
bochs:1> b 0x7c00 # 在 Bootloader 入口下断点
bochs:2> c # 继续执行
# 第一次启动时 BIOS 会从软盘加载引导扇区到 0x7c00 然后跳转
# 调试器停住,你可以开始分析
这个流程是 MIT 6.828、哈工大操作系统等课程实验一的起步方式。
软盘里放更多数据
如果 Bootloader 需要读软盘上的内核文件(超过 512 字节),可以用 losetup 挂载软盘镜像、copy 内核文件进去:
sudo losetup /dev/loop0 boot.img
sudo mount -t vfat /dev/loop0 /mnt/floppy
cp kernel.bin /mnt/floppy/
sudo umount /mnt/floppy
sudo losetup -d /dev/loop0
软盘镜像可以格式化成 FAT12/FAT16——大多数老 OS 和 Bootloader 都支持。
光盘和软盘不能同时作为启动盘
boot: cdrom, floppy, disk # Bochs 会按这个顺序尝试
但有个陷阱:BIOS 启动顺序里光盘和软盘的优先级有时会有冲突——某些老 BIOS 的启动顺序是固定的,bochsrc 的 boot: 关键字可能不生效(取决于芯片组和 BIOS 版本)。如果遇到奇怪的启动行为,把不需要的设备禁用(注释掉 ata1-master 或 floppyA)更可靠。
软盘和 BIOS 启动签名
BIOS 判定软盘是否"可引导"的依据是引导扇区最后两个字节(偏移 0x1FE, 0x1FF)是否是 0x55 0xAA。OS 开发者写 Bootloader 时必须确保这两个字节在 510 和 511 位置。
如果 Bochs 报:
Boot failed: could not read the boot disk
检查一下你的 bootloader.bin 最后两个字节——大概率是没写 0x55AA 签名。
大小限制
- 软盘:最大 2.88 MB(type=2_88),对于纯引导实验足够(Bootloader 本身通常几 KB)
- 光盘:ISO 9660 标准最大 4GB(单文件系统),但实际 DVD-R ISO 可以到 4.7GB 甚至双层 8.5GB
对于 OS 内核(几十到几百 KB),软盘足够装 Bootloader,内核文件可以:
- 追加到软盘剩余空间
- 放在另一个硬盘镜像里,让 Bootloader 从硬盘读取
- 从光盘读取(适合更复杂的实验)