中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-24 20:51
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [原创]SDLPal DOS版发布 精华I 查看 442 回复 10
楼 主 [原创]SDLPal DOS版发布 发表于 2026-07-24 01:31 ·  中国 香港 新界 荃湾区 IPXO
初级用户
积分 195
发帖 19
注册 2003-10-12 00:00
22年会员
UID 11101
性别 男
状态 离线
不太清楚这个帖是发开发区还是游戏区更应景,若有不便,还望版主挪下帖 :-)
相信大家应该都玩过《仙剑》。SDLPal 作为它的开源引擎重实现,能跑官方 DOS/98 原版资源,这些年也添了不少新功能。一晃十几年过去,从 Windows 出发,Linux、Android、macOS、iOS,还有各种掌机主机,基本都覆盖到了。但最让人意难平的是,作为起点的 DOS 平台却一直缺席。
去年暑假,我终于没忍住,以jayschwa的SDL2 DOS版为基础,自己动手开搞 DOS 移植。这个SDL2是 DJGPP 的,在 DOSBox 上通过 VBE2 能显示真彩画面,但一到实机就各种翻车。在 VirtualBox/QEMU 里折腾了好久总算把自己真机画面点亮了,还没来得及高兴,接下来的声音又难倒了我——DOS 驱动现代音频硬件本来就够头痛,SDL 的音频模型还依赖多线程,这在 DOS 下几乎是死路一条。
于是接下来,我选择绕开 SDL,先把原版那种“时钟 ISR 里发 OPL 指令”的老路走通。幸好前几年 SBEmu 和 VSBHDA 横空出世,现代系统上总算也能用这个办法了。用了相当久的业余时间,之前 SDLPal 中为软件合成做的 OPL 增强终于被我磕磕绊绊地backport到了硬件上(幸亏了PalMusicFan 设计、Louyihua 实现的单 OPL3 FM 立体声),顺便也给 Windows/Linux 加了直接利用硬件 OPL 的路径——比如 CMI8738 这张在 Win11 x64 下居然还有驱动的老声卡。macOS 本来也想顺便搞了,但苹果那边 x86 路线说停就停,只好作罢。
然后,一个意外惊喜砸过来了:AJenbo 搞定了 SDL3 的 DOS 后端并进了上游!不但补全了 VGA 模式,还把之前我觉得不可能的“多线程”(靠手搓协程实现的黑科技)和音频(通过 SoundBlaster API 直连 SBEmu/VSBHDA)都给补齐了。万事俱备,我赶紧把之前写好的那套 ISR hook 框架搬到 SDL3 上,适配了原版的VGA视频模式,又给 SDL3 提了几个补丁完善调色板动画之类的优化。
于是现在 SDLPal 终于能在 DOS 上跑了。配置嘛,从奔腾1到zen3 5600 都试过没问题(有模拟有实机)。更低或更高的配置也可能跑得动——就算没浮点协处理器的 CPU 都可以用 djgpp 的 emu387 顶着——但性能就不好说了。如果你是 UEFI Only、没有 CSM 的机器,也可以试试用 CSMWrap 来启动进 DOS——不过目前还没听说有人成功跑进sdlpal,欢迎挑战。
跟原版 DOS 仙剑比起来,主要有这些变化:
能用官方的 Win95 版资源在 DOS 上跑,这是开天辟地头一回(但AVI解码对奔腾1就有点过于费劲了,最低也得MMX166这个级别才能解得比较顺)。但毕竟是现代逆向移植,最低配置做不到原版的 386 级别。但好处是不再受 580K 常规内存限制——DJGPP 能用 4G 空间,就算常规内存只剩 100K(主要是 SB DMA 占的,用 realopl 还能再省 50K),照样全功能运行。不过前提是总内存要大于 12M。
显示方面,低端机上默认用原版 VGA 模式,对 98 版 AVI 做了兼容处理,每个视频预生成调色板和 LUT,但 VGA 下颜色还是差点意思,这个确实没办法。机器好一点的,可以在配置里关掉 DOSForceMode13h 切到 VESA 模式,这个模式下AVI可以原样呈现了;分辨率可以自己试,我最高试到 1080P,看 log 就知道你的显卡支持哪些(但DOS下IO瓶颈颇为严重,平时最好是别把LogLevel开到0,也就是Debug)。但有一点,DOS 下全是软渲染,分辨率越高 CPU 越累,而且除了AVI什么变化都不会有。至于其他平台上高分辨率上最大的优势GLSL支持——也研究了一下有没有可能通过mesa llvmpipe支持,但测试结果表示单核无SIMD环境还是别想这么多了(哪位兄台折腾出了DOS上的真多核并发的话务必知会我一声)
音乐方面,现在可以在OPL3上播放立体声版的原版RIX(原版是在OPL2模式里播的,左右声道一样)。REALOPL(OPLCore=REAL)是默认,有硬件 OPL 的老机器能跑,用 SBEmu/VSBHDA 的新机器也能跑。CMI8738 这张卡甚至可以直接免驱用高位 I/O 端口: 用 Craig Hart 的 PCI.exe 查出基址,加上偏移 0x50(CMI8738 的硬件手册有写),填进 RealOPLPort 就行。CPU 够劲的话,Nuked(最精确也最吃配置)/DBINT/DBFLT/MAME 这些 OPL 软合成器、Timidity/TinySoundFont 波表 MIDI、MP3/Ogg/Opus 背景音乐替换,都能跟其他平台一样用。不过DOS原版的MPU-401支持还没有,留待以后了(2026.8:已追加)
文字方面,用了基于 Unicode/Unifont 的通用字库,也支持 BDF 扩充。翻译上支持大部分非复杂排版语言,但目前只听说英文社区搞了一个语言包

致敬:
PalMusicFan——测试狂魔、灵感来源、精神支柱
SDL DOS补丁集合的全体作者
Vogons 上帮忙在实机测试的兄弟们
SDLPal全体开发者和贡献者
仙剑早期研究者
SBEmu / VSBHDA 开源项目
狂徒创作群
大宇资讯

使用方法:选择最新的build下载后,将解压后的sdlpal.exe放在pal.exe同层目录启动即可,游戏内正常退出后同目录会有配置文件sdlpal.cfg生成,后续按需要编辑使用即可(DOS版尚未实现配置的GUI修改)

推荐BGM:动力火车《终于明白》、Arika《Blan_》二选一
以此,告慰青春。
[已使用 Gemini 解答]
Gemini 解答

技术背景与定位

SDLPal 是基于开源 SDL 库对《仙剑奇侠传》(DOS / Win95 版)游戏引擎的逆向工程重实现。传统的 SDLPal 普遍面向现代操作系统,而该项目通过 DJGPP(GCC 的 32 位 x86 DOS 移植版)将 SDLPal 重新移植回 DOS 环境。

这一移植依赖了近年 SDL3 上游合并的 DOS 后端、DPMI 保护模式扩展、以及 SBEmu / VSBHDA 等现代声卡虚拟化中间件,使得基于现代跨平台代码架构的游戏引擎能够在实机 DOS 和纯软渲染环境下运行。


核心技术要点与机制解析

1. 内存模型与 DPMI 突破

  • 突破 640KB 常规内存限制:DOS 原版《仙剑奇侠传》使用 DOS 扩展器(如 DOS/4GW 等)突破常规内存,而 SDLPal DOS 版基于 DJGPP 编译,运行于 32 位 DPMI(DOS Protected Mode Interface,通常依托 CWSDPMI)保护模式下,享有扁平寻址空间(Flat 4GB Address Space)。
  • 常规内存(Low Memory)占用机制:保护模式程序本身占用扩展内存,但声卡 DMA 缓冲区、中断服务例程(ISR)入口跳板以及部分 BIOS/VBE 接口调用必须位于首兆(1MB)以下的常规内存中。文中提到实机仅剩 100KB 常规内存仍可运行,是因为 DJGPP 将大部分堆栈和代码段搬移到了扩展内存,只在常规内存池分配极少量的 DOS 传输缓冲区(Transfer Buffer)。

2. 多线程与音频模型差异

  • SDL 的多线程音频模型:标准 SDL 音频驱动依赖 OS 级抢占式线程(如 pthread)定期调用音频回调填充缓冲区。
  • DOS 环境的实现机制
    • 硬件中断(ISR)直驱:DOS 原版引擎通过挂载 PIT 8253/8254 定时器中断(INT 08hINT 1Ch)周期性向 OPL 芯片端口写入寄存器数据。
    • SDL3 协程模拟:DOS 下原生不存在内核态抢占式多线程。SDL3 的 DOS 后端使用用户态协程(通过切换栈指针与寄存器上下文,如 setjmp/longjmpucontext 原理)实现协作式“假多线程”,在主循环空闲或主动 yield 时切出执行音频渲染与事件轮询。
  • 关于多核(SMP)的讨论(跟帖)
    • DOS 本质运行在实模式或单核 DPMI 保护模式,BIOS/ACPI 启动 AP(Application Processor)核需要发送 INIT-SIPI IPI(处理器间中断)并在保护模式/长模式下初始化多核调度器。
    • 回复中提到的 smp.vxd 是针对 Windows 9x 的 VxD(虚拟设备驱动),利用 Ring 0 特权级唤醒次核并接管硬件调度;而在纯 DOS/DPMI 环境下,缺乏内核态抢占式调度器和内存屏障管理,直接运行真正的多核 pthread 仍存在巨大的架构壁垒。

3. 硬件音频与现代声卡映射(CMI8738)

  • 传统 ISA 声卡:标准 Sound Blaster / AdLib 将 OPL 芯片直接映射在固定的 ISA I/O 端口(通常为 0x388 - 0x38B,SB 为 0x220 等)。
  • PCI 声卡直接访问:CMI8738 等 PCI 声卡在 PCI 配置空间中被分配了一段 Base Address Register(BAR)。CMI8738 芯片内部集成了兼容 OPL3 的 FM 核心,其硬件规格书定义了在 PCI I/O 空间基地址偏移 +0x50 处映射该 FM 寄存器。因此在 DPMI 拥有 in/out 端口 I/O 特权级(IOPL=3)的前提下,程序无需装载专有 DOS 驱动,只需读取 PCI 配置空间查出基地址即可直接向硬件端口写 OPL 数据。
  • 虚拟化方案:SBEmu / VSBHDA 利用 CPU 的 VT-x 硬件虚拟化或 Trap(捕捉)I/O 端口访问,把针对 0x2200x388 的旧 ISA 端口访问动态重定向至现代 HD Audio 或 AC97 PCI 设备,使免驱动硬件模拟成为可能。

4. 视频渲染与模式处理

  • VGA 模式(Mode 13h)320x200 256色(8-bit 调色板)。针对 Win95 版 16-bit / 24-bit 的 AVI 动画,必须在运行时进行色彩空间转换,通过离线生成 LUT(查找表)和抖动算法降采样映射到 256 色 VGA 调色板中。
  • VESA 模式(VBE):高分辨率(如 1080P)依赖 VBE 2.0+ 线性帧缓冲区(LFB,Linear Frame Buffer)。高分辨率下帧率骤降属于必然现象:纯软渲染器在向显存 PCI/AGP/PCIe 总线逐像素写入(memcpy)时,受到未经硬件加速的总线 I/O 写入带宽和 CPU 单核算力限制。

技术结论与使用限制

  1. 环境依赖:该二进制为 32 位 DPMI 程序,需搭配 386 以上处理器,最低内存建议 16MB 以上(若包含视频解码堆栈建议更高)。
  2. UEFI 启动限制:纯 UEFI 环境去除了传统 BIOS 中断(INT 10hINT 13h 等)与 CSM(兼容支持模块),DOS 系统及依赖实模式/BIOS 调用的 DPMI 扩展器无法直接引导。CSM 包装层(如 CSMWrap)仍处于实验阶段,兼容性较低。
  3. 性能调优:在低配置实机或未开启硬件加速的虚拟机中,应强制锁定 DOSForceMode13h 并使用 REALOPL 硬件直通或轻量级软合成器(如 DBINT),避免使用高开销的 NukedOPL 或高分辨率 VESA 软渲染。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
AlexZhang +5 2026-08-09 14:31
2 发表于 2026-08-09 14:31 ·  美国
系统支持
★★★
积分 1,025
发帖 439
注册 2007-02-08 00:00
19年会员
UID 78999
性别 男
状态 离线
不错的成果,加入精华
3 发表于 2026-08-09 20:04 ·  中国 浙江 杭州 联通
高级用户
★★
苏醒的沉睡者
积分 663
发帖 218
注册 2003-02-15 00:00
23年会员
UID 930
性别 男
来自 福建
状态 离线
很不错啊,啥时候研究一下,看看能不能实现真正的多线程。
好久没碰Dos,手都生了,赶紧回来练练.嘿嘿
4 发表于 2026-08-14 05:53 ·  瑞士 Google LLC
系统支持
★★★
积分 1,025
发帖 439
注册 2007-02-08 00:00
19年会员
UID 78999
性别 男
状态 离线
Originally posted by 070 at 2026-8-9 05:04:
很不错啊,啥时候研究一下,看看能不能实现真正的多线程。

这个不大可能,DOS 里没有真的 pthread 等多线程的 semantics. 只可能有 cooperative threading.
5 发表于 2026-08-14 13:58 ·  美国 加利福尼亚州 洛杉矶 Akari
初级用户
积分 195
发帖 19
注册 2003-10-12 00:00
22年会员
UID 11101
性别 男
状态 离线
Originally posted by AlexZhang at 2026-8-14 05:53:

这个不大可能,DOS 里没有真的 pthread 等多线程的 semantics. 只可能有 cooperative threading.

感谢版主加精哈。
关于 DOS下的真多线程,首要的问题其实感觉还不是API,而是多核驱动。多年以来这也是个毫无进展的老大难问题,不过最近看到几个新项目,感觉有点曙光了
第一个是这个给win98写的多核驱动: JHRobotics/smp.vxd 。98也是没有真多核驱动的,但这位大佬为了跑自己移植的软渲染器硬是把这个搞出来了,虽然原理我是七窍通了六窍:一窍不通。同一位作者还写了 JHRobotics/pthread9x ,将用户态也打通了,不过这部分未来应该还需要一个真正的dos port。
第二个是sbemu的vdpmi(尚未开源),作者在vogons提到未来其稳定并开源之后准备考虑直接支持vxd驱动,也就意味着有把前一个作者的驱动桥接过来使用的可能。
[已使用 Gemini 解答]
Gemini 解答

该回复讨论了在 DOS / 早期 Windows 环境下实现“真多核抢占式多线程(SMP Preemptive Multithreading)”的可能性。以下从 x86 体系结构、操作系统模型及相关开源项目的底层原理进行技术解读:

1. 核心概念澄清:抢占式单核多线程 vs. 多核并发 (SMP)

原帖及跟帖中混淆了两个不同的层次:

  • 单核抢占式多线程(Preemptive Multitasking / Multithreading): DOS 本身是单任务实模式系统,但只要进入保护模式(如通过 DPMI 或自定义 Extender),程序完全可以利用硬件定时器中断(如 8254 PIT 的 IRQ0)定期触发上下文切换(保存/恢复寄存器、切换堆栈指针 ESP 和页表),从而在单核上实现抢占式多任务。DJGPP 早期就有基于时钟中断的抢占式线程库(如 GNU Pth 的部分移植),并非只能做协程式(Cooperative)切换。
  • 多核对称多处理(SMP, Symmetric Multiprocessing): 指同时调度多个物理 CPU 核心(或线程)并行执行指令。这不仅需要多任务调度器,还必须具备初始化次级核心(Application Processors, APs)、维护缓存一致性(Cache Coherency)、跨核中断(IPI)以及多核内存同步原语(如原子锁、自旋锁)的能力。

2. 对帖子中提及项目的原理解析

smp.vxd 与 Windows 9x 的多核机制

  • 技术背景:Windows 9x(95/98/Me)的内核(VMM32/Kernel32)基于单处理器(UP)设计,未实现 SMP 调度,整个操作系统与驱动运行在单核上,其 16 位和 32 位混合架构大量依赖非重入的 Win16Lock(Big Caret Lock)。
  • smp.vxd 的实现原理
    1. 该驱动(VxD 运行在 Ring 0)绕过了 Windows 9x 自身的任务调度器。
    2. 它直接通过 ACPI / MPS(MultiProcessor Specification)表检测系统的多核拓扑。
    3. 通过主处理器(BSP, Bootstrap Processor)向 APIC(高级可编程中断控制器)发送 INIT-SIPI-SIPI(Startup IPI)序列,将处于停机(HALT)状态的次级核心唤醒,并使其进入 32 位保护模式。
    4. 为 AP 核心建立独立的特权级栈与页表,并在 Ring 0 维护一个独立的私有任务调度器。
  • 局限性:次级核心不能调用 Windows 9x 的任何系统 API(无论是 Ring 3 的 Win32 API 还是 Ring 0 的 VMM/VXD 服务),因为这些 API 是非线程安全的。次级核心仅能作为“纯算力工人”,处理无系统调用的纯内存计算密集型任务(例如 Mesa 软渲染器 llvmpipe、视频解码等)。

pthread9x

它是配合 smp.vxd 开发的用户态运行时库。它将标准 POSIX 线程(pthread)API 映射到 smp.vxd 暴露的 Ring 0 调度接口上。由于次级核心无法直接响应 Win32 线程消息,该库的线程实质上是脱离 Windows 系统调度的外部并行计算线程。

SBEmu 的 VDPMI 桥接 VxD 设想

  • SBEmu 的机制:SBEmu 是一个用于纯 DOS 环境的 Sound Blaster 模拟器,利用 QEMM/JEMMEX 等 EMM386 内存管理器的 Ring 0 / Virtual 8086 (V86) 权限,通过捕获 I/O 端口访问(如 0x220)来重定向现代 PCI/HD Audio 硬件。
  • VDPMI 与 VxD 兼容性: VxD(Virtual Device Driver)是专为 Windows 3.x/9x 的 VMM(Virtual Machine Manager)设计的驱动格式,高度依赖 VMM 导出的底层服务(如 Get_Cur_VM_Handle、中断虚拟化链等)。 纯 DOS 环境下的 DPMI 宿主(Host)通常只提供 Ring 3 到 Ring 0 的中断切换、选择子分配与内存映射(如 INT 31h),并不具备 VMM32 的驱动加载和运行时基础设施。在没有实现完整 VMM 仿真层的前提下,直接在 DOS/DPMI 中加载并执行任意 .vxd 文件在工程上存在显著断层;但如果仅参考 smp.vxd唤醒 APIC 与 SIPI 初始化的裸机硬件代码,直接在 DOS DPMI 扩展器中实现多核引导,则是完全可行的。

3. DOS 下实现真多核多线程的工程现实

要在 DOS(DJGPP 运行环境)下实现真正的多核多线程,不需要依赖 Windows 9x 的 VxD,其标准技术路径为:

  1. 硬件初始化(Ring 0): DOS Extender(或加载的 TSR 驱动)从实模式或通过 DPMI 取得 Ring 0 权限,解析 ACPI MADT(Multiple APIC Description Table)或 MP-Table 获取 CPU 核心信息。
  2. 唤醒次核: 利用 Local APIC 发送 SIPI 消息,加载实模式引导代码(Trampoline Code),将次核切换至保护模式/分页模式,加载与主核共享或映射一致的 CR3(页目录)。
  3. 调度与约束
    • DOS 本身(INT 21h)及 BIOS(INT 10h, INT 13h 等)是**完全不可重入(Non-Reentrant)**的。
    • 所有次核严禁调用任何 DOS/BIOS 中断。所有 I/O、文件读写、音频 DMA 交互必须交由主核(BSP)在中断上下文中代理执行。
    • 次核只运行无 OS 依赖的纯算法代码,线程间通信仅依赖共享内存及基于原子操作指令(如 x86 的 LOCK CMPXCHGPAUSE)实现的 Spinlock 或 Lock-free 队列。
6 发表于 2026-08-14 18:57 ·  美国
系统支持
★★★
积分 1,025
发帖 439
注册 2007-02-08 00:00
19年会员
UID 78999
性别 男
状态 离线
Originally posted by palxex at 2026-8-13 22:58:

感谢版主加精哈。
关于 DOS下的真多线程,首要的问题其实感觉还不是API,而是多核驱动。多年以来这也是个毫无进展的老大难问题,不过最近看到几个新项目,感觉有点曙光了
第一个是这个给win98写的多核驱动: JHRobotics/smp.vxd 。98也是没有真多核驱动的,但这位大佬为了跑自己移植的软渲染器硬是把这个搞出来了,虽然原理我是七窍通了六窍:一窍不通。同一位作者还写了 JHRobotics/pthread9x ,将用户态也打通了,不过这部分未来应该还需要一个真正的dos port。
第二个是sbemu的vdpmi(尚未开源),作者在vogons提到未来其稳定并开源之后准备考虑直接支持vxd驱动,也就意味着有把前一个作者的驱动桥接过来使用的可能。

显然就根本没有多核驱动嘛,你要想玩儿的话,完全可以 bringup 起来第二个核心不把他当 SMP去用。

DOS doesn't care, 甚至你可以 bringup 的时候 suck the brain out from DOS, 把 DOS 扔到 v86 模式里去(EMM386/QEMM 本来已经做了这种事情)

你还可使用 ACRN 一类静态分区 hypervisor,cpu0 给 DOS, cpu1 点起来 Linux?
[已使用 Gemini 解答]
Gemini 解答

本帖讨论的核心是 DOS / 早期 Windows 环境下实现多核(SMP)与真正多线程(Preemptive / Multi-core Threading)的可行性与实现路径。楼上提到的讨论存在一些技术概念的混淆与工程可行性的偏差,以下做系统性解读与澄清:

1. DOS 与 x86 多核唤醒(AP Bring-up)的技术事实

在 x86/x64 架构下,无论操作系统是什么,多核唤醒的底层硬件机制是完全一致且标准化的(依据 Intel MultiProcessor Specification 或 ACPI 规范):

  • 系统启动时,固件(BIOS/UEFI)仅将一个核心作为 BSP(Bootstrap Processor) 引导进入实模式或保护模式,其余核心作为 AP(Application Processor) 处于挂起(Wait-for-SIPI)状态。
  • 唤醒 AP 不需要传统意义上依赖 OS 内核特性的“多核驱动”,而是需要一段运行在 Ring 0(实模式或特权模式)的代码向本地高级可编程中断控制器(Local APIC)发送 INIT-SIPI-SIPI(Startup IPI) 中断序列,指定 AP 的入口实模式向量地址(0x000VV000)。
  • 一旦 AP 被唤醒,开发者可以将其直接切换到保护模式或长模式,并为其分配独立的栈(ESP)、页表(CR3)与中断描述符表(IDT)。

因此,第 6 楼指出“根本没有多核驱动,可以直接 bringup 第二个核心”在底层硬件层面上是完全成立的。在 DOS 环境(特别是 32 位 DPMI / DOS 扩展器环境)下,完全可以直接通过内存映射 I/O(MMIO)访问 Local APIC 来唤醒并控制其他从属 CPU 核心(Asymmetric Multiprocessing,AMP 模式)。

2. DOS 下利用多核的真正瓶颈:不是 Bring-up,而是系统资源竞争

唤醒 AP 并不难,难点在于如何在多核环境下调度与共享系统资源

  • DOS 的非可重入性(Non-reentrancy):MS-DOS 本身是一个单任务、单线程且非可重入的系统。内部有大量的全局静态状态(如 InDOS 标志、SDA - 交换数据区、当前目录结构等)。多个核心若同时触发 INT 21h 进行文件 I/O 或内存分配,会导致严重的系统状态破坏或死锁。
  • BIOS 与中断架构限制:传统的 PIC(8259A)与 BIOS 中断例程同样不可重入。如果要实现真正的 SMP,必须建立一套核间通信机制(IPI)或任务队列,将所有涉及 BIOS/DOS 调用的 I/O 请求串行化(Marshal)派发回 BSP(Core 0)执行,而让 AP 仅负责纯粹的计算任务(如软渲染、音效解码、矩阵变换)。
  • DPMI 规范的缺失:现有的 DPMI 0.9/1.0 规范以及常见的 DOS 扩展器(如 CWSDPMI、DOS/4GW、PMODE/W)均只针对单 CPU 设计,无法感知和管理多核上下文切换。

3. 关于 smp.vxdvdpmi 的技术分析与纠偏

5 楼提到的两个项目及桥接设想存在概念理解上的偏差:

  • smp.vxd 的本质: Windows 9x 的 VMM32(虚拟机管理器)内核虽然在调度层是单处理器架构,但其运行在 32 位 Ring 0。smp.vxd 是一个运行在 Ring 0 的虚拟设备驱动程序,它利用 Local APIC 唤醒了其他核心,并在这些核心上运行轻量级的从属调度器(Worker 线程池),用于协助主核心进行并行计算(如软光栅渲染)。它并不是让 Windows 9x 获得了类似 Windows NT 的完整 SMP 内核能力,而是在单核 OS 内部开辟了一个非对称计算协处理器环境
  • pthread9x 的定位: 它是在 Win32 用户态封装了调用 smp.vxd 核心接口的 POSIX 线程 API 库,依赖 Win32 运行环境与 VXD 接口。
  • DOS 下桥接 VXD 的不切实际性: 5 楼提及“VDPMI 开源后桥接 VXD 来支持多核”在工程上不可行。VXD(Virtual Device Driver)是专为 Windows 3.x/9x 的 32 位保护模式虚拟机管理器(VMM)设计的驱动架构,其高度依赖 VMM 提供的服务(如 Get_Cur_VM_HandleHook_V86_Int_Chain、VXD 服务表与 Ring 0 消息通信)。在纯 DOS / DPMI 环境下,模拟完整的 VMM32 运行时来跑 VXD 属于过度设计;如果要在 DOS 下用多核,直接在 DPMI 扩展器或 Ring 0 载入器中通过 APIC SIPI 唤醒从核并编写裸机计算循环,在技术实现上要简单且干净得多。

4. 虚拟化与静态分区(Hypervisor Partitioning)

第 6 楼提到的“使用 ACRN 等静态分区 Hypervisor”是现代嵌入式和工业领域常用的方案:

  • 原理:利用 CPU 的硬件虚拟化技术(Intel VT-x / AMD-V),由底层 Type-1 Hypervisor(如 ACRN、Jailhouse 或轻量级 VMM)对物理 CPU 核心与物理内存进行硬隔离分区。
  • 实现:Core 0 分配给 DOS(运行在受限的 VM 容器或非根模式下,处理原本的显示与 DOS 系统调用),Core 1..N 分配给裸机计算程序、FreeRTOS 或 Linux;核心之间通过共享物理内存(Shared Memory Ring Buffer)和虚拟中断进行无锁通信(Lock-free IPC)。
  • 结论:这种方案不仅技术上完全可行,而且是目前在不需要重写 DOS 体系的前提下,让 DOS 程序安全利用现代多核 CPU 算力最稳定、最标准的技术路径。
7 发表于 2026-08-15 10:02 ·  美国 加利福尼亚州 洛杉矶 Akari
初级用户
积分 195
发帖 19
注册 2003-10-12 00:00
22年会员
UID 11101
性别 男
状态 离线
底层相关的讨论就不继续参加了,知识储备不够,旁观大佬吧
昨天的版本加入了AIL32 DIGPAK支持(只支持watcom编译版),现在可以在原版不支持的其他老声卡上进行MIDI合成了,暂时只测试了SBPro和AWE64(更新:已通过dosbox-x测试了GUS和MT-32也正常工作;通过86box确认spkr XMID正常工作)
涉及的配置改变:
MIDISynth=AIL32(之前实现的MPU-401支持占掉了其他平台都在用的native)
MIDIClient=AIL32驱动dll文件名(注意实模式的ADV驱动不行)
SoundBank=GTL音色库文件名(创新给的AWE官方AIL32 DIGPAK驱动似乎把它无视了?放什么都行,合成效果没有任何变化;GUS的驱动看说明是让用户单独加载patches,可能也不依赖这里的配置;但也有一些驱动缺了这个就不干活)
相关下载:
AIL2原始开源包(有一堆编译好的驱动)http://www.thegleam.com/ke5fx/misc/AIL2.ZIP
PX播放器(有一些现成的音色分配文件)https://www.vogons.org/viewtopic.php?t=37630
现代重打包 https://github.com/Wohlstand/ail32-sandbox
DJGPP移植 https://github.com/volkertb/ail32-djgpp
目前找到的两个闭源AIL32驱动,其他人手头有的话请多多跟帖哈:
https://www.vogonsdrivers.com/files/downloader.php?fileid=51
http://files.retropc.se/hardware/SOUND/GRAVIS/UPD/GAIL3214.zip
8 发表于 2026-08-20 21:45 ·  中国 上海 静安区 电信
初级用户
积分 22
发帖 10
注册 2008-09-06 13:44
17年会员
UID 124948
性别 男
状态 离线
支持一下!
搜驱动搜到了这里,想不到还有人哈。
多线程我感觉就算了哈,DOS程序单核就够用。
VDPMI现在兼容性还不行,VXD支持不知道要什么时候了。我现在也没有太多精力去维护。
目前我打算把ALSA全部移植到SBEMU,不过也没太多时间去做,看情况吧。
9 发表于 2026-08-20 21:52 ·  中国 上海 静安区 电信
初级用户
积分 22
发帖 10
注册 2008-09-06 13:44
17年会员
UID 124948
性别 男
状态 离线
另外,GEMINI分析的很有道理,在vdpmi里加入vmm模拟层这个想法目前我还只停留在想法阶段,但是理论上是可行的,不过在行为上完全兼容windows的vmm估计很难,到时候我会试验一下可行性。目前的想法是只做简单粗糙的模拟,够SBEMU用就行了。
10 发表于 2026-08-20 23:05 ·  中国 广东 深圳 电信
系统支持
★★★
积分 1,025
发帖 439
注册 2007-02-08 00:00
19年会员
UID 78999
性别 男
状态 离线
Originally posted by crazii at 2026-8-20 06:45:
支持一下!
搜驱动搜到了这里,想不到还有人哈。
多线程我感觉就算了哈,DOS程序单核就够用。
VDPMI现在兼容性还不行,VXD支持不知道要什么时候了。我现在也没有太多精力去维护。
目前我打算把ALSA全部移植到SBEMU,不过也没太多时间去做,看情况吧。


alsa port to sbemu 应该不是很难,这个算是机械性劳动,用比较好的 models 是可以完成的比较好的。我怀疑 opus 5 一两天能移植到能用的程度。

我的个人经验是,dosbox-x 配合 Claude code (dosbox-x 的 serial output 作为 debugging harness) 是比较好用的。
11 发表于 2026-08-23 00:21 ·  美国 加利福尼亚州 洛杉矶 Akari
初级用户
积分 195
发帖 19
注册 2003-10-12 00:00
22年会员
UID 11101
性别 男
状态 离线
Originally posted by crazii at 2026-8-20 21:52:
另外,GEMINI分析的很有道理,在vdpmi里加入vmm模拟层这个想法目前我还只停留在想法阶段,但是理论上是可行的,不过在行为上完全兼容windows的vmm估计很难,到时候我会试验一下可行性。目前的想法是只做简单粗糙的模拟,够SBEMU用就行了。

非常期待vdpmi支持vxd并开源的那一天。跑在dpmi下的dos程序本质上是用户态程序,有什么底层需求都得请求DPMI开发者添加。如果能完成vmm模拟,即使做不到兼容所有vxd驱动(能做到当然最好),至少也给没有完整dpmi开发能力的用户添加了一整个新的扩展面。至于应用嘛,user will find the way
论坛跳转: