必须直通宿主机物理声卡并安装原生DOS驱动,才能准确还原AdLib/SB16/GUS等老声卡音效;需启用IOMMU、禁用设备后绑定vfio-pci、配置QEMU参数及DOS环境变量与驱动。

在虚拟机中运行DOS或早期Windows游戏时,系统默认的HDA或AC97声卡模拟无法准确还原AdLib、Sound Blaster 16或Gravis Ultrasound等老式声卡的波形合成逻辑和时序特性,导致音乐走调、音效缺失或混响异常。必须将宿主机物理声卡直通给虚拟机,并配置对应的老声卡驱动才能实现原生音效输出。
确认宿主机声卡支持PCI直通
打开设备管理器→声音、视频和游戏控制器→右键你的主声卡(如“Realtek(R) Audio”)→属性→详细信息→在“属性”下拉菜单中选择“硬件ID”→复制第一行值(如“HDAUDIO\FUNC_01&VEN_10EC&DEV_0887&SUBSYS_102807A2”)。
访问 https://wiki.qemu.org/Features/HostAudioPassthrough 页面,搜索你的VEN_XXXX和DEV_XXXX编号,确认该芯片组被QEMU/KVM列为已验证可直通型号。若未列出,【直通极可能失败或导致宿主机音频服务崩溃】。
启用Intel VT-d或AMD-Vi并解锁IOMMU
重启进入BIOS/UEFI,找到“Advanced → System Agent (SA) Configuration → Graphics Configuration”或类似路径,开启“VT-d”(Intel)或“IOMMU”(AMD)选项。
以管理员身份运行PowerShell,执行:
bcfg set -s bootoptions -o "hypervisors=off iommu=pt intel_iommu=on"
重启后在CMD中运行:
driverquery /v | findstr "intel_iommu amd_iommu"
若返回含“Started”字样,说明内核已加载IOMMU模块。
分离声卡设备并绑定vfio-pci驱动
第一步:用 PowerShell 运行 Get-PnpDevice -Class "Media" | Where-Object {$_.Status -eq "OK"} | Format-List,记下目标声卡的“InstanceId”(如“PCI\VEN_10EC&DEV_0887&SUBSYS_102807A2&REV_02\4&1C3F2E3E&0&0008”)。
第二步:以管理员权限启动CMD,执行:
pnputil /enum-devices /class Media
定位到该设备,确认其“Status”为“Started”且“Problem Code”为空。
第三步:禁用设备——右键设备→“禁用设备”,【务必先禁用再解绑,否则Windows会强制重载驱动导致vfio绑定失败】。
让 Windows 桌面程序在开机时静默自启并隐藏到系统托盘。特别适用于 Flutter、Electron 等无视 VBS/ProcessStartInfo 窗口样式、难以隐藏的顽固应用。提供「VBS 启动器 + Python ctypes/Win32 API」的隐藏窗口方案,可稳定把窗口收进托盘且不闪控制台。
第四步:下载并运行 DevCon.exe 工具,执行:
devcon disable "PCI\VEN_10EC&DEV_0887*"
devcon update C:\vfio\vfio.inf "PCI\VEN_10EC&DEV_0887*"
配置QEMU启动参数启用声卡直通
方法一:使用virt-manager图形界面
打开虚拟机设置→Add Hardware→PCI Host Device→勾选你直通的声卡(注意识别Vendor ID与之前一致)→Device Assignment模式选“Managed passthrough”→勾选“Shareable”(避免热插拔冲突)。
方法二:命令行启动(适用于DOSBox-X或QEMU纯命令模式)
qemu-system-i386 -machine pc-i440fx-2.12,accel=kvm,usb=off -cpu pentium3,+sse,+mmx -m 256 -soundhw sb16,adlib -device vfio-pci,host=0000:00:1f.3,x-vga=off,multifunction=on
其中 0000:00:1f.3 来自lspci -nn输出中的声卡BDF地址,必须与devcon中禁用的设备完全匹配。
虚拟机内安装原始DOS声卡驱动
启动虚拟机进入DOS环境,挂载含CTCM.EXE(Creative SB16)、ADLIB.COM(AdLib)、ULTRASND.SYS(Gravis)的软盘镜像。
运行 CTCM.EXE → 选择“Sound Blaster 16” → 手动指定:Base I/O = 220h,IRQ = 5,DMA = 1(8-bit)和 5(16-bit)→ Save & Exit。
编辑 AUTOEXEC.BAT,添加一行:
SET BLASTER=A220 I5 D1 H5 P330 T6
编辑 CONFIG.SYS,添加一行:
DEVICE=C:\SB16\DRV\SB16.SYS /D:SB16 /P:220 /I:5 /D:1 /H:5 /W:330
重启后运行 TESTSND.EXE 或直接启动《指挥官基恩》《德军总部3D》,听到清晰的FM合成鼓点即表示直通成功。


















