错误代码43是gpu直通失败的硬件级拒绝握手,根源在于vfio-pci未真正接管、iommu分组异常、qemu cpu model-id不匹配、bios中vt-d/above 4g/resizable bar未启用或secure boot未关闭,以及windows注册表enablemmiospace和disablegpuscheduler未配置。

错误代码43在Linux宿主机(如Proxmox VE)直通显卡给Windows虚拟机时,不是驱动装错了,而是硬件信任链断裂——VFIO没真正接管、IOMMU分组错乱、或QEMU把CPU型号“说谎”了,导致GPU固件拒绝初始化。
确认vfio-pci是否真接管了GPU
很多问题根本没走到Windows那步。先验证宿主机是否真的把卡交出去了:
- 运行
lspci -nnks $(lspci | grep -i nvidia | head -n1 | cut -d' ' -f1),看Kernel driver in use字段是不是vfio-pci - 如果是
nouveau或nvidia,说明黑名单失效:检查/etc/modprobe.d/pve-blacklist.conf是否含blacklist nouveau和blacklist nvidia,然后执行update-initramfs -u && reboot - 若仍不生效,可能是内核模块被其他服务提前加载,可加
softdep nvidia pre: vfio-pci强制依赖顺序
BIOS里必须开的三项硬开关
67%的代码43源于BIOS配置漏项,且顺序不能错:
-
Intel VT-d(Intel)或AMD-Vi(AMD)→ 必须 Enabled -
Above 4G Decoding→ 必须 Enabled(否则IOMMU无法映射高地址空间) -
Resizable BAR Support→ 必须 Enabled(NVIDIA 30/40系必需,否则ATS失败触发43) - Secure Boot 必须关闭 —— Windows UEFI固件加载vfio直通设备时会校验签名,未签名的vBIOS或驱动直接被拒
QEMU参数里model-id必须和宿主机一致
用自定义CPU型号(如 qemu64、x86-64-v3)是代码43高发区,GPU固件会校验CPU品牌字符串是否匹配物理硬件:
- 查真实型号:
cat /proc/cpuinfo | grep 'model name' | head -n1,结果类似Intel(R) Core(TM) i7-10700K - 编辑虚拟机配置文件(如
/etc/pve/qemu-server/100.conf),追加:args: -global cpu.model-id="Intel(R) Core(TM) i7-10700K" - 别用引号包裹型号以外的空格——
model-id值必须原样复制,连括号都不能少 - 如果用的是AMD CPU,同样要填完整字符串,例如
AMD EPYC 7502P,不能简写为epyc
Windows注册表里必须改的两个键
即使宿主机全对,Windows内部仍可能因MMIO空间校验失败而报43:
- 进Windows后,打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318} - 在对应显卡子项下新建 DWORD(32位)值:
EnableMmioSpace,设为1 - 再新建 DWORD(32位)值:
DisableGpuScheduler,设为1(防止WDDM调度器与直通GPU冲突) - 改完重启,不要只注销——只有冷重启才能重置GPU PCIe配置空间状态
最容易被忽略的是ACS支持验证:运行 dmesg | grep -i acs,如果输出 ACS is disabled,说明芯片组不支持PCIe设备组隔离,NVIDIA显卡直通必报43,此时换AMD RX 6000+或放弃独显直通是唯一解。











