AppleVTD_Simplified_Chinese - Fu-Yuxuan-hub/Generic-EFI-for-H610-B660-Z690-B760-Z790 GitHub Wiki
本文章旨在讲述 AppleVTD 的功能,以及如何在 Hackintosh 下正确启用它。
设备 | |
---|---|
主板 | 支持 Intel VT-d 的主板 |
CPU | 兼容 Intel VT-d 的 CPU |
macOS 版本 | macOS Monterey 及更新版本 |
AppleVTD 和 DriverKit
AppleVTD 即 Apple 虚拟化,主要功能由 Intel VT-d 提供。它可以为 Apple 原生硬件使用 DriverKit 驱动提供 DMA 重映射策略。
- 从 macOS Monterey 开始,雷电控制器需要启用此功能。
- 从 macOS Ventura 开始,网络适配器可以使用此功能。
DriverKit 构建的驱动程序在 「user space」 中运行,而不是作为「内核扩展」运行,这提高了系统稳定性和安全性。
- 但是,他真的提高了系统稳定性吗?事实上并没有,DriverKit 的大部分驱动都 极其 不稳定。而且 DriverKit 运行在用户层,理论上并不会导致 Kernel Panic,但是他一旦崩溃,便会连带 DriverKit 框架崩溃,而且崩溃后的崩溃日志并不清晰,难以排查问题。
DriverKit 的另一个目的,为 Apple Silicon 铺路。比如 Apollo 雷电声卡驱动 和 Blackmagic Design 的驱动 在 Apple Silicon 的 Mac 上都为 DriverKit 驱动,而在搭载 Intel 的 Mac 上依旧是内核扩展。
- 挂载 EFI 分区
- 从 EFI/OC 目录打开 config.plist
- 在 Kernel - Quirks 选项中
- DisableIoMapper:为了启用 AppleVTD,请禁用此选项
- DisableIoMapperMapping(仅适用于 macOS 13.3 及更新版本):当您满足以下任意条件时,请启用此选项
- 搭载 16G 及以上内存时
- 核显已启用
- 您的 DMAR 表 中包含一个或多个 Reserved Memory Region 时。关于 DMAR 表 和 Reserved Memory Region 的有关详细,详见修复 DMAR 表
- 从 config.plist 的 boot-args 中删除
dart=0
- 保存 config.plist
此时,应该仅有部分的电脑能够正常的启用 AppleVTD。您应该继续阅读此文章以正确的启用 AppleVTD。
在修复 DMAR 表这部分中,我们需要分两种情况去讨论
- 使用 Intel 12代处理器(600系列主板)及更新配置的电脑,且未启用核显
- 使用 Intel 11代处理器(500系列主板)及更早配置的电脑,使用 Intel 12代处理器(600系列主板)及更新配置的电脑,且启用核显
如果您是第一种,那恭喜您,您的 AppleVTD 应该已经正确启用;如果您是第二种,请继续阅读此文章以修复您的 DMAR 表。
第一步是提取本机 DMAR 表。 您可以直接使用 MaciASL 提取 DMAR 表。
- 打开 MaciASL
- 点击 文件 - 从 ACPI 获取 选项打开 DMAR 表
获得 DMAR 表后,下一步是删除 Reserved Memory Regions。
- 找到带有 Reserved Memory Region 的部分并删除它们。
注意:Reserved Memory Region 下方的两行空白行也需要一并删除
2.点击左上角 文件 - 另存为 在文件格式选项中选择 ACPI Machine Language Binary,并将其重命名为 SSDT-DMAR
下一步是启用修改后的的 SSDT-DMAR。
- 挂载 EFI 分区
- 将 SSDT-DMAR.aml 复制到 EFI/OC/ACPI 目录。 您还需要在 config.plist 的 ACPI>Add 中添加相同的 ACPI 条目
- 保存您的 config.plist
下一步是删除本机 DMAR 表以防止加载,而是使用修复后 DMAR 表的版本。
- 使用任意编辑器打开 EFI/OC 目录下的 config.plist。
- 将 DMAR 添加到 config.plist 的 ACPI>Delete 部分下的 TableSignature 中,并启用此项。
- 保存你的config.plist
重新启动后,最后一步是检查和验证 AppleVTD 功能,是否在 macOS 下加载。
一:下载并打开 IOReg。
验证 AppleVTD。 AppleVTD 位于 AppleACPIPlatformExpert 节点下。
注意:如果 AppleACPIPlatformExpert 节点下没有 AppleVTD,您需要添加 SSDT-DMAC
如果 AppleVTD 仍然无法工作,通过 SSDT-DMAC 添加 DMAC 设备可能会解决此问题,macOS 可以通过它以访问所有内存区域,这可以使 AppleVTD 工作。 然而,AppleVTD 在大多数情况下无需注入 DMAC 即可正常工作,因此它并不常见。
DMAC 适用于以下SMBIOS:
iMac: 5,1 to 20,x
iMacPro1,1
MacBook: 1,1 to 9,1
MacBookAir: 1,1 to 9,1
MacBookPro: 1,1 to 16,1
MacMini: 1,1 to 8,1
MacPro: 1,1 to 7,1
Xserve: 1,3 to 3,1;
SSDT-DMAC:
//Add DMAC
DefinitionBlock ("", "SSDT", 2, "OCLT", "DMAC", 0)
{
External(_SB.PCI0.LPCB, DeviceObj)
Scope (_SB.PCI0.LPCB)
{
Device (DMAC)
{
Name (_HID, EisaId ("PNP0200"))
Name (_CRS, ResourceTemplate ()
{
IO (Decode16,
0x0000, // Range Minimum
0x0000, // Range Maximum
0x01, // Alignment
0x20, // Length
)
IO (Decode16,
0x0081, // Range Minimum
0x0081, // Range Maximum
0x01, // Alignment
0x11, // Length
)
IO (Decode16,
0x0093, // Range Minimum
0x0093, // Range Maximum
0x01, // Alignment
0x0D, // Length
)
IO (Decode16,
0x00C0, // Range Minimum
0x00C0, // Range Maximum
0x01, // Alignment
0x20, // Length
)
DMA (Compatibility, NotBusMaster, Transfer8_16, )
{4}
})
Method (_STA, 0, NotSerialized)
{
If (_OSI ("Darwin"))
{
Return (0x0F)
}
Else
{
Return (Zero)
}
}
}
}
}
注意:
- 若您在 DSDT 中,搜索
PNP0200
或DMAC
时已存在该设备,请勿再次添加。如果缺少,请添加此项(导出为 .aml) - 使用此补丁时,请确保 SSDT 中使用的 LPC Bus(LPC 或 LPCB)的ACPI路径与系统 DSDT 中使用的一致。
- 将 SSDT-DMAC.aml 添加到您的 EFI 的 ACPI 文件夹和 config.plist 中
- 重新启动
- 打开 IOReg 并搜索 DMAC
- 如果添加成功,如下图所示。 数组 IODeviceMemory 应包含更多条目和数据:
© 杆杆只爱学习, Released under the MIT License.
——May 27, 2023