侧边栏壁纸
博主头像
Links'Blog 博主等级

躬自厚而薄责于人

  • 累计撰写 41 篇文章
  • 累计创建 41 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

全主板可行的过VT-D总结教程

前言

没有配图和视频,因为太麻烦!但实操步骤 + 原理解析总体十分详细。理解能力强的人看了一点就通。如果你看了以后觉得云里雾里,不知道怎么做,看不懂步骤。我建议就别亲自上手,还是花点钱找人弄吧。毕竟真上手也是搞坏的概率大。你说为什么不一步一配图把最没基础的小白也教会?没这个义务!况且现在绝大多数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 模式不匹配,通常只识别第一个设备,结果也是拉拉拉。

操作步骤

  1. 查主板说明书,确认 PCIEX161、PCIEX162 是否来自 CPU。
  2. 找到 PCIe Bifurcation / PEG Port Configuration,把 x16 改成 x8+x8,或者 x4+x4+x4+x4。
  3. 关闭BIOS必看项里对应AMD / Intel要关的选项。
  4. 断电插DMA,两张设备用 x8+x8,四个 x4 设备用 x4+x4+x4+x4 转接卡。
  5. 开机进系统,先确认每个设备都能被系统识别。
  6. 进 Linux 看 IOMMU Group,Windows 用“按连接查看设备”看它们挂在哪个 Root Port 下(没Linux准确)。
  7. 如果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 槽转独立网卡,不优先用板载网卡。 有盘就不用在意。

操作步骤

  1. 确认主板+ BIOS 版本是能把目标 M.2 设备单独报给系统的,不是同型号就一定能复现,要对应品牌特定版本的BIOS。
  2. 关闭BIOS必看项里对应AMD / Intel要关的选项。
  3. ASPM、DMI ASPM、PEG ASPM、L1 Substates。M.2 转接不稳定时,把目标 M.2 Link Speed 固定到 Gen3 或 Gen4。
  4. 断电,把 M.2 转 PCIe x4 转接卡插到已验证的 M.2 槽,DMA插到转接卡上。
  5. 检查DMA固件设备是不是单独出现、是不是单独 IOMMU 组。
  6. 进 Linux 看 IOMMU Group,Windows 用“按连接查看设备”看它们挂在哪个 Root Port 下(没Linux准确)。
  7. 如果和板载网卡、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,带宽共享、延迟更高。 那叫一个纵享丝滑呀!(反话)

操作步骤

  1. 确认目标槽位确实来自 PCH,不要只看长度。
  2. 确定要插的 PCH 槽是有问题的,什么问题看上面表格。
  3. 关闭BIOS必看项里对应AMD / Intel要关的选项。
  4. 进 Linux 看 IOMMU Group,Windows 用“按连接查看设备”看它们挂在哪个 Root Port 下(没Linux准确)。
  5. 如果这个槽的设备路径、分组、DMAR 表现和普通 CPU 槽明显不同,就是可用的。
  6. 如果只是正常显示、还混一堆板载设备,就没过不能用。

重点提醒这条路线最容易误解,不是说某些主板插南桥/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 的内存和中断路径。没插错的情况下一般不需要特别关注,属于小概率事件。出现了情况会比较复杂,一句两句也说不清。

操作步骤

  1. 找主板图纸或说明书,看标出的每条 PCIe 槽挂 CPU0、CPU1、PCH 还是 PCIe Switch。
  2. 怎么插上表里说了,不废话,这个方案是最简单即插即用的,不用像其他三个路线那样核实,除非你插错
  3. 关闭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 变量有关。

  1. 管理员身份运行 AMIBCP。
  2. 打开要修改的镜像。
  3. 查这些路径:Advanced、Socket Configuration、IIO Configuration、Intel(R) VT for Directed I/O、System Agent、PCIe Configuration。
  4. UI 找不到时,在 IFR 文本中搜索:ATS、Directed I/O、DMA Re映射、Interrupt Re映射、Posted Interrupt、PassThrough DMA、Coherency。
  5. 按照下表设置。

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 不能保存

  1. 用 UEFITool 提取对应 Setup 模块。
  2. 用 IFR Extractor 解析。
  3. 记录精确 VarStore、Offset、宽度和所有值。
  4. 不要默认 已启用 = 1、已禁用 = 0,以 IFR 为准。
  5. 只用匹配该主板和 BIOS 版本的 UEFI 变量工具。
  6. 先读原值,只写一个变量,再读回,冷启动重测。

有签名验证的品牌怎么刷进主板

去抖音/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。

流程:

  1. 打开 modvtddxework.bin。
  2. 定位 VtdDxe/IntelVTdDxe。
  3. 提取 FFS “原样”为 VtdDxe_original.ffs。
  4. 提取 PE32 主体 为 VtdDxeoriginal主体.efi。
  5. 移除整个 VtdDxe FFS file,不要只删压缩子 section。
  6. 保存为 modvtddxeremove.bin。
  7. 将修改好的BIOS刷入主板。
  8. 刷好先进 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 初始化代码不运行。

流程:

  1. 提取 VtdDxeoriginal主体.efi。
  2. 用 能识别 PE 的工具查看 入口点 AddressOfEntryPoint。
  3. 通过 PE section 表 把 入口点 RVA 转成 文件偏移,不要猜字符串 offset。
  4. x64 AMI DXE 驱动 常见入口 补丁:

31 C0 C3

对应:

xor eax, eax

ret

x64 UEFI 中 EFI_SUCCESS 是 RAX = 0。

  1. 若要覆盖固定窗口,前三字节保留 31 C0 C3,剩余填 90 (NOP),不要移动文件内容。
  2. 保存为 VtdDxeretsuccess_主体.efi。
  3. 在 UEFITool 中替换原 PE32 image 主体,不替换整个 卷,不随意改 GUID。
  4. 保存为 modvtddxeret.bin。
  5. 重新打开确认同一 FFS 仍存在、主体 有 31 C0 C3、固件树解析干净。
  6. 刷写后进 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 推荐顺序:

  1. 精确主板和 BIOS 的已知 rsdppa / dmarpa;
  2. 平台特定 ACPI reclaim/reserved ranges;
  3. EBDA 和 0xE0000-0xFFFFF legacy scan;
  4. 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 写入顺序:

  1. Read original RSDP.
  2. Read original XSDT.
  3. Find original DMAR pointer in XSDT.
  4. Read original DMAR.
  5. Build patched DMAR in device 临时缓冲区.
  6. Write patched DMAR to SHADOWDMARPA.
  7. Build cloned XSDT where old DMAR pointer is replaced by SHADOWDMARPA.
  8. Write cloned XSDT to SHADOWXSDTPA.
  9. 补丁 host RSDP XsdtAddress to SHADOWXSDTPA.
  10. Fix and verify RSDP extended 校验和.

redirect 方法只必须改原始 RSDP:

RSDP + 0x18 = SHADOWXSDTPA

RSDP + 0x20 = fixed extended

0

评论区