如何解决“Unable to locate valid DTB”报错
讲清 Directory Table Base 是什么、读取程序为什么必须找到它,再按顺序给出 DTB 报错的修复方法:内存映射、虚拟化、USB 稳定性、冷启动,最后才是干净重装 Windows。
简短回答
DTB 报错的意思是:读取程序已经通过你的卡读到了内存,却找不到 Windows 内核的 Directory Table Base(页目录基址)。按顺序排查:生成内存映射(MMAP),在游戏主机 BIOS 里关闭 VT-d/VT-x 或 SVM/IOMMU,验证 USB 链路稳定,然后两台机器都冷启动。
本页内容11
Directory Table Base 是什么?
Windows 机器上的每个进程都有自己私有的虚拟地址空间。要把虚拟地址转换成内存中的物理地址,需要一套多级页表,而这套页表的根是一个物理地址,每个进程各有一个。在 x86-64 上,CPU 把这个地址保存在 CR3 寄存器里,Windows 则把它记录为每个进程的 DirectoryTableBase,大家一般简称 DTB。
读取程序为什么需要 DTB?
你的卡通过 PCIe 读取的是物理内存,而不是虚拟内存,所以在它眼里,内存就是一整片平铺的字节,完全不知道哪部分属于哪个进程。连接之后,读取程序的第一项工作就是扫描这片字节,找出看起来像内核页表的结构。它从这个结构里恢复出 DTB,此后就能像 CPU 那样转换地址。这一步成功之前,后面的一切都无法运行。所以 DTB 失败会让整个流程停下,而且表现为初始化错误,而不是某个游戏特有的错误。
说明
DTB 报错是不是说明卡坏了?
不是,它说明的是扫描失败了。这条报错恰恰证明 USB 正常、PCIe 正常,而且读回了数据。只是扫描读到的字节不对、不完整,或者在到达卡之前就已经被重新排列过。这几种情况各有各的原因,而且是可以区分开的。
如何判断你属于哪种原因
动手改之前先搞清楚是哪种原因,因为真正能把它们区分开的是“验证方法”这一列。
| 你看到的现象 | 最可能的原因 | 验证方法 |
|---|---|---|
| 每次都失败,而且是一上来就失败,这台机器从来没正常工作过 | 没有内存映射,读取程序闯进了不该碰的内存区段 | 生成内存映射并加载。如果报错消失,就是这个原因 |
| 每次都失败,且游戏主机是 AMD 平台,或者链路经过 Thunderbolt | 在这些平台上,读取无效物理地址会让读取链路直接挂掉,所以扫描永远完成不了 | 这种情况下内存映射实际上是必需的。先加载映射测试,再测别的 |
| 每次都失败,且机器上的虚拟化没关 | Intel 的 VT-d/VT-x 或 AMD 的 SVM/IOMMU 正在重映射或限制卡能看到的内容 | 在游戏主机 BIOS 里关掉它们,冷启动,用同一个映射重试 |
| 时好时坏,找不出任何说得清的规律 | USB 链路不稳定——读取不完整,扫描自然什么也找不到 | 跑两次读取速度测试。两次数值相差悬殊,或者数值偏低,答案就有了 |
| 从刷写固件那天起就开始失败,之后再也没好过 | 固件镜像本身 | 本页其余各项都已排查过且没有问题。带着一字不差的报错原文去找固件提供方 |
| 昨天还好好的,今天就失败,你什么也没改 | 两台机器中任意一台更新了 Windows,或者卡一直处于假死状态 | 先把两台机器彻底冷启动,再重新检查副机(第二台电脑)上的驱动版本 |
第一次搭建时,两个原因同时存在很常见:没有映射,虚拟化也没关。两个都解决之前,别认定其中任何一项改动没有效果。
DTB 报错的分步修复
步骤从代价最小、可能性最大的修复开始。每做完一步就重试一次再往下走,因为同时改四处,你根本无法知道是哪一处起了作用。
- 在这台机器上、用当前固件生成内存映射,并让软件指向它。这是效果最好的单项修复,大多数第一次搭建的环境只需要这一步
- 进入游戏主机(注意是游戏主机)的 BIOS 关闭虚拟化:Intel 平台关 VT-d 和 VT-x,AMD 平台关 SVM Mode 和 IOMMU。保存退出,让它正常启动一次进入桌面
- 验证 USB 链路:使用数据线,接卡的数据口,插在副机后置的 USB 3 口上,中间不接集线器或扩展坞。连续跑两次,读取速度数值必须保持稳定
- 两台机器都彻底冷启动:完全关机,然后拔掉电源线或关掉电源背后的开关,等待十秒。先开游戏主机,再开副机
- 任何硬件变动之后都要重新生成内存映射,比如加了内存、挪了内存条、卡换了插槽或者更新了 BIOS。过期的映射描述的是一个已经不存在的布局
- 只有在上面每一步都测过且没问题、报错依旧时,才在游戏主机上干净重装 Windows。这是最后手段,绝不是第一步
该改哪些 BIOS 设置,在哪台电脑上改
要改的设置在游戏主机的 BIOS 里,不在副机上。Intel 平台上它们叫 VT-x 和 VT-d,有时放在 Intel Virtualization Technology 选项下面;AMD 平台上叫 SVM Mode 和 IOMMU。有些主板会把相关选项放在同一区域,比如 DMA 保护或内核 DMA 保护开关。一次只改一项,并记下改了什么,因为总有一天你会想把这台机器恢复原样。如果找不到某个设置,就拿它的准确名称去主板说明书里搜,别在菜单里瞎猜。
启动器背后的命令行参数
大多数产品会把这些参数封装进启动器,了解它们,你就知道软件里的某个勾选框实际在做什么。以下命令都只是查看和配置操作。
REM Probe which physical memory ranges are readable, to build a map from
pcileech.exe probe -device fpga
REM Let the tool derive the memory map itself
MemProcFS.exe -device fpga -memmap auto
REM Or pass a map file you generated on this machine
MemProcFS.exe -device fpga -memmap mmap.txt
REM Verbose output, so the failing line is visible instead of guessed at
MemProcFS.exe -device fpga -memmap mmap.txt -v -printf
REM Diagnostic only: supply a known DTB by hand. The value changes every boot
MemProcFS.exe -device fpga -memmap mmap.txt -dtb 0x1ad000警告
为什么手动填 DTB 不算修复
如果手动填入的 DTB 值让报错消失了,你就得到了一条有用的信息:问题出在扫描,而不是读取链路。但这仍然不是解决办法,因为这个值是 Windows 在开机时决定的,两台机器任何一台下次重启,它都会变。依赖这个值的环境因此每天都会出问题。用它来验证猜想,然后去修复导致扫描失败的内存映射或 BIOS 设置。
警告
为什么重装 Windows 应该放在最后
干净重装放在最后,是因为它要花好几个小时,一次改变很多变量,却解决不了任何一个常见原因。重装之后,缺的内存映射还是缺,BIOS 设置还是原样,不过关的线也照样不过关。只有在测过映射、BIOS、USB 链路并做过一次正确的冷启动之后,报错原文依然没有任何变化,才考虑重装。
DTB 报错常见问题
报错后面的数字有意义吗?
有,它标明了工具的哪一次尝试失败,从而缩小原因范围。报告这个错误时一定要带上它,而且要复制文本,不要发截图。
能不能拷贝同款主板玩家的内存映射?
不能。映射描述的是某一台机器在某个时间点的物理内存布局,包括它的内存条是怎么插的。别人的映射往好了说是没用,往坏了说,它就是你读取失败的原因。
副机上也要关闭虚拟化吗?
不用。这项设置只在被读取内存的那台机器上起作用,所以副机不用动,除非你自己的软件文档另有说明。
DTB 报错是被检测到的迹象吗?
不是。这是副机上读取程序的初始化失败,在一台根本没装游戏的机器上也会出现同样的报错。
重启游戏主机之前一直正常,重启后又失败,为什么?
这种规律说明内存映射过期了,或者你手动填的 DTB 是从上一次开机沿用下来的。重新生成映射,别再传入固定的 DTB。
资料来源
这份按顺序排列的修复清单来自实测:团队处理 DTB 工单时就是按这个顺序,从代价最小的一步做起。
- 01
- 02
- 03
- 04
继续阅读
仍然没有解决?在 Discord 提交工单
全部指南