bochs 中文文档 下载 App

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 游戏不需要一个完整的操作系统引导——你可以:

  1. 直接用 FreeDOS 软盘引导,然后在软盘里存游戏
  2. 或者创建一个 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)

Bochs 运行 Doom
Bochs 运行 Doom

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: sdlSDL 前端比 wxWidgets 更快
关闭鼠标/网络/声卡的额外开销OS 开发那套极简 bochsrc

但无论怎么调,Bochs 跑 DOS 游戏都不如 DOSBox 快——这是架构决定的。Bochs 的价值在精度,不在速度。

实用建议

想做什么用什么
纯玩 DOS 游戏DOSBox(速度快、配置简单)
研究 DOS 游戏的底层行为 / 逆向 DRMBochs(精度高、有调试器)
在 Windows 95/XP 里跑老应用Bochs + Windows 95/XP 镜像
给 Bochs 写一个"更快的模拟器"先跑 DOSBox 再跑 Bochs 对比两者差异