内存与 CPU 配置——模拟什么型号的 CPU、给多少内存
cpu: 关键字
cpu: model=pentium4, count=1, ips=10000000, reset_on_triple_fault=1
常用字段:
| 字段 | 说明 | 默认值 |
|---|---|---|
model | CPU 型号 | sx(i386) |
count | CPU 核心数(SMP 支持) | 1 |
ips | 每秒指令数(影响执行速度的节流参数) | 10000000 |
quantum | SMP 下每次执行多少指令后切换核心 | 250 |
time0 / time1 | PIT / APIC 定时器频率偏移 | 0 |
reset_on_triple_fault | 三重故障时是否重启(OS 开发常用) | 1 |
ignore_bad_msr | 是否忽略写入不存在的 MSR | 0 |
exception_on_unimplemented | 遇到未实现的指令是否抛异常 | 0 |
CPU 型号选择
Bochs 模拟的 CPU 型号覆盖了 386 到最新的 Intel Core 和 AMD Ryzen:
| model 值 | 真实硬件 | 指令集覆盖 | 适用场景 |
|---|---|---|---|
sx | Intel 386 | 32 位基础 | OS 教学起步(最简单) |
dx | Intel 486 | 32 位 + FPU | 较老教学场景 |
pentium | Pentium MMX | P6 + MMX | 经典 Win95/98 |
pentium2 | Pentium II | P6 + SSE + 段寄存器 | Win2000 |
pentium3 | Pentium III | P6 + SSE | WinXP |
pentium4 | Pentium 4 | NetBurst + SSE2 + HT | WinXP / Linux 开发 |
coreduo | Core Duo | Core + SSE3 + SSSE3 | 现代 Linux / Windows |
nehalem | Core i7 一代 | Nehalem + SSE4 + AES + VMX | 最新 x86-64 |
sandybridge / ivybridge / haswell / broadwell / skylake / coffee / alderlake | 各代 Core | 各代特性 + AVX/AVX2/AVX-512 | 追求最新指令集 |
OS 开发选 pentium4 或 coreduo 就够了——足够新支持常用特性,又不会太复杂。
经典系统跑 Win95 选 pentium 或 pentium2,跑 WinXP 选 pentium4。
ips 参数是什么意思
Bochs 的 CPU 完全是软件模拟的,执行速度取决于宿主机性能。ips 是 Bochs 用来节流的参数——告诉 Bochs "我要模拟一颗每秒能跑 N 条指令的 CPU"。如果宿主机跑得太快,Bochs 会自动休眠让模拟速度降下来。
- 宿主机很快(新 CPU):设大一点(如
ips=20000000)让模拟更流畅 - 宿主机较慢:设小一点(如
ips=5000000)避免节流带来的延迟 - 不需要精确节流:设
ips=100000000(很高),Bochs 基本不休眠
OS 开发对 ips 不敏感(跑纯内核代码本来就很快),经典系统跑 UI 时调一下可以改善流畅度。
SMP 多核心
cpu: model=pentium4, count=2, ips=10000000
Bochs 最多模拟 8 个核心。SMP 场景下 quantum 参数控制每次执行多少指令后切换核心(默认 250)。研究多核调度或 Linux 内核 SMP 支持时开。
memory: 关键字
memory: guest=64, host=64
guest:客户机能看到的物理内存大小(MB)host:宿主机为 Bochs 进程分配的内存(MB)
两者通常相等。Bochs 建议 host 略大于 guest(留一些给视频 RAM),但实际相等也没问题。
内存太小会导致某些系统启动失败:
| 系统 | 推荐内存 |
|---|---|
| DOS | 4~8 MB |
| Windows 95/98 | 32~64 MB |
| Windows XP | 128~256 MB |
| Windows 7 | 512~1024 MB |
| Linux(桌面) | 256~512 MB |
| OS 开发内核实验 | 32~128 MB |
reset_on_triple_fault
OS 开发者的利器。当内核发生 triple fault(连续 3 次异常都找不到可用的异常处理)时:
- 默认
reset_on_triple_fault=1:Bochs 重启模拟机 - 设
reset_on_triple_fault=0:Bochs 停住,你可以用调试器查看崩溃瞬间的寄存器和内存
写内核的人通常设 0,这样 crash 后可以直接在调试器里看现场。
一份实用模板
# OS 开发推荐 CPU/内存配置
cpu: model=pentium4, count=1, ips=15000000, reset_on_triple_fault=0
memory: guest=64, host=64
# Windows 95 推荐
cpu: model=pentium, count=1, ips=8000000
memory: guest=32, host=32
# Windows XP 推荐
cpu: model=pentium4, count=1, ips=15000000
memory: guest=256, host=256
# Windows 7 推荐
cpu: model=coreduo, count=2, ips=15000000
memory: guest=1024, host=1024