使用OcQuirks替换AptioMemoryFix,解决卡+号内存问题

2020-05-22 / 6.43k / 教程 / 2.56k / 8分钟

概述

本文主要针对 Clover 引导黑苹果,OpenCore 用户可以不用看。

和其它所有操作系统一样,macOS 在启动时也会把自身内核加载到内存中,相比 Windows,macOS 内存管理机制有些许不同,且需要更大的内存区块划分。但在黑苹果中,因 AMI BIOS 会造成一些奇怪的内存映射,导致出现卡在一排 ++++ 号,或者出现以下提示:

ERROR!!! Load prelinked kernel with status 0x0000000000000123456

这个问题在使用 Legacy 引导 Mac OS X 的时代是不存在的,这是随着更换为 UEFI 引导方式带来的问题。为了解决这个问题,我们需要使用一些特殊的 efi 驱动文件使内存工作正常,为 macOS 内核预留足够的内存空间。

 

常见的内存修复驱动

如果你看过 efi文件说明以及内存修复驱动部分的内容,那你已经明白现状;如果没有,请记住以下知识点:目前关于解决 UEFI 引导内存问题的 efi 驱动文件,主要有以下几种:

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

综上所述,使用 Clover EFI Bootloader 引导的情况下,AptioMemoryFix.efi 是最优解。对发展历史感兴趣的同学可以去看《efi文件说明》这一篇文章。

 

但是,这里要说但是了。

 

acidanthera 团队已经停止开发 AptioMemoryFix.efi 了,随后将 AptioMemoryFix、 AptioInputFix、CleanNvram 合并发布为 AptioFixPkg,但不久后又宣布停止开发 AptioFixPkg 。因为 acidanthera 团队主导开发了 Lilu.kext / WhateverGreen.kext / AppleALC.kext / VirtualSMC.kext 等一系列目前黑苹果必须使用的驱动,他们早已宣布自家驱动不再测试 Clover 兼容性,而他们现在接手开发的新引导程序 OpenCore 又处于测试阶段,每一版本变化都非常大。因此,停止开发内存修复程序这个举动让很多还在长期使用 Clover 引导的用户感到担忧。

好在,Clover 团队硬生生吃下了 OpenCore 的一部分组件,让新版本的 Clover 支持了一部分 OpenCore 才有的功能特性,例如 Quirks。本文接下来要介绍的,就是使用 OpenCore 的组件:OpenRuntime.efi 和 OcQuirks.efi 替换 AptioMemoryFix.efi 以及 所有版本的 OsxAptioFixDrv.efi。

 

使用 OcQuirks.efi 和 OpenRuntime.efi 替换其它内存修复程序

OcQuirks.efi 和 OpenRuntime.efi 都是 OpenCore 的组件,在 0.5.7 版本以前,OpenRuntime.efi 名字叫 FwRuntimeServices.efi,二者必须是对应版本才能正确工作

超级会员免费 永久超级会员免费

已有47人查看

  • 确认你的 Clover EFI Bootloader 版本在 r5107 及以上,这是 macOS 10.15.4 要求的最低版本(更低版本未测试);
  • 下载上面的文件;
  • 使用 Clover Configurator 或者 Clover.app 挂载 EFI 分区;
  • 把压缩包中的所有文件解压到 /EFI/Clover/Drivers 文件夹中,并删除 AptioMemoryFix.efi 或 OsxAptioFixDrv.efi(所有版本都删除);
  • 重启计算机生效;
  • 如果想避免更换后导致无法进入系统的可能性,可以先把文件拷贝到刻录好的 macOS 引导 U 盘中,在 BIOS 中指定 U 盘引导,可以正常使用后再替换正式文件

 

关于 OcQuirks.efi 可选设置

和 OcQuirks.efi 一起出现的,除了 OpenRuntime.efi(依赖)外,还有 OcQuirks.plist,这是一个配置文件,用于储存 OcQuirks.efi 的设置。文件可以使用 Plistedit Pro.appProperTree.app 等 plist 专用编辑器打开编辑,也可以使用 Visual Studio Code 或 Sublime Text 等代码编辑器打开,推荐使用前者。

默认情况下,该配置文件的默认设置基于 AptioMemoryFix.efi,理论上你使用 AptioMemoryFix.efi 正常的话,使用这个默认设置也是正常的。该程序在设计时考虑了英特尔 100系、200系以及 Z370 的系统,足以应付大部分情况大部分机型。其它主板例如 Z390,可能需要打开 DevirtualiseMmio 和 ProtectUefiServices;100系和200系主板可能需要开启 EnableWriteUnprotector;同时假定所有 slide 值都是有效的(不添加 slide=X),关于 slide 值看这里

OcQuirks.efi 是 OpenCore 的一部分,具体说明请参考 OpenCore 配置说明文档,下面是默认配置。

参数默认值说明翻译
AvoidRuntimeDefragTrue修复了许多固件上的UEFI运行时服务支持。
DevirtualiseMmioFalse减少内存映射中被盗的内存占用,与某些系统不兼容
DisableSingleUserFalse忽略单用户模式参数的安全选项。
DisableVariableWriteFalse一种安全选项,用于保护macOS NVRAM写入访问。
DiscardHibernateMapFalse用于解决有问题的内存映射的旧参数。从S4睡眠唤醒后,保留运行时内存的大小和位置。
EnableSafeModeSlideTrue修补引导加载程序以在安全模式下启用KASLR。
EnableWriteUnprotectorFalse允许对UEFI运行时服务代码进行写访问。如果可能,请使用RebuildAppleMemoryMap。
ForceExitBootServicesTrue确保即使使用了过期的MemoryMap密钥,对ExitBootServices的调用也会成功。
MmioWhitelistArray设计为用plist dict值填充,描述使用DevirtualiseMmio quirk时对特定固件功能至关重要的地址。
ProtectMemoryRegionsFalse保护内存区域免受错误访问。仅非常旧的固件需要。
ProtectSecureBootFalse保护UEFI安全启动变量不被写入。
ProtectUefiServicesFalse保护UEFI服务不被固件覆盖。
ProvideConsoleGopEnableTrue如果控制台手柄中缺少图形输出协议,请安装。
ProvideCustomSlideTrue强制macOS在可用的slide值中使用伪随机值。
RebuildAppleMemoryMapTrue生成与macOS兼容的内存映射。
SetupVirtualMapTrue在SetVirtualAddress调用之后访问内存的某些固件中的解决方法问题通常会导致启动崩溃。
SignalAppleOSFalseMac OS固件在不同的OS上具有不同的行为,因此该功能非常有用。
SyncRuntimePermissionsTrue更新运行时环境的内存权限。

下面贴一个 Z390 适用的配置:

参数默认值说明翻译
AvoidRuntimeDefragTrue修复了许多固件上的UEFI运行时服务支持。
DevirtualiseMmioTrue减少内存映射中被盗的内存占用,与某些系统不兼容
DisableSingleUserFalse忽略单用户模式参数的安全选项。
DisableVariableWriteTrue一种安全选项,用于保护macOS NVRAM写入访问。
DiscardHibernateMapFalse用于解决有问题的内存映射的旧参数。从S4睡眠唤醒后,保留运行时内存的大小和位置。
EnableSafeModeSlideTrue修补引导加载程序以在安全模式下启用KASLR。
EnableWriteUnprotectorTrue允许对UEFI运行时服务代码进行写访问。如果可能,请使用RebuildAppleMemoryMap。
ForceExitBootServicesTrue确保即使使用了过期的MemoryMap密钥,对ExitBootServices的调用也会成功。
MmioWhitelistArray设计为用plist dict值填充,描述使用DevirtualiseMmio quirk时对特定固件功能至关重要的地址。
ProtectMemoryRegionsFalse保护内存区域免受错误访问。仅非常旧的固件需要。
ProtectSecureBootTrue保护UEFI安全启动变量不被写入。
ProtectUefiServicesTrue保护UEFI服务不被固件覆盖。
ProvideConsoleGopEnableTrue如果控制台手柄中缺少图形输出协议,请安装。
ProvideCustomSlideTrue强制macOS在可用的slide值中使用伪随机值。
RebuildAppleMemoryMapTrue生成与macOS兼容的内存映射。
SetupVirtualMapTrue在SetVirtualAddress调用之后访问内存的某些固件中的解决方法问题通常会导致启动崩溃。
SignalAppleOSFalseMac OS固件在不同的OS上具有不同的行为,因此该功能非常有用。
SyncRuntimePermissionsTrue更新运行时环境的内存权限。

其中需要注意的是 ProtectUefiServices:

  • 这个 Quirks 主要用于保护 UEFI Service 不被 Firmware 给覆盖,某些硬件或虚拟机(如 VMware)的 Firmware 可能会在加载驱动程序或相关操作的时候更新指向 UEFI Service;
  • 选择 Yes 开启时,删除启动参数中的 slide=X,删除 /EFI/Clover/Drivers/MemoryAllocation.efi;
  • 选择 No 关闭时,二者需保留。

 

0. 本站所有资源解压密码均为 heipg.cn
1. 本站资源收集于网络,仅做学习和交流使用,请于下载后24小时内删除。如果你喜欢我们推荐的软件,请购买正版支持作者。
2. 如有无法下载的链接,请及时邮箱[email protected],或到QQ群进行反馈,我们将及时进行处理。
3. 本站发布的内容若侵犯到您的权益,请联系站长删除,联系方式:[email protected],我们将第一时间配合处理!
扫描QQ二维码加入【黑苹果星球交流群】

黑苹果星球 » 使用OcQuirks替换AptioMemoryFix,解决卡+号内存问题

1 评论

  1. 赞助永久会员免费查看

发表评论