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

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 上依旧是内核扩展。

启用 AppleVTD

一:在 BIOS/UEFI 中启用 VT-d

二:配置 OpenCore 中的 Quirks

  1. 挂载 EFI 分区
  2. 从 EFI/OC 目录打开 config.plist
  3. 在 Kernel - Quirks 选项中
    • DisableIoMapper:为了启用 AppleVTD,请禁用此选项
    • DisableIoMapperMapping(仅适用于 macOS 13.3 及更新版本):当您满足以下任意条件时,请启用此选项
      • 搭载 16G 及以上内存时
      • 核显已启用
      • 您的 DMAR 表 中包含一个或多个 Reserved Memory Region 时。关于 DMAR 表 和 Reserved Memory Region 的有关详细,详见修复 DMAR 表 Quirks
  4. 从 config.plist 的 boot-args 中删除 dart=0
  5. 保存 config.plist

三:重新启动

此时,应该仅有部分的电脑能够正常的启用 AppleVTD。您应该继续阅读此文章以正确的启用 AppleVTD。

修复 DMAR 表

在修复 DMAR 表这部分中,我们需要分两种情况去讨论

  • 使用 Intel 12代处理器(600系列主板)及更新配置的电脑,且未启用核显
  • 使用 Intel 11代处理器(500系列主板)及更早配置的电脑,使用 Intel 12代处理器(600系列主板)及更新配置的电脑,且启用核显

如果您是第一种,那恭喜您,您的 AppleVTD 应该已经正确启用;如果您是第二种,请继续阅读此文章以修复您的 DMAR 表。

一:提取本机 DMAR 表

第一步是提取本机 DMAR 表。 您可以直接使用 MaciASL 提取 DMAR 表。

  1. 打开 MaciASL
  2. 点击 文件 - 从 ACPI 获取 选项打开 DMAR 表 ACPI_DMAR

二:删除 Reserved Memory Regions

获得 DMAR 表后,下一步是删除 Reserved Memory Regions。

  1. 找到带有 Reserved Memory Region 的部分并删除它们。 注意:Reserved Memory Region 下方的两行空白行也需要一并删除 Remove_Reserved_Memory_Regions 2.点击左上角 文件 - 另存为 在文件格式选项中选择 ACPI Machine Language Binary,并将其重命名为 SSDT-DMAR

三:启用 SSDT

下一步是启用修改后的的 SSDT-DMAR

  1. 挂载 EFI 分区
  2. 将 SSDT-DMAR.aml 复制到 EFI/OC/ACPI 目录。 您还需要在 config.plist 的 ACPI>Add 中添加相同的 ACPI 条目 SSDT-DMAR
  3. 保存您的 config.plist

四:删除原来的 DMAR 表

下一步是删除本机 DMAR 表以防止加载,而是使用修复后 DMAR 表的版本。

  1. 使用任意编辑器打开 EFI/OC 目录下的 config.plist。
  2. 将 DMAR 添加到 config.plist 的 ACPI>Delete 部分下的 TableSignature 中,并启用此项。 Drop_DMAR
  3. 保存你的config.plist

五:重新启动

验证 AppleVTD

重新启动后,最后一步是检查和验证 AppleVTD 功能,是否在 macOS 下加载。

一:下载并打开 IOReg

验证 AppleVTD。 AppleVTD 位于 AppleACPIPlatformExpert 节点下。

注意:如果 AppleACPIPlatformExpert 节点下没有 AppleVTD,您需要添加 SSDT-DMAC

IOReg_AppleVTD

DMAC(Direct Memory Access Controller)

如果 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

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 中,搜索PNP0200DMAC时已存在该设备,请勿再次添加。如果缺少,请添加此项(导出为 .aml)
  • 使用此补丁时,请确保 SSDT 中使用的 LPC Bus(LPC 或 LPCB)的ACPI路径与系统 DSDT 中使用的一致。

二:验证 DMAC 设备

  1. 将 SSDT-DMAC.aml 添加到您的 EFI 的 ACPI 文件夹和 config.plist 中
  2. 重新启动
  3. 打开 IOReg 并搜索 DMAC
  4. 如果添加成功,如下图所示。 数组 IODeviceMemory 应包含更多条目和数据: IOReg_DMAC

© 杆杆只爱学习, Released under the MIT License.

——May 27, 2023

⚠️ **GitHub.com Fallback** ⚠️