VGA 显卡与显示——Cirrus GD5446、Bochs VBE 和显示模式配置
Bochs 模拟的 VGA 型号
| VGA 型号 | bochsrc 值 | 说明 | 适用 |
|---|---|---|---|
| 默认 Bochs VGA | vga: extension=std | 基本 VGA/SVGA,支持 Bochs VBE 扩展 | OS 开发、简单 DOS |
| Cirrus Logic GD5446 | vga: extension=cirrus | 经典 PCI 显卡,支持 SVGA 高分辨率 | Windows 95/98/ME/2000/XP、Linux |
| S3 Trio 64 | vga: extension=s3 | 另一款经典 PCI 显卡 | 某些老软件兼容性 |
OS 开发场景建议用 std——简单、好控制,不需要高分辨率显示。经典系统(Windows 95/XP)建议用 cirrus——更接近真实 PC 的显卡,驱动完善。
bochsrc 里的 vga 配置
# OS 开发推荐
vga: extension=std, update_freq=10
# Windows 95/XP 推荐
vga: extension=cirrus, update_freq=5
# S3 Trio
vga: extension=s3, update_freq=10
| 字段 | 说明 |
|---|---|
extension | VGA 型号 |
update_freq | 显示刷新频率(次/秒)——数值越小刷新越频繁、速度越慢 |
real_flush | 是否在 VGA 写操作时立即刷新(影响 DOS 程序直接写显存的场景) |
update_freq 是性能调优参数:Bochs 的图形刷新是节流的——不是每次写显存都立即更新窗口,而是每隔 N 毫秒刷一次。值 5 表示每 200ms 刷一次(1/0.2=5 Hz),值 100 表示每 10ms 刷一次(100 Hz)。值越小越流畅,但 CPU 开销越大。
OS 开发场景用 update_freq=10 或更低——反正内核启动阶段屏幕没什么好刷的。经典系统跑图形界面建议 5~10 之间。
VGA 插到 PCI 槽
Cirrus 和 S3 都是 PCI 设备,需要在 bochsrc 里声明 PCI 配置:
pci: enabled=1, chipset=i440fx, slot1=cirrus
这样操作系统启动后会通过 PCI 枚举找到 VGA 设备,并配置它的 I/O 端口(0x3C0-0x3CF)和 VRAM 窗口(0xA0000-0xBFFFF)。
如果只开 VGA 没开 PCI,Cirrus VGA 不会被操作系统正确识别——bochsrc 会报错或显示异常。
默认 Bochs VGA 是 ISA 设备,不需要 PCI 配置。
VRAM:显存和物理内存的关系
VGA 的显示内存映射在物理地址 0xA0000-0xBFFFF(128KB)。这块区域和 RAM 是重叠的——内核不能直接把它当作 RAM 来读写,否则会污染显卡的帧缓冲。
OS 开发者在做物理内存管理时,必须把这个区域从可用 RAM 列表里剔除(BIOS 的 E820 表会正确标记这段为"Reserved")。
调试器里可以用 xp 0xA0000 直接查看当前屏幕的显存内容——调试视频驱动时很有用。
VBE:Bochs VGA BIOS 扩展
Bochs 的 VGA BIOS 实现了 VESA BIOS Extension(VBE),让操作系统或应用程序可以切换到更高分辨率的图形模式。
VBE 常用的模式(Cirrus GD5446 支持):
| VBE 模式 | 分辨率 | 色深 |
|---|---|---|
| 0x100 | 640×400 | 256 色 |
| 0x101 | 640×480 | 256 色 |
| 0x102 | 800×600 | 16 色 |
| 0x103 | 800×600 | 256 色 |
| 0x105 | 1024×768 | 256 色 |
| 0x111 | 640×480 | 15/16 位 RGB |
| 0x112 | 800×600 | 15/16 位 RGB |
| 0x114 | 1024×768 | 15/16 位 RGB |
| 0x117 | 1280×1024 | 15/16 位 RGB |
DOS 时代的图形软件(如 Doom、某些安装程序)通过 int 0x10 AX=0x4F02 调用 VBE 设置高分辨率显示模式。Bochs 完整实现了这个接口。

bochsrc 里的 VGA BIOS 路径
VGA BIOS 镜像和 VGA 型号必须匹配。bochsrc 里 vgaromimage: 的文件:
# Cirrus VGA BIOS(推荐 bochsrc 里 vga: extension=cirrus)
vgaromimage: file=VGABIOS-lgpl-latest-cirrus.bin
# 默认 Bochs VGA BIOS
vgaromimage: file=VGABIOS-lgpl-latest.bin
Bochs 安装包里通常这两个都有——选对就行。选错了 Bochs 可能报 VGA BIOS 加载成功但显示花屏。
display_library:图形前端
bochsrc 里 display_library: 关键字决定 Bochs 用什么方式把显示输出到宿主机:
| 值 | 说明 | 适用平台 |
|---|---|---|
wx | wxWidgets GUI(带菜单、状态栏、控制面板) | Windows、Linux、macOS |
sdl | SDL(简单、高性能) | 跨平台 |
x11 | X11(最小依赖) | Linux |
win32 | Windows 原生窗口 | Windows |
term | 纯终端(无图形输出) | OS 开发调试 |
nogui | 完全无界面 | 批量运行 |
rfb | VNC(远程查看) | 远程调试 |
OS 开发调试用 term 或 nogui——内核还没有 VGA 驱动,显示窗口没用。经典系统用 wx(功能最全)或 sdl(最快)。