DOS 经典游戏运行——Doom Quake StarCraft 在 Bochs 里的体验
为什么在 Bochs 里跑 DOS 游戏
坦率说:如果只是想玩 DOS 游戏,用 DOSBox 更合适。DOSBox 专门为 DOS 游戏优化,跑 Doom 的帧率可以达到真实硬件的水平,而且配置简单(一条命令就搞定)。
但 Bochs 有 DOSBox 没有的东西:完整 x86 指令级精度。某些对硬件时序极其敏感的 DOS 软件(比如直接操作 VGA 寄存器做特效的 demo、1990 年代早期的某些 DRM 保护软件)在 DOSBox 里跑不起来,但在 Bochs 里可以——因为 Bochs 对硬件行为的模拟最细致。
Bochs 里跑 DOS 游戏的另一个价值是研究——你可以用调试器一步步追踪游戏的引导代码、检查它如何与 SB16 交互、观察它如何直接操作 VGA。对于逆向分析和硬件兼容性研究来说,Bochs 是无价的工具。
bochsrc 典型配置
# DOS 游戏推荐配置
romimage: file=BIOS-bochs-latest, address=0xfffc0000
vgaromimage: file=VGABIOS-lgpl-latest.bin
cpu: model=pentium, count=1, ips=10000000
memory: guest=16, host=16 # DOS 游戏通常 8-16MB 足够
ata0-master: type=disk, path="dos.img", mode=flat, cylinders=306, heads=4, spt=17
# 或者直接用软盘启动 FreeDOS
floppyA: type=1_44, path="freedos.img", status=inserted
boot: disk # 或 boot: floppy 用 FreeDOS 引导
vga: extension=std, update_freq=10
keyboard: keymap=us
mouse: enabled=1 # DOS 游戏通常需要鼠标
display_library: wx
# SB16 声卡——DOS 游戏音效必备
sb16: enabled=1, midimode=dummy, wavemode=wav, waveintfreq=44100
# NE2000 网卡——某些游戏支持联网对战
ne2k: enabled=1, mac=00:40:3c:00:00:01, ethmod=slirp, script=
log: bochsout.txt
panic: action=ask
FreeDOS 引导 vs MS-DOS
Bochs 官方页面提供 FreeDOS 引导镜像下载——推荐用 FreeDOS,免费且开源。MS-DOS 涉及版权问题。
DOS 游戏不需要一个完整的操作系统引导——你可以:
- 直接用 FreeDOS 软盘引导,然后在软盘里存游戏
- 或者创建一个 DOS 分区的硬盘镜像,把游戏放进去
第二种方式更好——DOS 游戏通常几百 MB 到几 GB,软盘放不下。
把游戏安装到 Bochs 磁盘
最简单的方式:在宿主操作系统里用 mount 挂载 Bochs 磁盘,把游戏文件拷进去,然后再卸载。
# Linux
sudo mount -o loop,offset=32256,loop=off dos.img /mnt/bochs-dos
cp -r doom/ /mnt/bochs-dos/
sudo umount /mnt/bochs-dos
Windows 上用 OSFMount 挂载 flat 磁盘,然后直接资源管理器里复制。
为什么 offset=32256?DOS 的 FAT 文件系统有 63 扇区的隐藏区域(引导扇区 + FAT 表 + 根目录),所以数据区起始偏移是 63 × 512 = 32256 字节。
典型游戏体验
Doom(经典 FPS)

- 系统需求:Pentium 90、16MB RAM、SB16
- Bochs 里的速度:远慢于真实硬件——因为 Bochs 是指令级模拟。Doom 是一个指令密集型游戏,在 Bochs 里可能帧率只有 5-15 fps(真实硬件是 60+)
- 兼容性:完美——Doom 的 VGA 模式直接写寄存器是 Bochs 完整模拟的
- 音效:SB16 配置好后有声音(录成 wav 自己后期播放)
Quake
比 Doom 要求高得多(3D 软件光栅化)。在 Bochs 里速度可能只有几 fps。Quake 有 VESA 支持,Bochs 的 VBE 可以正常工作。
StarCraft
需要更高内存(32MB+)和更多磁盘空间。Windows 95/98 里运行更合适(不推荐纯 DOS 下跑 SC)。
老式益智/策略游戏
如 Civilization II、SimCity 2000、Age of Empires I——2D 游戏对 CPU 压力小一些,在 Bochs 里可能能玩(虽然还是慢)。
用 Bochs 调试 DOS 游戏
这是 DOSBox 完全做不到的事——你可以在 Bochs 调试器里:
追踪游戏的引导过程
bochs:1> pb 0x7c00
bochs:2> c
bochs:3> u 0x7c00 16 # 反汇编游戏的引导代码
观察 VGA 寄存器访问
游戏直接写 VGA 端口做图形操作时:
bochs:4> watch write 0x3c0 # 所有对 VGA 属性端口的写入
bochs:5> c
# 每次游戏改 VGA 调色板,调试器停住——你可以对比前后状态
观察 SB16 DMA 传输
游戏初始化 SB16 声卡并触发 DMA 传输播放音效时:
bochs:6> watch write 0x220 # SB16 默认基址
逆向 DRM 保护
1990 年代早期的 DOS 游戏常用基于软盘的 DRM——比如要求插入特定扇区的软盘才能运行。Bochs 对软盘扇区访问的精确模拟让你可以追踪 DRM 的每一次"检查扇区"调用。
性能调优
Bochs 跑 DOS 游戏的速度主要取决于 CPU 模拟速度。几个调整参数:
| bochsrc 字段 | 说明 |
|---|---|
ips=100000000 | 提高 IPS 节流参数让 Bochs 跑更快(新宿主机 CPU 可以到 100M+) |
update_freq=20 | 提高 VGA 刷新频率让图形更流畅 |
display_library: sdl | SDL 前端比 wxWidgets 更快 |
| 关闭鼠标/网络/声卡的额外开销 | OS 开发那套极简 bochsrc |
但无论怎么调,Bochs 跑 DOS 游戏都不如 DOSBox 快——这是架构决定的。Bochs 的价值在精度,不在速度。
实用建议
| 想做什么 | 用什么 |
|---|---|
| 纯玩 DOS 游戏 | DOSBox(速度快、配置简单) |
| 研究 DOS 游戏的底层行为 / 逆向 DRM | Bochs(精度高、有调试器) |
| 在 Windows 95/XP 里跑老应用 | Bochs + Windows 95/XP 镜像 |
| 给 Bochs 写一个"更快的模拟器" | 先跑 DOSBox 再跑 Bochs 对比两者差异 |