OpenCore 文件树说明

介绍一下 OpenCore 有用的基本文件结构,以 0.5.7 版为例。

EFI
 ├── BOOT
 │   └── BOOTx64.efi
 ├── Resources
 └── OC
     ├── ACPI
     ├── Drivers
     │    ├── OpenCanopy.efi
     │    ├── ......
     │    └── OpenRuntime.efi
     ├── Kexts
     │    ├── Lilu.kext
     │    ├── ......
     │    └── WhateverGreen.kext
     ├── OpenCore.efi
     └── Tools
          ├── ChipTune.efi
          ├── ......
          └── VerifyMsrE2.efi

可以看到,和 Clover 相比 OpenCore 的文件目录更加精简,这也符合其轻装前行的设计理念;另外,和 Clover 最大的区别就是 OpenCore 是 acidanthera 团队开发的,这个团队主导开发了 Lilu.kext 及其附属插件等一系列黑苹果必须的驱动文件。目前 Lilu.kext/AppleALC.kext/WhateverGreen.kext/VirtualSMC.kext 等 acidanthera 团队的驱动已经不再测试新版 kext 的 Clover 兼容性;AptioMemoryFix.efi 这个关键内存修复驱动也已经停更,并改名分割为 FwRuntimeServices.efi(0.5.7 起改名 OpenRuntime.efi)。

根据外网信息,FwRuntimeServices.efi/OpenRuntime.efi 乎也能被 Clover 支持,要求 Clover 是较新的版本,并且可能需要搭配 OCQuirks.efi 使用。OcQuirks.efi 是用于 Clover 的替代 .efi 程序,可替代 AptioMemoryFix.efi 和所有版本的 OsxAptioFixDrv.efi。在 Clover 中使用 OcQuirks.efi 将使 Clover 支持 OpenCore 的 Quirks 功能。OcQuirks.efi 依赖 OpenRuntime.efi,必须一起搭配使用才能生效

 

必备的.efi文件

下面整理一个黑苹果设备必备的.efi驱动(仍以使用 UEFI 引导为例):

#基础
ApfsDriverLoader.efi
AptioMemoryFix.efi     #OpenCore使用OpenRuntime.efi和OpenCanopy.efi
DataHubDxe.efi
FSInject.efi           #OpenCore不需要
HFSPlus.efi            #或者VBoxHFS.efi
MemoryAllocation.efi   #如果要休眠请删除
PartitionDxe.efi
VirtualSmc.efi
EmuVariableUefi.efi    #OpenCore不需要
#可选
AudioDxe.efi

以上文件中,关于 EmuVariableUefi.efi 特别说明如下:

此驱动用于在没有原生 NVRAM 的主板上模拟 NVRAM;

白苹果都具备 NVRAM,其储存的设置信息一般用于支持 iMessage、FaceTime、Bootcamp 等功能,黑苹果使用 NVRAM 将使其更加接近白苹果

一般情况下,Z370 普遍都具备原生 NVRAM,所以可以不用这个驱动;但如果你的原生 NVRAM 有问题,也可以使用模拟;

该驱动主要用于 Clover 引导的黑苹果系统;

OpenCore 不需要这个驱动,已经将相关功能集成到了 OpenRuntime.efi 中(0.5.7 之前称为 FwRuntimeServices.efi)。

OpenCore 很多驱动都不需要,确实是一个非常优秀的引导工具。

 

内存修复驱动说明

黑苹果引导阶段卡在++++号,具体表现如下:

ERROR!!! Load prelinked kernel with status 0x0000000000000123456

这多半是内存修复补丁出了问题,请往下看。

为什么黑苹果需要使用内存修复驱动?因为目前已99%普及 UEFI 引导系统,为了解决AMI Aptio UEFI BIOS造成的古怪的内存映射,@Dmasar 写的第一版内存修复驱动 OsxAptioFixDrv.efi 应运而生,这个驱动让使用 UEFI 引导黑苹果成为可能。在当时,其它的引导方式是传统引导(Legacy),传统引导程序(Legacy Bootloader)具有良好的内存管理机制不需要这个驱动。

第二版 OsxAptioFix2Drv.efi 也是 @Dmasar 写的,增加了休眠支持,但有时需要添加 slide=xxx 的引导参数(也就是计算 slide 值)才能正常工作。

接下来,@vit9696 研究了第二版驱动,并在此基础之上添加了原生NVRAM支持,其成果就是第三版驱动 OsxAptioFix3Drv.efi,目前这个驱动仍然能很好的工作。

然后,@vit9696 写了新的内存驱动 AptioMemoryFix.efi,添加了很多功能,包括自动计算 slide 值。

最后,OsxAptioFix2Drv-free2000.efi 虽然有部分用户反馈只有使用这个能正常启动系统,但考虑到驱动作者自曝该驱动会永久性损坏你的主板,如果非必须强烈不建议使用,建议删除并替换为 AptioMemoryFix.efi。

综上所述,在安装黑苹果时,首先应该尝试使用 AptioMemoryFix.efi,英特尔300系主板使用这个文件所需设置如下:

  • Clover 取消勾选 内核和驱动补丁(Kernel and Kext Patches) → 内核电源(KernelPm)
  • BIOS 中 CFG Lock 已解锁,大部分主板选择 Disabled 即可,但部分主板可能就写了一个 CFG,这种情况可能要选 Enabled
  • BIOS 中 CSM disabled(关闭),这个是 Legacy 引导兼容,一般位于 Boot 菜单中
  • BIOS 中 EHCI/XHCI Hand-off enabled(开启),某些华硕主板可能没有这个选项,默认就是 XHCI Hand-off 开启,一般位于 Advanced 菜单中
  • BIOS 中 Above 4G Decoding enabled(开启),一般位于 Boot 菜单中
  • BIOS 中 VT-d disabled(关闭),一般位于 CPU 选项中

 

关于 slide 值

和其它操作系统一样,macOS 在启动时也会将自身内核加载到系统内存中,但普通的 DIY 主板 UEFI 模式下的内存管理机制和白苹果不同,导致系统引导失败。为了解决这个问题,第三方驱动开发者发布了一系列驱动。分别是:

  • OsxLowMemFixDrv.efi:早期 Clover 团队开发的,目前已不再维护
  • OsxAptioFixDrv.efi:不支持休眠和 NVRAM
  • OsxAptioFix2Drv.efi:不支持 NVRAM,可能需要计算slide
  • OsxAptioFix3Drv.efi:支持休眠和 NVRAM,需要计算slide
  • OsxAptioFix2Drv-free2000.efi:仅适用于 MSI 部分主板型号,其它品牌主板如非必须强烈不推荐,作者自曝会永久损坏;
  • AptioMemoryFix.efi:支持自动计算 slide 值;

一般情况下,如果能使用 AptioMemoryFix.efi 是最好的。如果遇到卡++++号的情况,则可能需要计算 slide 值并添加 slide=xxx 的启动参数,其原理如下:

  • 系统内核通常分配在 基址0x100000 + slide地址
  • slide地址 由 slide值 组成( 通过 slide=X 参数传递 或 隐藏生成),该值始终添加为 X * 0x200000,并很可能是添加特定于平台和特定于值的常量。
    • slide=0(或隐藏)时,内核实际分配地址为 0x100000(实际为内存第 1MB 开始,如果在 -x 中使用该地址,macOS 将无法启动)
    • slide=0x1~0x7F(指定1~127范围内参数传递或随机生成)时,内核实际分配地址范围是 0x100000 + 0x200000(内存第3MB)到 0x100000 + 0xFE00000(内存第255MB)
    • slide=0x80~0xFF(指定128~255参数传递或随机生成)在 Sandy Bridge 或 Ivy Bridge CPU上从 0x100000 + 0x20200000(内存第515MB)直到 0x100000 + 0x30000000(内存第769MB)
    • slide=0x80~0xFF(指定128~255参数传递或随机生成)在其它 CPU 上 0x100000 + 0x10000000(内存第257MB)直到 0x100000 + 0x1FE00000(内存第511MB)
  • 以上内容由 AptioMemoryFix.efi 原作者@vit9696说明,非计算机专业确实晦涩难懂。简单来说,就是指定分配一段内存空间给 macOS 系统内核,注意指定范围肯定不能超出你实际内存最大范围。

一般情况下,AptioMemoryFix.efi 可自动计算 slide 值,如果卡++++号,可尝试以下几个方法:

  • 方法一:同时放入 MemoryAllocation.efi 这个文件,这将空出内存中第一个 512MB 内存用于 macOS 系统内核,并添加启动参数 slide=0 或 slide=1,但这可能会导致无法正常休眠;
  • 方法二:把 AptioMemoryFix.efi 替换为 OsxAptioFixDrv.efi,此驱动无需计算 slide 值,但同时不支持休眠和原生 NVRAM;
  • 方法三:如果休眠和 NVRAM 你都要,在 AptioMemoryFix.efi 无法自动计算的情况下,参阅@黑苹果小兵的计算教程,在 BIOS 更新后,可能需要重新计算。