介绍 |
Windows 系统的 DSDT 表根桥定义(ACPI PNP0A08 或 PNP0A03)通常被限制在预留的 32 位空间(低于 4GB),预算足够大以承载笔记本电脑的 PCIe 设备。然后在系统固件中设置并锁定水印 TOLUD 值。Windows 操作系统尊重根桥定义,并将在其中分配 PCIe 设备。当使用 ‘pci=noCRS’ 参数启动时,macOS 会像 Linux 一样忽略根桥约束。这些操作系统都不需要DSDT 覆盖,并且可以在巨大的 64 位 PCIe 地址空间中自由分配。
改装 eGPU 时,Windows 设备管理器中的 eGPU可能会出现错误 12(此设备找不到足够的可用资源),使其无法运行。这可能表明没有足够的 32 位寻址空间可用于托管 eGPU。eGPU 需要相对较大的 PCIe 配置空间来分配。通过将 RAM 减少到 2GB 来减少 TOLUD 提供了一种有点不切实际的解决方法。相反,最终的解决方案如下。
这三步解决方案移除了 Window 的 32 位 PCIe 分配约束,以解决 eGPU 错误 12:
步骤 1.使用 36 位根桥创建 dsdt-modified.aml DSDT 文件
步骤 2.加载您的 dsdt-modified.aml 作为注册表覆盖或内存替换
步骤 3.使用设备管理器中的“大内存”区域确认成功
macOS 用户:请参阅Mikeal 的帖子,该帖子涵盖了标题为Windows 10 – Clover DSDT 内存覆盖[仅限 Macbooks 上的 UEFI Windows]的这些步骤。
步骤 1. 使用 36 位根桥创建 dsdt-modified.aml DSDT 文件 |
一世。下载并安装所需工具:
- Windows 二进制工具(WBT – 2016 年 12 月)解压缩到c:\dsdt目录。[较新的 WBT有解析错误]
- Windows Driver Kit (WDK),其中包含 Windows ASL 编译器 (asl.exe)
- 如果下面的 asl 或 iasl 编译失败,带有 Search->Goto (line) 菜单的Notepad++ 文本编辑器用于快速行编辑
ii. 将 WDK 的 ASL 编译器复制到 c:\dsdt 目录中。通过打开命令提示符(以管理员身份运行)然后复制并粘贴以下命令来执行此操作。
mkdir c:\dsdt c: & cd \dsdt set 64bit_OS_asl="C:\Program Files (x86)\Windows Kits\10\Tools\x64\ACPIVerify\asl.exe" set 32bit_OS_asl="C:\Program Files (x86)\Windows Kits\10\Tools\x86\ACPIVerify\asl.exe" copy /y %32bit_OS_asl% c:\dsdt > nul & copy /y %64bit_OS_asl% c:\dsdt > nul if not exist c:\dsdt\asl.exe echo ERROR: Failed to copy asl.exe to c:\dsdt
iii. 在命令提示符下使用这些命令将 ACPI 表转储到磁盘文件(dsdt.asl和 dsdt.dat)(以管理员身份运行)。创建的dsdt.asl在此处复制为dsdt-modified.asl,稍后用于进行我们所需的修改。
c: & cd \dsdt acpidump -b -z asl /u dsdt.dat copy dsdt.asl dsdt-modified.asl
iv. 您现在可以选择Intel 方法或Microsoft 方法(分别使用蓝色dsdt-modified.dsl或洋红色dsdt-modified.asl工作文件)来生成 dsdt-modified.aml 文件,甚至尝试这两种方法以最大限度地提高成功率。考虑:
– 对于 Lenovo 以外的系统,请使用Intel 方法,因为它们的 DSDT 通常具有 Intel 创建签名。
– 已知联想 Thinkpad X220、T420、W530、T540P 和可能的其他第 2-4 代 i-core 联想 Thinkpad 系统需要Microsoft 方法。Intel 方法在 Windows 启动时会导致“ACPI BIOS 错误”。
选项 1:使用 Intel 方法
一世。将此 >>refs.txt文件<< 保存到您的 c:\dsdt 文件夹。这有什么用途?来自tonymacx86:iasl 反汇编程序将尝试猜测参数的数量[对于未在任何文件中定义的未解析符号],但通常猜测很差。您可以通过在 refs.txt 文本文件中提供外部声明来更正它。它包含一些常见(但不那么常见)的缺失符号。. .
ii. 在命令提示符 (admin) 中,将 dsdt.dat反编译为 dsdt.dsl。这里使用 refs.txt 文件。然后将dsdt.dsl复制为dsdt-modified.dsl,我们将在其上进行所需的更改。
c: & cd \dsdt iasl -da -dl -fe refs.txt dsdt.dat copy dsdt.dsl dsdt-modified.dsl
iii. 使用 Notepad++,打开生成的c:\dsdt\ dsdt-modified.dsl 文件并搜索ResourceProducer。在它下面将是一系列“DWordMemory”资源条目。在该区域的最后一个 DWordMemory 条目下,通常在 _CRS 方法上方,添加一个“QWordMemory”(64 位)条目,如下所示。选择的范围在 36 位范围内 (< 64GB),以保持与支持 PAE 的 32 位 Windows 的兼容性。选择 48GB 以上的位置来缓解配备 32GB 的系统的问题。这里我们使用 48.5GB 到 56.25GB 之间。一旦系统开始配备 64GB 的 RAM,就需要对其进行修改以使用 64 位地址。
DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, // Granularity 0x000A0000, // Range Minimum 0x000BFFFF, // Range Maximum 0x00000000, // Translation Offset 0x00020000, // Length ,, , AddressRangeMemory, TypeStatic) // - ADD THIS SECTION --------------------------------------------------------------------------- QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x0000000000000000, // Granularity 0x0000000C20000000, // Range Minimum, set it to 48.5GB 0x0000000E0FFFFFFF, // Range Maximum, set it to 56.25GB 0x0000000000000000, // Translation Offset 0x00000001F0000000, // Length calculated by Range Max - Range Min. ,, , AddressRangeMemory, TypeStatic) // ---------------------------------------------------------------------------------------------- }) Method (_CRS, 0, Serialized) // _CRS: Current Resource Settings
iv. 创建一个dsdt-modified.aml文件 。’-ve’ 禁用警告消息。
c: & cd \dsdt iasl -ve dsdt-modified.dsl
由于编译器非常严格,这不太可能第一次成功。报告的错误需要使用 Notepad++ 在它们发生的行上进行查看。从 dsdt-modified.asl 中的dsdt -modified.dsl错误行中搜索唯一的错误关键字(它可能看起来有点不同),然后将上面/下面的行交换到dsdt-modified.dsl文件中并编译。这足以让戴尔 XPS 9350、戴尔 E6540、2016 15 英寸Macbook Pro DSDT 覆盖全部完美完成。
如果卡住,请查看eGPU.io为各种系统提供的公共预编译 DSDT 存储库。如果您的系统存在一个,则可以将其与Winmerge 一起下载,以将文件更改合并到您的dsdt-modified.dsl工作文件中。还有其他修复,如[Guide] Patching LAPTOP DSDT/SSDTs (tonymacx86)中所述。还可以考虑在以 DSDT 为中心的tonymacx86.com DSDT 论坛上寻求指导。然后尝试再次编译您的 DSDT。
诉 继续第 2 步以加载您的 dsdt-modified.aml 文件。
选项 2:使用 Microsoft 方法
一世。使用 Notepad++,在c:\dsdt\dsdt-modified.asl文件中找到工作区,如下面的屏幕截图所示。在该区域中,进行以下两个编辑。这些在这些屏幕截图中都有注释。
编辑 1:在程序员模式下使用 Windows 的 calc将十六进制 2E(十进制 46)添加到“缓冲区(值)”行。例子:
- “缓冲区(0x1C0)”变为“缓冲区(0x1EE)”
- “缓冲区(0x1D4)”变为“缓冲区(0x202)”
编辑2:用以下46个十六进制值替换十六进制表末尾的“0x79,0x00”,也以“0x79,0x00”结尾。这添加了Intel 方法中显示的相同 36 位QWordMemory资源条目,但作为十六进制表。
[复制粘贴此表]
0x8a, 0x2b, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x79, 0x00
对于其他系统[点击图片放大]
ii. 在命令提示符(管理员)处,编译dsdt-modified.asl文件以生成 dsdt-modified.aml 文件:
c: & cd \dsdt asl /Fo=dsdt-modified.aml dsdt-modified.asl
由于错误行需要进一步编辑您的dsdt-modified.asl文件,这几乎肯定会在您的第一次编译尝试中无法生成 dsdt-modified.aml,如下面的(更多示例here),然后是另一个编译尝试. 带有许多警告的成功编译是可以的。
– ATMC () – 错误:ATMC 不是一种方法-> 将 ATMC 与 \_SB_.PCI0.LPC_.EC__.ATMC() 交换
–零 – 错误:意外的 ASL 术语类型-> 在上面的行中添加“零”作为括号内的参数它,例如:GLIS(零)
– Arg0 – 错误:意外的 ASL 术语类型-> 将“Argo0”作为括号参数添加到它上面的行,例如:GDCK (Arg0)
iii. 使用 Windows 资源管理器打开 c:\dsdt。将您创建的 dsdt-modified.aml 文件的大小与内存转储的 dsdt.dat 进行比较。它们的大小应在 +/- 10% 范围内。如果没有,请重复上述过程以确保没有出错。
HP Elitebook 8440P 看到生成的 dsdt-modified.aml 仅为转储 dsdt.dat 内存大小的 15%。在那里,这个过程根本行不通。对于这种情况,请改用Intel 方法。
四。继续第 2 步以加载您的 dsdt-modified.aml 文件。
步骤 2. 加载您的 dsdt-modified.aml 作为注册表覆盖或内存替换 |
选项 1:加载您的 dsdt-modified.aml 作为注册表覆盖并启用 Windows 测试签名模式
在这里,我们将您的 dsdt-modified.aml 加载为 Windows 注册表DSDT 覆盖。请注意,以这种方式加载的无效 dsdt-modified.aml 可能会导致启动时出现 BSOD。此外,Windows测试签名模式可能会影响应用程序的兼容性。使用选项 2 可以避免这两个问题:避免测试签名模式 – 将 dsdt-modified.aml 作为内存中的 DSDT 替换加载。
一世。在命令提示符 ( admin ) 键入以下内容。必须按照步骤 1 (i) 和 (ii)安装包含 asl.exe 的 WDK 才能正常工作。
c: & cd \dsdt asl /loadtable dsdt-modified.aml
ii. 启用 TESTSIGNING 模式以应用注册表覆盖。在命令提示符(管理员)输入:
bcdedit -set TESTSIGNING ON
如果执行此操作时出现如下错误,请在 BIOS 中禁用 SECURE BOOT。
设置元素数据时出错
该值受安全启动策略保护,无法修改或删除
iii. 重新启动系统并在步骤 3中检查“大内存” 。
选项 2:无效测试签名模式 –加载您的 dsdt-modified.aml 作为内存中的 DSDT 替换
在这里,我们通过以下步骤在 Windows 加载之前将 DSDT 作为内存替换加载,从而完全避免了有问题的注册表覆盖和测试签名模式:
一世。禁用以前的注册表DSDT 覆盖和测试签名模式。
bcdedit -set TESTSIGNING OFF
ii. 通过查看设备管理器->磁盘驱动器->[双击启动驱动器]->卷->填充->分区样式来检查您使用的是MBR 还是 UEFI Windows 安装。如果它显示“MBR”,则它是 MBR 安装。如果它显示“GPT”,那么它是 UEFI 安装。这将决定应用哪个下一步。
iii. [ MBR 模式]在下一篇文章中通过 nando 的 DIY eGPU 设置 1.35加载 dsdt-modified.aml 作为内存替换。
iv. [ UEFI 模式] 通过 Clover 引导加载程序将 dsdt-modified.aml 作为内存替换加载,如下所示:
2019 年 2 月更新 >>建议 Mac 用户使用@goalque的自动 eGPU EFI而不是 Clover 来加载您生成的DSDT 覆盖,以避免下面在大警告中指出的问题。
nando4 的重大警告>> @Goalque已正确识别出 Clover 在固件卷中加载了一个 DSDT 表,因此可以像该用户发现的那样将 Macbook 变砖。如果您继续使用 Clover 进行DSDT 覆盖,您将自行承担风险!!对于风险厌恶的用户,建议简单地执行DSDT 注册表覆盖并坚持使用 Windows 的测试签名模式,直到找到并提供其他解决方案。
– 将您的 EFI 卷挂载为 s: 驱动器并备份您现有的 \EFI\BOOT\BOOTX64.efi 文件。在命令提示符(管理员)键入:
mountvol s: /s copy s:\EFI\BOOT\BOOTX64.efi s:\EFI\BOOT\BOOTX64.win
– 下载Clover ISO文件并使用7-zip(仅限 64 位)解压 clover.tar.lzma->clover.tar->clover.pkg->\EFI 文件夹到 s:\EFI 来安装它。请务必使用 7-zip 界面解压到 s: 驱动器,因为 Windows 资源管理器拒绝允许查看 s: EFI 卷。
– 将 dsdt-modified.aml 文件作为 dsdt.aml 复制到 s:\EFI\CLOVER\ACPI\Windows,Clover 用于预加载它的目录。如果您的源 dsdt-modified.aml 文件不在 c:\dsdt 中,则使用此解决方法复制并粘贴它。使用资源管理器找到您的 dsdt-modified.aml 文件,单击鼠标右键,重命名为 dsdt.aml,单击鼠标右键,复制。然后按CTRL+ALT+DEL,任务管理器,文件->新建任务。浏览 s:\EFI\CLOVER\ACPI\WINDOWS 目录并将其粘贴到那里。
否则在命令提示符(管理员)输入:
copy c:\dsdt\dsdt-modified.aml s:\EFI\CLOVER\ACPI\WINDOWS\dsdt.aml
– 通过 Clover -> Windows EFI 菜单重新启动,然后继续执行步骤 3以确认它工作正常。
步骤 3. 使用设备管理器中的“大内存”区域确认成功 |
检查您现在在设备管理器中有一个新的大内存条目,如下所示,以确认您的 dsdt-modified.aml 是成功的:
成功的故事 |
Mikeal – 2016 15″ Macbook Pro + Razer Core + GTX1070。成功!将 eGPU 分配到 36 位空间
。itsage – 2016 13″ Macbook Pro + AKiTiO Thunder3 + GTX980Ti。成功!将 eGPU 分配到 36 位空间。
batist – 2013 15″ Lenovo T540 + EXP GDC + GTX680。成功!将 eGPU 分配到 36 位空间
。nando4 – HP ZBook 17 G2 + AKiTiO Thunder2 + GTX970。成功!将 eGPU 分配到 36 位空间。
常问问题 |
1. 我仍然有一个错误 12 存在“大内存”区域。我该如何解决?
如果 Win10 没有自动将你的 eGPU 分配到 36 位空间并且仍然看到错误 12,那么还有一些进一步的选择:一世。[MBR/Legacy 启动 – 不是 UEFI]在使用 nando 的 DIY eGPU Setup 1.35软件启动 Windows 之前,强制将 eGPU 分配到 36 位 PCI 空间:
- 在 Windows 启动菜单中,选择Setup 1.35
- 引导设置 1.35 -> 基于菜单
- 选择 PCI compaction->Endpoint=56.25GB (36-bit)
- 选择 PCI 压缩-> 运行压缩。当提示输入示波器时,选择 eGPU。
- 选择 Chainloader->Test Run
- 在 Windows 启动菜单中,选择 Windows。
然后,您的结果将如上面第 3 步所示,但您将拥有 eGPU 而不是(示例)HD8790M dGPU 分配到 36 位 PCI 空间。
ii. 使用bcdedit forcedisable选项覆盖高级 PCI Express 功能并使用Microsoft 解释的旧版 PCI Express 行为。madjester在此处执行DSDT 覆盖后在 2015 13″ MBP上确认了此已修复错误 12 (谢谢!)
bcdedit.exe -set PCIEXPRESS FORCEDISABLE
iii. 重新即插即用设备。进入设备管理器 -> 显卡,删除 eGPU。还进入设备管理器 -> 系统设备并删除 PCI Express 根端口 x 条目。
Window 现在应该足够聪明,可以在意识到没有足够的 32 位空间来托管它时将 eGPU 重新分配到 36 位空间。
可以更进一步,删除您的 eGPU NVidia/ATiAMD 驱动程序,重新启动系统并重新加载它。这也可能有所帮助。
iv. 从这里:
- 删除设备管理器中的所有设备 –使用大内存空间的资源(所有带有蓝色图标的设备 – 而不是 USB 图标!)
- 热插拔 eGPU(在几分钟内 eGPU 将可用而不会出现错误 12,其他设备也将恢复并重新开始工作)
- 一切都应该工作
2. 如何禁用注册表DSDT 覆盖?
最简单的方法是禁用 TESTSIGNING。如果您的系统在DSDT 覆盖到位的情况下无法启动,则以安全模式启动并禁用 TEST SIGNING。
bcdedit -set TESTSIGNING OFF
从注册表中删除DSDT 覆盖:
c: & cd\dsdt asl /loadtable -d dsdt-modified.aml
.. 或在注册表中删除此DSDT 键。Windows 将在重新启动时从您的系统启动 ACPI DSDT 表中创建一个新的:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX\services\ACPI\Parameters\DSDT * where XXX are 001, 002, 003 & so on. and HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ACPI\Parameters\DSDT