bochs 中文文档 下载 App

VGA 显卡与显示——Cirrus GD5446、Bochs VBE 和显示模式配置

Bochs 模拟的 VGA 型号

VGA 型号bochsrc 值说明适用
默认 Bochs VGAvga: extension=std基本 VGA/SVGA,支持 Bochs VBE 扩展OS 开发、简单 DOS
Cirrus Logic GD5446vga: extension=cirrus经典 PCI 显卡,支持 SVGA 高分辨率Windows 95/98/ME/2000/XP、Linux
S3 Trio 64vga: 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
字段说明
extensionVGA 型号
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 模式分辨率色深
0x100640×400256 色
0x101640×480256 色
0x102800×60016 色
0x103800×600256 色
0x1051024×768256 色
0x111640×48015/16 位 RGB
0x112800×60015/16 位 RGB
0x1141024×76815/16 位 RGB
0x1171280×102415/16 位 RGB

DOS 时代的图形软件(如 Doom、某些安装程序)通过 int 0x10 AX=0x4F02 调用 VBE 设置高分辨率显示模式。Bochs 完整实现了这个接口。

Bochs 运行 Windows NT 4.0
Bochs 运行 Windows NT 4.0

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 用什么方式把显示输出到宿主机:

值说明适用平台
wxwxWidgets GUI(带菜单、状态栏、控制面板)Windows、Linux、macOS
sdlSDL(简单、高性能)跨平台
x11X11(最小依赖)Linux
win32Windows 原生窗口Windows
term纯终端(无图形输出)OS 开发调试
nogui完全无界面批量运行
rfbVNC(远程查看)远程调试

OS 开发调试用 term 或 nogui——内核还没有 VGA 驱动,显示窗口没用。经典系统用 wx(功能最全)或 sdl(最快)。