黑苹果修复KASLR,解决卡 Couldn't allOCate runtime area 错误

我是老吴,淘宝专业远程安装黑苹果,有需要的可以到我的小店http://laowu1688.taobao.com

在安装黑苹果过程中,容易遇到卡在Couldn’t allOCate runtime area提示错误,尤其在Z390, X99 and X299上比较容易出现。

![黑苹果修复KASLR,解决卡 Couldn’t allOCate runtime area 错误](/images/pasted-10.webp ‘黑苹果修复KASLR,解决卡 Couldn’t allOCate runtime area 错误’)

网上己有的解决方法,大多是换内存补丁,现在介绍几种新的解决方法,适合OC和CLOVER引导。

什么是KASLR?

KASLR是kernel address space layout randomization的缩写,直译过来就是内核地址空间布局随机化。KASLR技术允许kernel image加载到macOS区域的任何位置。

当您引入的设备具有较小的内存映射或存在太多设备的情况时,就会成为问题。内核可能有运行的空间,但也有内核无法完全容纳的可用空间。这就是slide=xxx适合的情况。我们不会让macOS在每次引导时选择一个随机区域来操作,而是将其限制在我们知道可以工作的地方。

就像我刚才提到的,这是针对没有足够空间容纳内核或移动到太小的空间的用户的。引导时通常会遇到类似以下错误:
Error allOCating 0x1197b pages at 0x0000000017a80000 allOC type 2
Couldn’t allOCate runtime area

或者这样的错误:
Only 244/256 slide values are usable!

甚至在运行macOS时崩溃:
panic(cpu 6 caller 0xffffff801fc057ba): a freed zone element has been modified in zone kallOC.4096: expected 0x3f00116dbe8a46f6 but found 0x3f00116d00000000

因为出现这种问题是随机的,有时开机几次是正常,遇尔一次就出错了,或者说重启几十次都出错,但偶尔一次却能正常,极度不稳定的表现。

那么我该如何解决?
真正的解决方法实际上非常简单,Clover和- OpenCore用户的过程基本都是相同的。您需要什么:

CLOVER用户:
Clover Shell(大多数用户已经包含了它,通常称为shell64.efi或某些变体)
这可以在下面找到 EFI/CLOVER/tools
如果缺少此功能,则可以从https://github.com/CloverHackyColor/CloverBootloader/releases中下载它。
OCQuirks(请勿将Aptio修复程序混在一起或使用OsxAptioFixDrvX,AptioMemoryFix,本指南仅支持OCQuirks,我们应该放弃这些老旧的aptio修复补丁)
OCQuirks下载:https://github.com/ReddestDream/OCQuirks/releases
将OCQuirks.efi,OpenRuntime.efi,OCQuirks.plist放在EFI/CLOVER/drivers/UEFI里面

  • OpenCore用户:
    OpenRuntime(一般是自带的)
    OpenShell(一般是自带并启用的)

接下来需要对OCQuirks.plist进行配置,用Xcode或者其它XML编辑器打开,有几点需要注意的:
AvoidRuntimeDefrag:YES
修复UEFI运行时服务,例如日期,时间,NVRAM,电源控制等
DevirtualiseMmio:YES
减少被占用的内存占用空间,扩展slide=N值的选项,对于解决Z390上的内存分配问题非常有帮助。
EnableSafeModeSlide:YES
允许在安全模式下使用slide值
ProtectUefiServices:NO
保护UEFI服务免于被固件覆盖,主要与VM,300系列以及更新的系统(例如Ice Lake和Comet Lake)相关
ProvideCustomSlide:YES
这样可以确保内核仅选择合适的区域,并避免可能导致引导失败的区域。它仍然是随机的,但在随机化中忽略了那些不良区域.
RebuildAppleMemoryMap:YES
生成与macOS兼容的内存映射,可能会破坏某些笔记本电脑OEM固件,如果您收到早期启动失败,请禁用此功能.

BIOS设置:
1,更新BIOS最新官方发行版本,尤其在Z390上,最新的BIOS固件有助于解决这个问题。
2,恢复BIOS出厂设置
3,Above4GDecoding启动,这允许设备使用超过4G的内存空间,但在X99和X299可能会出现问题,这个必须测试。
4,CSM禁用
5,Intel SGX禁用
6,Parallel Port禁用
7,Serial Port禁用
8,Thunderbolt禁用
10,LED lighting禁用
11,Legacy USB禁用

启动测试:
经过细调后的EFI和BIOS设置,我们应测试一下问题是否还会出现,如果没有就万事大吉,如果还有,那么就需要进行下一步,查找适合的SLIDE值。

查找slide值:
在clover引导页和OC引导页打开EFI Shell,CLOVER一般为第二行小图标第一个,OC需要按空格然后选EFI Shell,进入命令行。这时我们输入 memmap 并按下回车。

![黑苹果修复KASLR,解决卡 Couldn’t allOCate runtime area 错误](/images/pasted-11.webp ‘黑苹果修复KASLR,解决卡 Couldn’t allOCate runtime area 错误’)

我们将看到非常多的表,只需留意Type为Available的Start列值,我们先找最大的值,在上表中,是000000006B626000,转换成十六进制是0x6B626000,简单来说就是去掉6前面的所有0.然后运用以下的计算公式,需要用到进制计算器,macOS的计算器可以,网上也有一些在线的计算器
0x6B626000 - 0x100000 / 0x200000 = 0x35A
以上的公式是0x6B626000减100000再除于200000等于0x35A
将0x35A转换成十进制,等于858再+1就等于859
计算出
slide=859

但!等等,大于256了,所以这是无效的,这是因为开启了Above4GDecoding的关系,这时,我们应尝试Available的Start列值最小的0000000000100000,再用公式计算一下
0x100000 - 0x100000 / 0x200000 =0x0
当计算的值为0的时候,无须为其+1,所以计算出slide=0,将其添加到config.plist中,如果依旧出错,我们可以再选择Available的Start列值第二大的值,如000000005B676000,如此类推,直到我们找到一个能用的,不再出错的slide值。