前言
没有配图和视频,因为太麻烦!但实操步骤 + 原理解析总体十分详细。理解能力强的人看了一点就通。如果你看了以后觉得云里雾里,不知道怎么做,看不懂步骤。我建议就别亲自上手,还是花点钱找人弄吧。毕竟真上手也是搞坏的概率大。你说为什么不一步一配图把最没基础的小白也教会?没这个义务!况且现在绝大多数DMA从业者还指望靠这个最后赚点呢,砸人饭碗太招恨了。DMA固件那篇是带着对DMA的情怀写的,这篇纯属是解决当下使用DMA的附带问题。能懂就告别被圈开始享受,不能懂也请高抬贵手别挑刺找茬!去问Ai吧,让Ai解析这篇文档后给一个宝宝喂饭式指南。
2026 现存的过VT-D方案
- 简单说下不同方案各自痛点!至于哪个方案更好,千人千面,无法评价。结合自身条件,自行斟酌后选择。
| 可行性 | 方案 | 痛点 |
|---|---|---|
| 主流过法我已开源 | Intel常规主板过H / B / Z 均支持 | 不过型号不同过法,同型号不同BIOS不同品牌相差很大,需要具备一定智力与动手能力,纯小白自己搞有难度,花钱不一定买到真的, |
| 主流过法我已开源 | AMD常规主板过同上 | 同上 |
| 主流过法我已开源 | 特殊主板过 X99 / X299 / X399 / B85 / Z97 等等不太常见的主板 | 不过型号不同过法,并不是所有特殊主板过VT-D的原理都一样,需要的智力和动手能力相对正常主板较低。 |
| 主流过法我已开源 | 国产主板过海光3350 / 3340 / 3490 | 没得说,加油华为,加油CHINA。有点贵,风口过去不好出手,垃圾佬都不收。 |
| 主流过法我已开源 | 无盘 (能过VT-D版) | 无盘能过VT-d,不代表是无盘就能过VT-d ,搞之前确定好是能过VT-d的无盘。 |
| 小众过法我已开源 | 主机 / 副机过的软件 | 都会改主机,两种没区别。月供多一笔花销,也多一个拉了时怀疑的对象。双开双关看实现方式,软件间差异较大。 |
| 小众过法我已开源 | 双开固件 | 固件能过VT-d,但固件能过VT-d不太可能。全是只支持Intel的“双开固件”,贵的话直接用软件过得了。大差不差的,殊途同归。 |
| 小众过法我已开源 | 云端 / U盘 | 不排除有小众稳定款的可能,但小众稳定往往和高价圈钱强挂钩。毕竟好东西要么高价私域细水长流,要么市场铺开吃饱就走。前者踩雷风险远高于后者。 |
先定方案
重头戏主板过直接端上来!想用其他方案可跳到后面看👇
主板过的四种路线不是可互相替代的通用方案。先看主板条件,再选路线。
原理直接和你说清楚,所以别再问我的xxx型号主板能不能过VT-D?
看图,你的主板符合哪条路线的需求,就尝试哪条路线!
| 路线 | 适用 | 重点 |
|---|---|---|
| CPU 直连 PCIe 拆分直通 IOMMU | 高端主板或工作站板,BIOS 原生支持 PCIe Bifurcation。 | x16 能拆成 x8+x8 或 x4+x4+x4+x4,目标设备独立枚举、独立成组。 |
| M.2 转 PCIe 直通 IOMMU | 普通主板原生不支持拆分,但某个 M.2 槽能把设备单独报给系统。 | 转出来的设备单独在一个 IOMMU 组里,且不和板载网卡、SATA、USB、等设备混组。 |
| PCH / 南桥故障 | 老平台、魔改板、某些 PCH 槽有特殊拓扑或 DMAR/IOMMU 表现。 | 设备挂在 PCH 路径下,拓扑和分组符合VT-d功能有问题,很吃主板本身。 |
| 双路 / 特殊 Root Port | X99 双路、服务器魔改板、工作站魔改板 | 找到分组特殊、Root Port 特殊或能稳定独立成组的槽。 |
主板过怎么只有四种路线?你可能会疑问,常常在抖音/B站等平台看到其他过法的引流视频呀,没列举是不会吗?
不是没列举,而是大概率不存在,至少99.99%的另类过法是假的。 真有可行且稳定的方案,如果想做高端私域就不会发出来引流,如果想做铺开市场就不会只有个别卖家宣传。
存在又小众稳定又亲自叫卖的方案吗?直接用最简单最直白最不绕弯子的方式告诉你,圈圈圆圆圈圈~ 能出来宣传证明对当前收益的不满足,太渴望圈米了。而产品的质量根本不足以撑起那套所谓的,稳定靠客户内推就够啦的意淫说法。
就个别账户宣传证明搞不起账号矩阵,手下也没有代理帮忙铺市场。而这种卖家又能有什么实力呢?靠扣字出来从业多少年/曾在哪高就的实力吗?
何况Ai发展日新月异,连用来筛选智力低下韭菜的虚张声势文案都不用自己绞尽脑汁想咯,何尝不是Ai带来的生产力爆炸呢。
毕竟前几年想搞些玄乎其玄又看似靠谱的引流文案,干这行的90%连大专都没上过,想不出来的。
这种以小博大的宣传方式,从板子本体到板子固件屡试不爽。如今,过去固件的生态位轮到了怎么过VT-D。
固件信息差造就的技术性神话,的的确确让绝大多数卖家爽吃了三年大米,大伙都不想戳破自己的利益。
现在圈主板过VT-D方案米是最多的,正巧当下我百无聊赖,那就来揭开主板过VT-D的神秘面纱吧。
BIOS 必看项(理解要关的选项都起到什么作用)
授人以鱼不如授人以渔,告诉你原理而不是混淆视听的关哪个插哪个开哪个,能明白吗? 以下选项不是所有 BIOS 都有,同类选项在不同品牌上的名字也可能不同。没有的话可以用软件AMIBCP手动解锁选项,前提是原生支持这个功能。
AMIBCP解锁BIOS选项的教程,附带改完BIOS怎么刷进主板的教程在最后面。条件允许买个CH341A编程器,不然有些可能品牌刷不了。
我推荐一个最简单的方法,把你主板的具体品牌型号发给Codex或者Claude Code说清需求,会直接给你下载好Bios然后解锁你要的选项。
(别用掺水的中转站api或者ds的api,省钱的话可以用GLM5.2,最好是gpt5.5或者opus4.8,改坏BIOS纯浪费时间) (另外多说一句,如果看到这里你还信什么魔改BIOS,并且要花钱去买魔改BIOS,只能说这辈子有了,活该被圈哈)
| 平台 | 常见要处理的选项 | 常见设置 | 功能说明 |
|---|---|---|---|
| 通用 | ACS / ACS Redirect / P2P Redirect | Disable / 关,重点关 Redirect | 控制 PCIe 设备间访问是否被强制拉回上游,关掉主要是为了让设备间 P2P 路径少被重定向。 |
| 通用 | Above 4G Decoding | Disable / 关 | 给多 PCIe 设备和大 BAR 设备分配更大的地址空间,转接卡、多设备环境开启。 |
| 通用 | ASPM / DMI ASPM / PEG ASPM / L1 Substates | Disable / 关 | PCIe 省电功能,转接卡、延长线、M.2 转 PCIe路线比较丐的主板供电不足时一定要关。 |
| Intel | VT-d / IOMMU | Enable / 开 | 不双开VT-d你过VT-d干嘛呢? |
| Intel | Control IOMMU Pre-boot Behavior | Disable / 关 | 控制系统启动进 Windows 前,固件阶段是否启用 IOMMU 管 DMA。 |
| Intel | X2APIC Opt Out | Disabled / 关 | 控制固件是否要求系统退出 x2APIC 模式,和中断/重映射环境有关。 |
| Intel | DMA Control Guarantee | Disabled / 关 | 固件向系统声明 DMA 控制能力是否完整可用的选项。 |
| Intel | VMD / Intel RST VMD | Disabled / 关 | Intel 的 NVMe/PCIe 存储管理层,关掉是为了避免 M.2/NVMe 设备被 VMD 包一层,其他的路线关不关无所谓。 |
| Intel | PCH-FW / Firmware TPM / PTT / Secure Boot | Disabled / 关 | 平台固件安全和可信启动相关项。 |
| AMD | IOMMU / AMD-Vi | Enable / 开 | 再说一遍,不双开iommu你过iommu干嘛呢? |
| AMD | PSP / fTPM / Firmware TPM | Disable / 关 | 负责 TPM、密钥、可信启动等平台安全功能。 |
| AMD | Pre-Boot DMA Protection | Disable / 关 | 启动前 DMA 防护,管 BIOS/UEFI 到 Windows 接手前的 DMA 限制。 |
| AMD | Kernel DMA Protection / Memory Access Protection | Disable / 关 | Windows 运行后的 DMA 防护状态,用 IOMMU 限制 DMA 设备访问未授权内存。 |
| AMD | PSPP Policy / PCIe Speed Power Policy | Disable / 关 | 控制 AMD 平台 PCIe 链路在性能、省电和稳定性之间的策略,转接卡、延长线、M.2 转 PCIe 不稳定或掉速时需要重点关注。 |
PS:重点提醒BIOS 菜单“有这个选项”并按照教程设置了,不等于可以过VTD。 能不能过只看最后结果:DMA设备有没有按预期路径出现,有没有单独成组。
路线一:CPU 直连 PCIe 拆分方案
适合:X299、W790、WRX80/WRX90、TRX50、部分 Z690/Z790/Z890、部分 X570/X670/X870 (就不一一列举了,符合条件的都可以搞)
这条路线原理不是哪条PCIe卡槽神奇特殊,插上就能过。而是这个卡槽必须是 CPU 直连,并且 BIOS 支持 PCIe Bifurcation。
| 必须条件 | 具体要求 | 不满足会怎样 |
|---|---|---|
| PCIe直通CPU | 说明书写 CPU lanes / PEG / CPU PCIEX16。 | 如果写 Chipset / PCH,插了就等着拉。 |
| 原生拆分 | BIOS 有 PCIe Bifurcation、PEG Port、x8+x8、x4+x4+x4+x4。 | 没有拆分选项,插再多转接卡也只会认一个设备或不稳定,要原生支持,魔改出来的没用。 |
| 卡槽数量 | 必须有第二个卡槽也是 CPU 通道。 | 很多板其他卡槽只是 PCH x4,第一/第二条长槽不等于一定是 CPU 直连。 |
| 转接卡 | x4+x4+x4+x4 需要无芯片 bifurcation 转接卡;没有拆分的主板要用带 PCIe Switch 的卡。 | 转接卡和 BIOS 模式不匹配,通常只识别第一个设备,结果也是拉拉拉。 |
操作步骤
- 查主板说明书,确认 PCIEX161、PCIEX162 是否来自 CPU。
- 找到 PCIe Bifurcation / PEG Port Configuration,把 x16 改成 x8+x8,或者 x4+x4+x4+x4。
- 关闭BIOS必看项里对应AMD / Intel要关的选项。
- 断电插DMA,两张设备用 x8+x8,四个 x4 设备用 x4+x4+x4+x4 转接卡。
- 开机进系统,先确认每个设备都能被系统识别。
- 进 Linux 看 IOMMU Group,Windows 用“按连接查看设备”看它们挂在哪个 Root Port 下(没Linux准确)。
- 如果DMA固件设备识别且目单独成组,就成功了。
| 结果 | 问题所在 | |
|---|---|---|
| 只识别一个设备 | BIOS 没开拆分,或者主板/转接卡不支持这个拆分模式。 | |
| 设备都识别,但同一个 IOMMU 组 | 物理通道拆出来了,但分组没有拆干净,等于白拆了。换槽、检查BIOS、换主板。 | |
| 设备挂在 PCH Root Port 下 | 插错槽了,这不是 直通CPU的卡槽。 |
路线二:M.2 转 PCIe 方案
只适合不支持原生 PCIe 拆分的普通主板,如果原生支持拆分用路线一更好!
需要某个 M.2 槽能让转出来的设备单独成组,这个自己测试有没有。 (市面上的铭瑄呀昂讯呀等丐中丐主板的方案就是这个路线)
这套方案能不能用,核心只看一个结果:M.2 转 PCIe 后插上的设备,能不能在系统里单独成组。
| 必须条件 | 具体要求 | 不满足会怎样 |
|---|---|---|
| M.2 槽必须走 PCIe | SATA-only 的 M.2 槽不行。最好是 PCIe x4。 | 必须是 PCIe 协议的 M.2 槽,支持 SATA/NVMe 双模式的槽也必须工作在 PCIe 模式,不然就拉。 |
| M.2 槽确认过 | 不是所有 M.2 槽都行;要实测这个槽转出来的设备能不能单独成组。 | 不能单独成组拉。 |
| BIOS 版本 | 菜单里有要关的选项还不够,要确认这个版本能不能把目标 M.2 设备单独报给系统。 | 不能独立上报拉。 |
| VMD 要关 | 避免 M.2 设备被 Intel VMD/RST 包一层。 | 影响路径导致拉。 |
| 如果是无盘环境 | 要另外插网卡,优先用另一个已验证 M.2 槽转独立网卡,不优先用板载网卡。 | 有盘就不用在意。 |
操作步骤
- 确认主板+ BIOS 版本是能把目标 M.2 设备单独报给系统的,不是同型号就一定能复现,要对应品牌特定版本的BIOS。
- 关闭BIOS必看项里对应AMD / Intel要关的选项。
- ASPM、DMI ASPM、PEG ASPM、L1 Substates。M.2 转接不稳定时,把目标 M.2 Link Speed 固定到 Gen3 或 Gen4。
- 断电,把 M.2 转 PCIe x4 转接卡插到已验证的 M.2 槽,DMA插到转接卡上。
- 检查DMA固件设备是不是单独出现、是不是单独 IOMMU 组。
- 进 Linux 看 IOMMU Group,Windows 用“按连接查看设备”看它们挂在哪个 Root Port 下(没Linux准确)。
- 如果和板载网卡、SATA、USB、PCH 设备混到一组,说明这个 M.2 槽或 BIOS 不合适。
| 结果 | 问题所在 | |
|---|---|---|
| 设备不识别 | 检查 M.2 槽是否支持 PCIe、VMD 是否关闭、转接卡供电和链路速率。 | |
| 只在某个 BIOS 有效 | 正常。这个方案高度依赖 BIOS 的 ACPI/DMAR/M.2 初始化行为。 | |
| 转出来仍混组 | 换 M.2 槽、换 BIOS 版本,同型号主板并不通用。 |
路线三:PCH / 南桥方案
适合B85、魔改 W480、部分老 X99、部分 PCH 槽特殊的主板。这类主板基本上都卡的很。 (就不一一列举了,符合条件的都可以搞)
这条路线看的PCH / 南桥槽有没有被 BIOS / DMAR / IOMMU 以特殊方式报给系统。正常新平台走 PCH 的设备都会被 IOMMU 管,用这条路线必拉。
| 必要条件 | 具体要求 | 不满足会怎样 |
|---|---|---|
| 有问题的PCH 槽 | 查说明书,标注 from Chipset / PCH 的 PCIe x1/x4/x16 物理槽,或者 PCH M.2 槽,再去翻翻网上有没有信息说过该主板PCH槽的VT-d / IOMMU功能有问题 / 阉割 / 不生效 / 虚标。 | PCH 槽表现特殊,才可以用,没有特殊表现就不要硬用。没问题插上等于拉。 |
| 问题PCH 槽的代价 | PCH 路径多一层 PCH→DMI→CPU,带宽共享、延迟更高。 | 那叫一个纵享丝滑呀!(反话) |
操作步骤
- 确认目标槽位确实来自 PCH,不要只看长度。
- 确定要插的 PCH 槽是有问题的,什么问题看上面表格。
- 关闭BIOS必看项里对应AMD / Intel要关的选项。
- 进 Linux 看 IOMMU Group,Windows 用“按连接查看设备”看它们挂在哪个 Root Port 下(没Linux准确)。
- 如果这个槽的设备路径、分组、DMAR 表现和普通 CPU 槽明显不同,就是可用的。
- 如果只是正常显示、还混一堆板载设备,就没过不能用。
重点提醒这条路线最容易误解,不是说某些主板插南桥/PCH 就不受 IOMMU 管。正常平台下走 PCH 的设备也会被系统管。这里说的是某些主板/BIOS/老平台的特殊性,必须实测。
路线四:双路 / 特殊 Root Port 方案
适合:X99 双路、服务器改桌面板、工作站魔改板。不能靠芯片组名字判断,必须看说明书/图纸和实测。 (就不一一列举了,符合条件的都可以搞)
| 必要条件 | 具体要求 | 不满足会怎样 |
|---|---|---|
| 分清插的槽挂 CPU0 还是 CPU1 | 双路平台不同 CPU 下的 PCIe Root Complex 不一样。 | 一定要插另一个CPU的那个直通CPU的PCIe槽上,是不是有点绕?这你都理解不了就属于智力低下。插到PCH槽或者插了CPU的直通CPU的PCIe槽上,活该拉。 |
| 有没有 PCIe Switch ,DMAR / IOMMU 是否正常声明 | 经过 Switch 的槽位分组和 P2P 行为会变化。老BIOS / 魔改 BIOS 可能出现特殊分组。 | 双路平台要注意 NUMA,设备挂在哪颗 CPU 下,就更靠近那颗 CPU 的内存和中断路径。没插错的情况下一般不需要特别关注,属于小概率事件。出现了情况会比较复杂,一句两句也说不清。 |
操作步骤
- 找主板图纸或说明书,看标出的每条 PCIe 槽挂 CPU0、CPU1、PCH 还是 PCIe Switch。
- 怎么插上表里说了,不废话,这个方案是最简单即插即用的,不用像其他三个路线那样核实,除非你插错
- 关闭BIOS必看项里对应AMD / Intel要关的选项。
4.别插错,别插错,别插错。重要的事情说三遍。看说明书看图纸确定下再插。
路线五:海光方案
这个就无需多言了,懂得都懂(不懂也没事,原生IOMMU摆设)。除了溢价高性能差,非常另类热度过去或者和谐后价值归0没人接盘外,没什么缺点。
粗分不同型号适合的路线
| 平台 | 优先路线 | 友情提示 |
|---|---|---|
| X299、W790、WRX80、WRX90、TRX50 | CPU 直连拆分 | 优先通道多的,优先x8+x8 / x4+x4+x4+x4。特殊主板容易被特殊安排。 |
| Z690/Z790/Z890、X570/X670/X870 | CPU 直连拆分 | 只在第二长槽也走 CPU 且 BIOS 支持拆分时可行。性能很舒服,但不是每一款都行。通常要高端产品线。 |
| B660/B760、B550/B650、W680 | 单卡 CPU 主槽或 M.2 转 PCIe | 多数不支持原生拆分,找可独立成组 M.2 槽的。VTDDXE天生有点问题的丐中丐最好。 |
| B85、魔改 W480、部分老 X99 | PCH / 南桥或特殊槽 | 靠老平台/魔改 BIOS 的特殊表现,不是同型号就一定可以。同样特殊主板容易被特殊安排。 |
| X99 双路、服务器魔改板、工作站魔改板 | 双路特殊 Root Port | 看 CPU0/CPU1/PCH/PCIe Switch,不要乱插。不需要什么操作,最简单。同样特殊主板容易被特殊安排。 |
| 品牌机/OEM/BIOS 锁死板 | 不推荐 | 选项少、图纸少、没说明书、锁功能,试错成本高。(你能七天无理由当我没说,这类是最容易出简单易用放松大脑路线三/四方案的) |
一定要检查通道和分组
Linux 最准!Windows 只能粗查
Linux 检查通道
看 PCIe 树:
lspci -tv
看设备 ID:
lspci -nn
看 IOMMU Group:
for g in /sys/kernel/iommu_groups/*; do
echo "IOMMU Group ${g##*/}:"
for d in "$g"/devices/*; do
lspci -nn -s "${d##*/}"
done
done
怎么判断过没过?DMA固件设备单独在一个 IOMMU Group 里,不能和板载网卡、SATA、USB、PCH 杂项混在一起。
Windows 检查通道的 4 种方法
| 方法 | 怎么操作 | 获取信息 | 局限性 |
|---|---|---|---|
| 1. 设备管理器按连接查看 | 设备管理器 → 查看 → 设备(按连接)。一路展开 ACPI x64-based PC → Microsoft ACPI → PCI Express Root Complex → PCI Express Root Port。 | 目标设备挂在哪个 Root Port 下面;能初步判断是主槽、M.2 路径还是 PCH 路径。 | 看不到真正 IOMMU Group,只能看大概连接层级。 |
| 2. msinfo32 看 DMA 状态 | Win+R 输入 msinfo32,系统摘要里看 Kernel DMA Protection、Virtualization-based Security、Secure Boot State。 | 能看到系统安全/DMA 保护状态。 | 这不是通道树,也不能判断设备是否单独成组。 |
| 3. PowerShell 查 Location Path | 管理员 PowerShell:先 Get-PnpDevice -PresentOnly 找目标设备,再用 Get-PnpDeviceProperty 查 LocationPaths。 | 能看到 PCIROOT、PCI(…) 这样的路径字符串,用来对比不同槽位是否变化。 | 路径需要自己对照,不如 Linux 直观。 |
| 4. HWiNFO64 / PCI-Z 看总线树 | 打开 Bus / PCI Bus 页面,查看设备的 Bus、Device、Function、Link Width、Link Speed、上游端口。 | 能看链路宽度、速率、上游桥接关系,适合新手截图对照。 | 第三方工具只做辅助,最终仍推荐用 Linux 确认 IOMMU Group。 |
PowerShell 示例
Get-PnpDevice -PresentOnly | Where-Object {$_.FriendlyName -match "Ethernet|Network|NVMe|PCI|USB|VGA|目标设备关键字"} | Select-Object Class,FriendlyName,InstanceId
把上一步的 InstanceId 复制到下面:
Get-PnpDeviceProperty -InstanceId "PCI\VENxxxx&DEVxxxx…" -KeyName DEVPKEYDeviceLocationPaths
常见问题排查
| 现象 | 最可能原因 | 处理 |
|---|---|---|
| M.2 转 PCIe 不识别设备 | VMD 没关、M.2 槽不是 PCIe、转接卡供电/链路问题。 | 关 VMD,换 M.2 槽,固定 Gen3/Gen4,检查转接卡供电。 |
| PCIe 拆分后只认一个设备 | 主板不支持该拆分模式,或 BIOS 没设 x4x4x4x4。 | 改 BIOS 拆分模式;确认转接卡类型;换支持 bifurcation 的板。 |
| 设备和 USB/SATA/PCH 混组 | 槽位挂 PCH,或 ACS/IOMMU 拓扑不够干净。 | 换 CPU 直连槽、换 M.2 槽、检查BIOS选项设置是否正确。 |
| Windows 看着正常,Linux 发现混组 | Windows 不显示真正 IOMMU Group。 | 以 Linux 结果为准,也是很多人以为自己拆好了实际没拆好拉的原因。 |
| 同型号板别人能用你不能用 | 具体型号、BIOS 版本、M.2 槽位、CPU、转接卡、设置不一致。 | 交叉核实下能用的那个和你是不是品牌一样、型号一样、BIOS一样、设置一样、插的卡槽一样。 |
| 开机掉设备 | ASPM/省电、链路速率、转接线质量。 | 关 ASPM;固定 Gen3;减少转接层级。 |
重点提醒能不能成功就看三件事。卡槽来源、BIOS 行为、通道实测。能单独成组就可用,不能单独成组就会拉,不要硬套别人的主板方案。
AMIBCP解锁BIOS
和开头说的一样,实在不会搞去开个Ai会员,比如鸡皮提比如克劳德,让Ai给你搞,没什么技术含量的!
你非要花钱买魔改Bios只能说智力低下。
操作步骤
自行下载AMIBCP软件
AMIBCP 软件左侧是菜单树,右侧才是变量和默认值。Show 只控制菜单是否可见;真正的启动行为通常跟 Failsafe、Optimal 或对应 Setup 变量有关。
- 管理员身份运行 AMIBCP。
- 打开要修改的镜像。
- 查这些路径:Advanced、Socket Configuration、IIO Configuration、Intel(R) VT for Directed I/O、System Agent、PCIe Configuration。
- UI 找不到时,在 IFR 文本中搜索:ATS、Directed I/O、DMA Re映射、Interrupt Re映射、Posted Interrupt、PassThrough DMA、Coherency。
- 按照下表设置。
AMI设置表
简单示例,具体怎么弄看开头的表
| 选项 | 搜索 | 开关 | 说明 |
|---|---|---|---|
| VT-d 主开关 | Intel(R) VT for Directed I/O, VT-d, Directed I/O | 已启用 | 保持可见 VT-d/IOMMU。 |
| Pass-through DMA | PassThrough DMA, Pass Through DMA, DMA PassThrough | 已启用 | 保持启用。 |
| ATS | ATS, PCIe ATS, ATS Support, Address Translation Services | 已禁用 | Failsafe 和 Optimal 都设为 已禁用。 |
| 路线级 DMA 重映射 / 中间层阻断 | DMA Re映射, DMA Remap, DMA Control, DMA Protection | 已禁用 | 保持关闭。 |
| Interrupt re映射 | Interrupt Re映射, Interrupt Remap | 不改 | 默认选项即可。 |
| Posted interrupt / coherency | Posted Interrupt, Coherency, Coherent, No Snoop | 不改 | 默认选项即可。 |
| PCIe grouping helpers | ACS, ACS Control, ARI Forwarding, Relaxed Ordering | 已启用 | 影响 grouping/bridge,不能替代 ATS 或 DMA-re映射。 |
如果 AMIBCP 不能保存
- 用 UEFITool 提取对应 Setup 模块。
- 用 IFR Extractor 解析。
- 记录精确 VarStore、Offset、宽度和所有值。
- 不要默认 已启用 = 1、已禁用 = 0,以 IFR 为准。
- 只用匹配该主板和 BIOS 版本的 UEFI 变量工具。
- 先读原值,只写一个变量,再读回,冷启动重测。
有签名验证的品牌怎么刷进主板
去抖音/B站这些视频网站搜视频吧,挺多的,没图懒得文字描述。
无盘过方案
没试过,认识的一些会搞的小伙伴。最近被天老爷拿下了,我也不会。等好心人开源吧。
固件过 / 软件过 / U盘过方案
这块小白别轻易尝试,弄不好你开不了机,不论你是直接改主板BIOS还是主机 / 副机软件改还是U盘改还是固件写入改。
且不要直接照着教程改,教程只是教你最基础的怎么改的思路,就像教你做固件只教了配置空间一样,具体怎么实现自行探索。
软件过的源码我已经开源了,取自市面上热销的某款三位数一个月的副机过软件(怎么取的你别问!),在线文档自取源码。
VtdDxe 是很多 AMI Aptio 固件用于 Intel VT-d 初始化、DMAR 设置和 DMA-re映射 移交 的 DXE 阶段的驱动。目标可能叫 VtdDxe、IntelVTdDxe、DxeVtd、SaVtdDxe,也可能只是 PE 镜像里含 VT-d/DMAR 字符串的 GUID。
先区分两种状态:
| 状态 | 效果 |
|---|---|
| 双开 | 检测到VT-d开启了,实际功能没生效。 |
| 双关 | 检测到VT-d开启了,实际没开启。 |
要改哪些地方:
搜索关键词:VtdDxe、VT-d、Directed I/O、DMAR、DMA Re映射、Intel(R) VT for Directed I/O。记录 固件文件 GUID、卷路径、section 类型、PE32 image size、压缩 section。确认是 DXE 驱动,不要因为含 VT-d 字符串就移除 setup forms、PEI、SMM 驱动 或 ACPI table storage。
改法A:移除 BIOS的VtdDxe DXE 模块
保留设置菜单和 NVRAM 状态,但阻止 VtdDxe 驱动被分发执行,从而停止该 驱动 负责的 VT-d 初始化、DMAR 移交 或 DMA-re映射 setup。
流程:
- 打开 modvtddxework.bin。
- 定位 VtdDxe/IntelVTdDxe。
- 提取 FFS “原样”为 VtdDxe_original.ffs。
- 提取 PE32 主体 为 VtdDxeoriginal主体.efi。
- 移除整个 VtdDxe FFS file,不要只删压缩子 section。
- 保存为 modvtddxeremove.bin。
- 将修改好的BIOS刷入主板。
- 刷好先进 BIOS,确认可见 VT-d 状态。
主流主板基本上,VtdDxe和其它 DXE、ACPI、IIO、System Agent 初始化绑定。删了可能黑屏或损坏 ACPI。
极大概率行不通,但有些人拿这种方案引流,实操了就是成砖头。
改法 B:替换返回函数实现双开/双关
保持同一个 FFS、GUID、dependency section 和 compression layout,只把 PE32 image 主体 的 入口点 修改为立即返回成功。
效果:
- BIOS 仍按 NVRAM/默认值 显示 VT-d开启;
- VtdDxe FFS 仍在固件树中;
- DXE 分发执行 收到 EFI_SUCCESS;
- 该 驱动 的真实 VT-d 初始化代码不运行。
流程:
- 提取 VtdDxeoriginal主体.efi。
- 用 能识别 PE 的工具查看 入口点 AddressOfEntryPoint。
- 通过 PE section 表 把 入口点 RVA 转成 文件偏移,不要猜字符串 offset。
- x64 AMI DXE 驱动 常见入口 补丁:
31 C0 C3
对应:
xor eax, eax
ret
x64 UEFI 中 EFI_SUCCESS 是 RAX = 0。
- 若要覆盖固定窗口,前三字节保留 31 C0 C3,剩余填 90 (NOP),不要移动文件内容。
- 保存为 VtdDxeretsuccess_主体.efi。
- 在 UEFITool 中替换原 PE32 image 主体,不替换整个 卷,不随意改 GUID。
- 保存为 modvtddxeret.bin。
- 重新打开确认同一 FFS 仍存在、主体 有 31 C0 C3、固件树解析干净。
- 刷写后进 BIOS 确认 VT-d 可见状态,再进 Windows 重测。
如果 entry-point 返回 太激进,改为在反汇编中围绕 DMAR、DmaRe映射、VtdEnable、EnableDmaRe映射、VtdInit、InstallAcpiTable、EFIACPIDMAR 找关键函数或分支,只让决定性 re映射/锁定/DMAR 发布路径提前成功返回,保留其它无害 setup 逻辑。
验证不要只看 BIOS 菜单。真正有用的结果是:设置菜单/NVRAM 显示 VT-d 已启用,目标 DMA 路线没有被正常 re映射 path 有效拦住,并且能经受完整关机、PSU 放电和冷启动。 这是双开的大致思路,具体怎么实现靠什么实现自己想办法。双关也没多大区别,能懂这个的双关自己也能整明白。
固件写DMAR
保持主板 BIOS 不变,在 DMA 固件中加入 DMAR 重写阶段,让设备在启动时找到主机物理内存中的 ACPI DMAR 表,修改它,然后停止写入。
这里的“固件”是 DMA 的固件,不是主板 BIOS。同样只给一个思路,老外在github上发的,只支持intel。市面上的双开固大多这个方案。
固件写法参考
PCIe 链路建立
-> 等待配置空间/BAR 状态稳定
-> 定位 RSDP
-> 解析 XSDT/RSDT
-> 查找 DMAR
-> 识别目标 DRHD/device scope
-> 修改选定字节
-> 重新计算 ACPI 校验
-> 读回并校验
-> disable the rewrite stage until next
不要循环写。固件只写一次、验证一次,然后停止。持续写入会造成 ACPI 校验和 race崩溃。
定位 DMAR
优先使用 ACPI 链:
RSDP -> XSDT/RSDT -> DMAR
先搜索 RSDP signature:
RSD PTR
真实 signature 是 8 字节,最后一个字节是空格。标准范围先试:
EBDA area
0x000E0000 - 0x000FFFFF
验证 RSDP 校验和;ACPI 2.0+ 优先 XsdtAddress,RsdtAddress 只做 兜底。读取 XSDT/RSDT header,验证 signature、length、校验和,遍历 table pointers 找 DMAR。
如果找不到 RSDP,才物理扫描 DMAR,并严格验证:offset 0x00 signature、offset 0x04 length、revision、OEM 字段、全表 校验和。不要看到原始 DMAR 字符串就 补丁。
解析 DMAR
| 结构 | Type | 含义 | 补丁 相关性 |
|---|---|---|---|
| DRHD | 0 | DMA Re映射 Hardware Unit Definition | 主要目标。 |
| RMRR | 1 | Reserved Memory Region Reporting | 通常不先动。 |
| ATSR | 2 | Root-port ATS reporting | ATS 路径相关时才动。 |
| RHSA | 3 | Re映射 hardware static affinity | 通常不是首选。 |
| ANDD | 4 | ACPI namespace device declaration | 通常不是首选。 |
| 策略 | 编辑内容 | 结果 | 风险 |
|---|---|---|---|
| 移除目标 DRHD device scope | 只改匹配目标 BDF/path 的 scope list | 目标可能不再归该 re映射 unit | 最精准,但仅在明确 scoped 时有效。 |
| 清 matching DRHD 的 INCLUDEPCIALL | 清 DRHD flags bit 0 | 未明确列出的设备可能不再被覆盖 | 影响更广。 |
| 中和目标 ATSR scope | 移除/缩窄匹配 根端口 的 ATSR scope | 可停止 ATS 相关处理 | 仅在 ATSR 参与时有用。 |
| 隐藏整个 DMAR | 破坏 signature 或移除 XSDT/RSDT pointer | OS 可能认为没有 DMAR | 太宽,只适合诊断。 |
不要首选删除整个 DMAR 表;那通常会让 VT-d 可见状态变化太大。
固件实现功能
固件在Windows 已启动后由 host tool 再改通常太晚。逻辑必须在 FPGA logic、softcore、MCU 或 embedded controller 的 autonomous boot-stage 中执行。
需要的部件:
| 部件 | 作用 |
|---|---|
| PCIe link state gate | 等 LTSSM L0 等稳定状态。 |
| Physical memory read/write primitive | 通过 DMA engine 读写 host physical memory。 |
| Scratch buffer | 存一份 DMAR table,4 KB 通常够,建议 cap 16 KB。 |
| Target selector | 知道要排除/缩窄哪个 BDF/root-port path。 |
| ACPI parser | 定位 RSDP、XSDT/RSDT、DMAR 并验证 校验和。 |
| Debug log | 把状态码存到设备 RAM/registers 供后续读取。 |
host access layer 原型:
define MAXDMARSIZE 0x4000
struct pci_bdf {
uint16_t segment;
uint8_t bus;
uint8_t device;
uint8_t function;
};
bool hostreadphys(uint64t pa, void *dst, uint32t len);
bool hostwritephys(uint64t pa, const void *src, uint32t len);
uint64t fwgetconfiguredrsdp_pa(void);
uint64t fwgetconfigureddmar_pa(void);
uint64t fwtime_ms(void);
bool pcielinkis_l0(void);
void fwlogu64(uint32t tag, uint64t value);
DMAR 首个 re映射 structure 偏移:
DMARSTRUCTOFFSET = 48
DMARTYPEDRHD = 0
DRHDINCLUDEPCI_ALL = 0x01
RSDP/DMAR finder 推荐顺序:
- 精确主板和 BIOS 的已知 rsdppa / dmarpa;
- 平台特定 ACPI reclaim/reserved ranges;
- EBDA 和 0xE0000-0xFFFFF legacy scan;
- broad physical scan RSD PTR 和 DMAR,但必须严格校验。
只实现 legacy scan 的固件要明确写进 build notes;这对很多当前 B660/B760 UEFI 板不够。
scope path 配置示例:
struct scope_match {
uint8t startbus;
uint8t pathlen;
uint8_t path[8][2]; /* device, function */
};
完整 one-shot rewrite task 应覆盖状态:无 link、找不到 DMAR、读失败、table 无效、无变化、写失败、验证失败、成功。target_scope 必须来自实际主板的 DMAR dump。可复用固件应把这些作为 编译期 constants 或配置寄存器:
目标 segment
目标 start bus
目标 path 长度
目标 path 的 device/function 字节
兜底 mode: disabled / clear INCLUDEPCIALL / 只读
RSDP、XSDT、DMAR 精确字段
两种选择:
| 方法 | Host memory writes | 适合情况 |
|---|---|---|
| In-place DMAR 补丁 | 直接写原 host DMAR table;RSDP 只读。 | 首个实现优先,移动件少。 |
| RSDP -> shadow XSDT -> shadow DMAR redirect | patched DMAR 写入已知 scratch page;cloned XSDT 指向它;再改 RSDP XsdtAddress。 | 原 DMAR 区域不适合原地改,或需要易开关 redirect。 |
shadow 方法的 SHADOWXSDTPA 和 SHADOWDMARPA 必须是目标特定、确认可写且不被 firmware/boot path 使用的物理页。
RSDP 字段:
| Offset | Field | Size | 用途 |
|---|---|---|---|
| 0x00 | Signature RSD PTR | 8 | 不改。 |
| 0x08 | ACPI 1.0 校验和 | 1 | 只在改前 20 字节时修。 |
| 0x10 | RsdtAddress | 4 | legacy redirect,可选。 |
| 0x14 | RSDP length | 4 | 不改。 |
| 0x18 | XsdtAddress | 8 | shadow 方法主 redirect 字段。 |
| 0x20 | Extended 校验和 | 1 | 改 XsdtAddress 后必须修。 |
redirect 写法:
old host RSDP at rsdp_pa
rsdppa + 0x18 <- SHADOWXSDT_PA
rsdp_pa + 0x20 <- new extended 校验和
XSDT 字段:
| Offset | Field | Size | 用途 |
|---|---|---|---|
| 0x00 | Signature XSDT | 4 | 不改。 |
| 0x04 | Length | 4 | 只替换一个 pointer 时保持。 |
| 0x09 | Checksum | 1 | 改 entry 后必须修。 |
| 0x24 | First table pointer | 8 | 替换指向 old DMAR 的 entry。 |
entry_count = (Xsdt.Length - 0x24) / 8
DMAR 字段:
| Offset | Field | Size | 用途 |
|---|---|---|---|
| 0x00 | Signature DMAR | 4 | 除非诊断隐藏整表,否则不改。 |
| 0x04 | Length | 4 | 删除 bytes 时改。 |
| 0x09 | Checksum | 1 | 每次 补丁 后必须修。 |
| 0x24 | Host Address Width | 1 | 通常不先改。 |
| 0x25 | DMAR flags | 1 | 通常不先改。 |
| 0x30 | First re映射 structure | variable | 从这里 walk。 |
DRHD 字段:
| 相对 offset | Field | Size | 用途 |
|---|---|---|---|
| 0x00 | Type | 2 | 0 表示 DRHD。 |
| 0x02 | Length | 2 | 删除 scope 时减少。 |
| 0x04 | Flags | 1 | bit 0 是 INCLUDEPCIALL。 |
| 0x05 | Size | 1 | register-set size encoding,不是 reserved。 |
| 0x06 | PCI Segment | 2 | 匹配目标 segment。 |
| 0x08 | Register Base Address | 8 | 不改。 |
| 0x10 | First device scope | variable | 移除或缩窄匹配 scope。 |
Device scope 字段:
| 相对 offset | Field | Size | 用途 |
|---|---|---|---|
| 0x00 | Scope type | 1 | 端点、bridge、IOAPIC、HPET 等。 |
| 0x01 | Scope length | 1 | 删除 scope 的 byte 数。 |
| 0x02 | Scope flags | 1 | 不懂就不改。 |
| 0x03 | Reserved | 1 | 不改。 |
| 0x04 | Enumeration ID | 1 | 通常不改。 |
| 0x05 | Start bus | 1 | 匹配目标 root-port path。 |
| 0x06 | Device/function path bytes | variable | 每对是 device, function。 |
in-place DMAR适合:原 DMAR memory area 可写、不需要 redirect、想先证明固件能在系统parsing 前修改 host DMAR。
RSDP redirect + shadow DMAR 写入顺序:
- Read original RSDP.
- Read original XSDT.
- Find original DMAR pointer in XSDT.
- Read original DMAR.
- Build patched DMAR in device 临时缓冲区.
- Write patched DMAR to SHADOWDMARPA.
- Build cloned XSDT where old DMAR pointer is replaced by SHADOWDMARPA.
- Write cloned XSDT to SHADOWXSDTPA.
- 补丁 host RSDP XsdtAddress to SHADOWXSDTPA.
- Fix and verify RSDP extended 校验和.
redirect 方法只必须改原始 RSDP:
RSDP + 0x18 = SHADOWXSDTPA
RSDP + 0x20 = fixed extended
评论区