在现代硬件上运行 Windows 3.1 曾是一个几乎不可能完成的任务。由于上世纪九十年代的显卡驱动针对特定硬件编写,而现代显卡早己放弃了对古老 VGA 兼容模式的硬件支持,传统方式无法让 Windows 3.1 在当代显示器上正常工作。vbesvga.drv 项目的出现彻底改变了这一局面,它通过完全基于 VESA BIOS Extensions(VBE)实现通用驱动,使 Windows 3.1 能够在任意支持 VBE 的现代显卡上运行,并支持最高 1920×1080 真彩色分辨率。

VBE 作为通用兼容层的核心作用

VESA BIOS Extensions 是 VGA 之后出现的统一显示标准,它定义了一套标准的 BIOS 中断调用(INT 10h),允许软件查询和设置显卡的各种显示模式,而无需了解底层硬件细节。vbesvga.drv 的核心设计理念正是彻底抛弃对特定显卡硬件的依赖,完全通过 VBE 接口与显卡通信。这意味着只要显卡的 BIOS 正确实现了 VBE 标准,驱动程序就能够正常工作,而不论显卡来自 AMD、NVIDIA 还是 Intel。

在实现层面,驱动在 Windows 启动时首先调用 VBE 功能 00h 获取显卡支持的模式列表。随后,它会根据 SYSTEM.INI 中指定的 Width、Height 和 Depth 参数对所有可用模式进行评分,选出最佳匹配的模式。评分算法综合考虑分辨率差异、色彩深度差异以及线性模式与分页模式的偏好程度。如果找不到完全匹配的模式,驱动还会回退到标准的 VGA 模式 13h(320×200×256 色)作为保底方案。

线性帧缓冲区与双缓冲机制

现代显卡的显存通常远超早期 VGA 的 256 KB,要访问超出 64 KB 段限制的显存,VBE 提供了两种主要方案:分页切换(bank-switching)和线性帧缓冲区(linear framebuffer)。分页切换通过映射不同显存区域到 A0000h 地址来实现大帧缓冲区的访问,而线性帧缓冲区则将整个显存映射到 1 MB 边界以上的高端内存区域。vbesvga.drv 默认优先选择线性模式,因为这种模式在 386 保护模式下具有更好的性能表现。

在线性模式下,驱动还会尝试启用双缓冲机制来提升图形渲染效率。双缓冲在系统内存中维护两帧显示内容的副本,所有 GDI 操作都直接写入内存缓冲区而非视频显存,只有在缓冲区交换时才将完整帧数据传输到显卡。这种方式有效避免了屏幕撕裂和闪烁问题,但需要消耗与帧缓冲区等量的系统内存。默认的缓冲区交换间隔为 16 毫秒(约每秒 60 帧),可通过 SYSTEM.INI 中的 SwapBuffersInterval 参数进行调整。

窗口化 DOS 会话的图形捕获

在 386 增强模式下运行 Windows 3.1 时,用户通常希望在窗口中运行 DOS 程序或游戏。vbesvga.drv 通过 vddvbe.386 虚拟显示驱动和 vbevmdib.3gr 捕获器共同实现这一功能。文本模式的 DOS 窗口可以正常使用,图形模式则存在一些限制:传统的 EGA 和 VGA 平面寻址模式无法在现代显卡上虚拟化,因为现代硬件不再支持将帧缓冲区映射到 A0000h-BFFFFh 区域并进行平面读写。

然而,VGA 模式 13h(320×200×256 色)使用线性 64 KB 帧缓冲区,可以被轻松虚拟化。这一特性使得许多运行在此模式下的经典游戏(如 Rayman)能够在窗口中正常运行。驱动通过识别模式 13h 并使用 vbevmdib.3gr 进行捕获渲染,实现了窗口化的 256 色游戏支持。

关键配置参数与实践建议

在 SYSTEM.INI 的 [vbesvga.drv] 段落中,有多个参数可以调整驱动的行为。Width 和 Height 用于指定期望的显示分辨率,Depth 指定色彩深度(8 表示 256 色,15 表示 32K 色,16 表示 65K 色,24 表示 16M 色)。如果希望驱动自动检测显示器的最佳分辨率,可以不设置这两个参数,驱动会通过 EDID 读取显示器的原生分辨率,若读取失败则默认使用 1024×768。

对于复古游戏玩家,建议将 SwapBuffersInterval 和 Windows.INI 中 386Enh 段落的 WindowUpdateTime 设置到尽可能低的值(以毫秒为单位),以获得更流畅的窗口化游戏体验。但需要注意,过低的值可能导致 CPU 占用率过高。对于调试目的,将 SwapBuffersInterval 设为 0 可禁用双缓冲,这有助于排查显示异常问题。

在硬件兼容性方面,NVIDIA GeForce GTX 1050 及更新型号在窗口化 DOS 会话中存在一些已知问题,包括切换窗口大小时可能冻结以及切换到全屏时字体损坏。AMD Radeon RX 5000 系列兼容性最佳,RX 7000 系列偶有 386 增强模式启动失败的报告。Intel 810 集成显卡则存在启动时直接黑屏退回 DOS 的问题,官方驱动是更推荐的选择。

资料来源:该项目源码及详细文档见 https://github.com/PluMGMK/vbesvga.drv