You are on page 1of 111

 首页

 PHP
 JAVA
 FLUTTER
 前端
 其他
 随笔
 文档
首页 > 我的博客 > 前端

opencore 详解《转载》

来源:blog.xjn819.com 时间:2021-01-10 14:18

建议原站阅读,排版更好,此处为防丢失

简介

OpenCore(OC) 是一种新的引导方式,越来越多的 kexts 开始放弃 Clover, 我


相信提早使用 OC 会对你未来使用黑苹果会有很大的帮助。这是一个自然
的现象,就像变色龙被 Clover 淘汰,而现在 OC 代替 Clover 也是大势所趋。
你应该需要看一些相关的文章,来帮助你理解我的正文内容,同时也需要
下载我推荐的软件。

阅读


Opencore Vanilla Desktop Guide

Getting Started With OpenCore

 精解 OpenCore

软件下载

Xcode (从 App Store 或 Apple Developer 下载,强烈建议使用 v10 版


本的 Xcode,v11 花里胡哨已经劝退=。=)

ProperTree 最新推荐的 config 编辑器

OpenCore (由 @BAT 维护的每日工厂版,尝鲜用户可以下载这个)


OpenCore(官方稳定版本)

Hackintool

MaciASL

宪武大大 oc 部件

gfxutil


更新日记

点击查询帖子最近更新

0.0 BIOS 设置

直接抄袭 @BAT 了

 禁用:

英文 中文

Fast Boot 快速启动

CFG Lock (MSR 0xE2 write protection) CFG 锁 (MSR 0xE2 写入保

VT-d VT-d

CSM 兼容性支持模块

Intel SGX Intel SGX

 启用:

英文 中文

VT-x VT-x

Above 4G decoding 大于 4G 地址空间解码

Hyper Threading 处理器超线程

Execute Disable Bit 执行禁止位

EHCI/XHCI Hand-off 接手 EHCI/XHCI 控制

OS type: Windows 8.1/10 操作系统类型: Windows 8.1/10


英文 中文

Legacy RTC Device 传统 RTC 设备

将操作系统类型设置为 Windows 8.1/10 是因为部分主板


在 Other 模式下会将系统认作是 Windows 7 从而禁用
UEFI 的某些功能并开启 CSM, 200 系及以后的主板理论上
不存在这个问题

1.0 整理 OPENCORE 目录

打开下载好的最新版 OC,把 Doc 文件夹下面的 Sample.plist 改名


为 config.plist,并把此文件移动到 EFI 目录下面。
打开 EFI--Kexts,我们把常用的一些 kexts 先放进去,一般情况下你需
要放如下 Kexts:

Lilu.kext Acidanthera 驱动全家桶的 SDK

Applealc.kext 声卡驱动


VirtualSMC.kext 传感器驱动依赖

SMCProcessor.kext CPU 核传感器

SMCSuperIO.kext IO 传感器

WhateverGreen.kext 显卡驱动

IntelMausi.kext Intel 类千兆网卡驱动

Usbinjectall.kext USB 驱动 (你也可以定制自己的 USB 补丁)


NVMeFix.kext 为 NVME 硬盘增加 ASPT 属性来保证节电,虽然对台式


机没啥用,但是官方推荐所有 NVME 用户都使用此补丁

一些机型用了 1820A,1560,1830 等网卡,需要自己放对应驱


动;有线螃蟹卡也自己放一下驱动;笔记本类需要更多传感
器的,请自行补齐 VirtualSMC 的那些传感器补丁

打开 EFI--Drives,里面的驱动介绍如下:

AudioDxe.efi 开机 UEFI 界面若需要声音效果需要加载。

CrScreenshotDxe.efi 开机 UEFI 的截图工具。

HiiDatabase.efi 用于给 Ivy Bridge (3 代酷睿) 或更老代主板上支持 UEFI 字


体渲染, UEFI Shell 中文字渲染异常时使用, 新主板不需要。

NvmExpressDxe.efi 用于在 Haswell (4 代酷睿) 或更老的主板上支持


NVMe 硬盘, 新主板不需要。

OpenCanopy.efi 加载第三方开机主题。

OpenRuntime.efi 内存运用等必要的插件,必须加载。

OpenUsbKbDxe.efi 给使用模拟 UEFI 的老主板在 OpenCore 界面正常输入


用的, 请勿在 Ivy Bridge (3 代酷睿)及以上的主板上使用。

Ps2KeyboardDxe.efi PS2 键盘所需插件。


Ps2MouseDxe.efi PS2 鼠标所需插件。

UsbMouseDxe.efi 当 MacOS 被安装在虚拟机上所需要的鼠标插件。

XhciDxe.efi 用于在 Sandy Bridge(2 代)及之前或更老的主板上加载


XHCI 控制器。

HfsPlus.efi 用于 HFS 格式文件系统,这是必须加载的。

2.0 Config.plist 修改

这章会把 config 的项目分开来,内容繁琐,为了让小白明白各个选项的用


途。当然有能力的人可以直接看我最前面的几个链接来配置 config.plis
t。我这里强制要求你使用 Propertree 来编辑 Config.plist,其他的任
何软件我都不建议使用。
2.1 Config–ACPI

ACPI 包括了四个部分:Add, Block, Patch, Quirks。这里我们先把 root 下面


的几条 #WARNING 删除,这几条没有实际意义。

2.1.1 Config–ACPI–Add

这部分主要填写我们使用的 SSDT 以及 DSDT 文件,如果没有请把 0-8 的


ssdt 全部删除。如果你有修改的 SSDT 或者 DSDT 文件,请先将文件放
入 EFI/OC/ACPI 下。

因为我使用雷电卡,我需要添加两条关于雷电卡的 ssdt 文件:

Item 0

Comment String Thunderbolt3-DTGP //填一个你自己能辨别的名字,方便知道是啥

Enable Boolean YES //表示加载此 SSDT,反之 NO 则为不加载

Path String SSDT-DTGP.aml //为你 ssdt 放在 EFI/OC/ACPI 下的文件名,必须一致

Item 1
Comment String Thunderbolt3

Enable Boolean YES

Path String SSDT-TB3.aml

2.1.2 Config–ACPI–Delete

这个目录下是禁用一些 SSDT/DSDT,没什么用,我把下面的 item 全都删


了。

2.1.3 Config–ACPI–Patch

这里我们需要填写一下热补丁。

 10.15 及以上系统,一些资料指出我们需要把 EC 控制器(EC0)改名为 EC


来确保能进入 10.15 系统
Comment: EC0 to EC

Count: 0

Enabled: YES

Find: <4543305F>

Limit: 0

Mask: <>

OemTable: <>

Replace: <45435F5F>

ReplaceMask: <>

Skip: 0

TableLength: 0

TableSignature: <>

一些主板的 EC 控制器名字可能会叫 H_EC 等,请自行提取


DSDT 并搜索 PNP0C09,来获取 EC 控制器的名字,这些内
容会在第三章中写出。

 华擎、华硕、微星主板可能会遇到采用新的 AWAC 时钟而无法进入系统


这同样需要添加 hotpatch 补丁来解决:
Comment: RTC fix

Count: 0

Enabled: YES

Find: <A00A9353 54415301>

Limit: 0

Mask: <>

OemTable: <>

Replace: <A00A910A FF0BFFFF>

ReplaceMask: <>

Skip: 0

TableLength: 0

TableSignature: <>

2.1.4 Config–ACPI–Quirks

此目录下有五项,选择与解释如下:

 FadtEnableReset: NO
 旧的主板需要对 FADT 进行标记来激活电脑的开机和关机功能,这里
我们不许要启动它
 NormalizeHeaders: NO
 清理 ACPI 头,一些主板的 ACPI 表需要打开这个修复 10.13 系统的启
动。
 RebaseRegions: YES
 尝试试探性地重新定位 ACPI 内存区域, 使用自定义 DSDT 则必须开启
 ResetHwSig: NO
 存在重新启动后因无法维持硬件签名而导致从休眠中唤醒的问题的
硬件需要开启
 ResetLogoStatus: NO
 无法在有 BGRT 表的系统上显示 OEM Windows 标志的硬件需要开

2.2 Config–Booter

内存相关选项设置。

2.2.1 Config–Booter–MmioWhitelist

默认的第一项是为 Haswell 芯片提供的内存寻址修复,如果此类芯片碰


到内存相关问题,请开启它(enable 选择 yes)。


默认第二项是开机卡 PCI Configuration 这里。ACPI、PCI device 同时释
放到内存时发生 0x1000 内存地址被占用而卡在 PCI Configration,
如果碰到此类问题,请开启它。

2.2.2 Config–Booter–Patch

 该功能可以对 Bootx64.efi 进行修改。

2.2.3 Config–Booter–Quirks

此项与 OpenRuntime.efi 有关。在 aptiomemoryfix 停更后,此补丁已经


更名为 Openruntime, 并将一些功能与 OC 合并、模块化。对于无法原
生 nvram 的主板来说,这里的选项需要格外注意。当然我也会把像
300/400 系列、x299、C246、C422 这样支持原生 nvram 的选择方法一并写
进去。

AllowRelocationBlock: NO

 此功能用于 10.7 及更早的 MacOS 系统。当系统需要更低位置的内存


时,该功能可以重新定位那些已经被非 runtimeserivce 所占据的内
存。。

AvoidRuntimeDefrag: YES

 大部分 UEFI 都会写入时间、电源管理等信息,这个所有黑苹果主板


都应该选择 YES。

DevirtualiseMmio: YES

 内存注入方式包括 KASLR 方式(分布式注射到各个内存地址中)以


及连续性方式。在使用 KASLR 时,PCIe 加载到内存,可能会占据所
有 avaliable 值而影响 OC 的内核以及内核缓存无法注入,导致启
动失败。此项目前建议选择 YES,并且在下一项 ProtectUefiServic
es 中也选择 YES。

是更加高效的内存注入方式,但不代表每台机器都能
KASLR
使用这种方案,这里我提供两种关于内存的设置:

1:DevirtualiseMmio 选择 yes, ProtectUefiServices 选择 yes, 并


删除 2.6.1 中 boot-args 里面的 slide=1,以及删除
Drivers 文件夹下的 Memoryallocations.efi。即开启 KASLR
内存注入方式。

2:DevirtualiseMmio 选择 yes, ProtectUefiServices 选择 no, 保


留 2.6.1 中 boot-args 里面的 slide=1,以及保留
Drivers 文件夹下的 Memoryallocations.efi。即开启连续性内
存注入方式。

DisableSingleUser: NO

 这里关乎主机是否能开启单用户模式。什么是单用户模式,请看此文
章。

DisableVariableWrite: YES

 非原生 NVRAM 主板需要模拟 nvram.plist 进而写入 variable 值,


因此我们要禁止此项来防止其他程序对 nvram 进行写入,我们这
里选 YES。需要注意一点,如果你的主板支持原生 nvram,请选择
NO!

DiscardHibernateMap: NO

 电脑从休眠(hibernation)中唤醒时,硬盘里的资料会恢复到内存中去,
但这个时候 OC 的内核以及内核缓存等也会写入,这样可能导致冲
突,这个选项是帮助我们解决这个问题的。而目前来看,除了原生
NVRAM 都无法进行休眠(注意睡眠 sleep 和休眠 hibernation 是
两个概念),台式机的话就更不需要休眠功能了,这里我选择 NO。
这里我们也不讨论如何休眠。

EnableSafeModeSlide: YES

 安全模式下是否启用连续性的内存注入方式。我就选择 YES,与正
常情况下保持一致。

EnableWriteUnprotector: YES

 保证 nvram 能正常写入而不受到 CR0 寄存器的写入保护影响。

ForceExitBootServices: NO

 这个选项是让那些非常老旧的主板也能使用内存寻址,正常情况下
选 NO。

ProtectMemoryRegions: NO

 官方对此项目的解释与 AvoidRuntimeDefrag 类似,除非你明白这


是什么,不然选择 NO,其实我也不明白。

ProtectSecureBoot: NO

 保护安全启动,除非你开启安全启动,不然我们选择 NO。

ProtectUefiServices: NO


 解决 Z390 系列主板卡开机卡++++的问题,这个功能从字面意思是与
我提供的 memoryallocation.efi 功能类似。

ProvideCustomSlide: YES

 此选项执行固件的内存映射分析并检查所有的 slide 值(1 - 255)是


否可用。由于 boot.efi 生成的这个值是利用 rdrand 指令随机生
成的或者伪随机指令 rdtsc 随机生成的,因此当其选择了 一个冲
突的 slide 值时有可能启动失败。由于这种潜在的冲突存在,此选
项 强 制 macOS 在 可 用 的 值 中 使 用 一 个 伪 随 机 值 , 这 也 确 保
了 slide= 启动参数不会因为安全原因传递给操作系统。
是否需要此选项由信息 OCABC (Only N/256 slide values are usable!) 是
否存在于调试日 志中决定。如果存在此信息,则需要启用
此 Quriks 选项。我选择 YES。如果你对 KASLR 有一定的认知并会
运用,请注意这个值。内容从 @套陆 摘抄。

ProvideMaxSlide: 0

 如果你没有启用 KASLR 的话,请填写 1-255 之间的数字以存放休


眠文件写进内存所需要的内存高度,反之则填写 0。

RebuildAppleMemoryMap: NO

 重新生成内存地图来匹配苹果系统。苹果的内核有很多缺陷,比如单
张的内存地图不能超过 4K,一旦超过就可能无法开机;又比如一些
硬件会直接把读写权限写进内存里,而苹果却不能给与写入权限。如
果你遇到此类的问题,请尝试开启它。注意此项目与 EnableWriteU
nprotector 存在冲突关系,确保开启这个的时候,另一个是关闭的。
另外,此项又需要与 SyncRuntimePermissions 项搭配使用。一般情
况下请选择 NO。

SetupVirtualMap: YES

 是否建立虚拟内存并对物理内存进行映射。我们在开机时,OC 的程
序需要一块连续性的内存进行存放内核等东西,而实际的物理内存
一般都是分散的。因此,我们通过虚拟内存建立连续性内存供 OC 使
用,并映射到分散的物理内存中。这里我们选择 YES。

SignalAppleOS: NO

 通知同一台电脑上的设备 Mac 上的硬件选择,此项是给白苹果用的。


 SyncRuntimePermissions: YES
 修正硬件在注入内存时无法注入权限的问题。一般此类问题存在
2018 年后的主板。如果你因为此选项无法进入 windows,请开启它。

2.3 Config–DeviceProperties

此项是用来注入你的设备的,主要是显卡和声卡两部分。同样你也可以定
制一些设备到你的 关于本机--系统报告--PCI 列表中,尽管没有多大的意义。

2.3.1 声卡
这里首先我们需要确认自己的声卡驱动已经被加载,终端下输入:

kextstat | grep -E "AppleHDA|AppleALC|Lilu"

我们会得到被加载的驱动,请确保 as.vit9696.Lilu;
as.vit9696.AppleALC;com.apple.driver.AppleHDAController;
com.apple.driver.AppleHDA 已经被加载。

找自己声卡的地址,准备好在文章开头要求下载的 gfxutil,将 gfxut


il 程序放在桌面,输入:

~/desktop/gfxutil -f HDEF //一般来说我们在使用 Applealc 后,板载声卡的部件名都叫 HDEF

我们输入后会得到声卡的 PCI 路径,比如我输出的就是:


00:1f.3 8086:a2f0 /PC00@0/HDEF@1F,3 = PciRoot(0x0)/Pci(0x1F,0x3)

这里我们找到的声卡 PCI 路径为 PciRoot(0x0)/Pci(0x1f,0x3)。我们把预


先填写在那里的 PciRoot(0x0)/Pci(0x1b,0x0) 项替换成我们真正的声卡
路径。

后面一段我们看到预先填写的声卡 ID 为 <01000000>,这里我们需要把它
换成合适自己声卡的 ID,输入以下命令得到自己声卡的 CodecID。

ioreg -l|grep IOHDACodecVendorID

点击此页面搜索刚得到的 CodecID 就可查询到自己声卡的型号名称,以及


可用的 LayoutID。
比如我的 CodecID 为 283906408,声卡型号 ALCS1220A,对应 1, 2, 3, 5,
7, 11, 13, 15, 16, 27, 28, 29, 34 的 layout ID。我们需要一个个测试过去,
选定自己能用的。这里我们选择 7 这个 ID 进行测试,将 7 转化成 16 进制
格式为 07,后面为了满足格式要求添加 6 个 0,则为 07000000,将这个
值替换刚才预先填的 01000000 中;如果我们测试 ID 为 27,27 的 16 进制
为 1b,补上 6 个 0 则为 1b000000。

PciRoot(0x0)/Pci(0x1f,0x3)

device-id data <70a10000> //一般情况下这段是不需要填写的,除非你的声卡需要仿冒

layout-id data <0b000000> //这个 Layout id 我瞎写的,你按实际情况写

如果你测试的 ID 都无效,请确保你的操作过程正确、并测试用万能声卡
(VoodooHDA)补丁来替换 AppleALC 这个补丁。如果都不行,你可能需要自
行编译声卡补丁。

2.3.2 核心显卡

打开 PciRoot(0x0)/Pci(0x2,0x0) 这项,此项为驱动核心显卡。驱动核心
显卡我们要分情况讨论:

 1.只有核心显卡的 DP 显示器用户 (HDMI 我会在进阶设置中写);


 2.没有核心显卡的用户;
 3.有核心显卡并用独显做主力的用户。

注意,这里我们只讨论 8 代和 9 代 CPU 的机器,其他 CPU


机型的请在论坛或者黑果小兵博客中搜索相关代码。

2.3.2.1 只有核心显卡的 DP 显示器用户

8 代和 9 代的核显 ID 为:3E9b0007,device ID 为 3e9b0000,但是我们需要


符合苹果的倒叙格式填入:

AAPL,ig-platform-id data <07009b3e>

device-id data <9b3e0000>

framebuffer-unifiedmem data <00000080> //核显显存相关

2.3.2.2 没核心显卡的用户
带 f 的 cpu (e.g. 9100f 9900kf), Xeon 等不带核心显卡的用户不需要管这项,
直接把 AAPL,ig-platform-id 选项卡删了。

2.3.2.3 有核心显卡并用独显做主力的用户

这种情况我们一般把核心显卡作为加速用,而显示则用独立显卡。这样,
我们填一个作为加速用的核显 ID 即可了,8 代 9 代 10 代除外的 cpu 请搜
索黑果小兵的博客:

AAPL,ig-platform-id data <0300983e>

2.3.3 Delete

这里是禁用一些设备的,我们按默认就行了,不需要任何修改。
2.4 Config–Kernel

这里是内核相关选项。

2.4.1 Config–Kernel–Add

这里我们需要填写 kexts 的相关资料。值得注意的是 OC 的 kexts 填写必须


注意顺序,比如 applealc 的依赖是 lilu.kext,那么 lilu.kext 必须填
在第一个,SMCProcessor.kext 依赖于 Virtualsmc.kext。那 Virtualsmc
.kext 必须放在 SMCProcessor.kext 之前。

这里默认情况下很多我们需要的补丁已经被加载里面了,但是 enabled
那块我们要手动改成 yes 去开启它,把一些不用的删了:

Item 0

BundlePath String Lilu.kext //kext 的名字

Comment String //你自己填一个注释,可以不填

Enabled Boolean YES //启动此补丁,反之则为关闭

ExecutablePath String Contents/MacOS/Lilu //通过右键 kext 显示包内容查找 lilu 运行文件的真正路径


MaxKernel String //此补丁支持的最大系统版本,填 19 为 10.15,18 位 10.14;我们一般情况下留空

MinKernel String //此补丁支持的最小系统版本

PlistPath String Contents/Info.plist //kext 的 plist 位置,可以右键 kext 显示包内容查找正确路径

............ ...........

............ ...........

Item 7

BundlePath String USBPorts.kext

Comment String

Enabled Boolean YES

ExecutablePath String //一些没有执行文件的 kext 不需要填写

MaxKernel String

MinKernel String

PlistPath String Contents/Info.plist

............ ...........

............ ...........

2.4.2 Config–Kernel–Block

禁用一些 kexts,这里好像没啥用,不用理会。
2.4.3 Config–Kernel–Emulate

此选项帮助 Ivy Bridge 和一些不受支持的 CPU 加载电源管理的,我们这里


不做此方面讨论。所有选项按默认即可。

2.4.4 Config–Kernel–Force

特殊情况下我们需要强制加载某一些 kext 来达到某种目的,一般我们


不理会此项。

2.4.5 Config–Kernel–Patch

这里是为内核打补丁用的,我会在进阶教程中详细写一下这一块。尤其是
rtc 相关的内容,我都会写进第三章的进阶教程。

2.4.6 Config–Kernel–Quirks
这里是内核相关的快捷选项,比较重要。

AppleCpuPmCfgLock: YES

 四代之前的 CPU,如果未解锁 CFG(即 MSR0xE2) 请选择 YES。

AppleXcpmCfgLock: YES

 四代之后的 CPU 若未解锁 CFG(即 MSR0xE2) 请选择 YES。

AppleXcpmExtraMsrs: NO

 主要在没有原生电源管理的 CPU 上启用,一般是 Haswell-E, Broad


well-E, Skylake-X 这三种 CPU 需要填写 YES 。除此之外的 CPU 选
择 NO。

AppleXcpmForceBoost: NO

 开启时将电脑的 cpu 频率锁定为最高频率。



CustomSMBIOSGuid: NO

 戴尔笔记本专用项。

DisableIoMapper NO

 禁用 vt-d。

DisableLinkeditJettison YES

 提 升 lilu 等 插 件 在 MACOS 11 系 统 的 表 现 , 用 来 替
代 keepsyms=1。

DisableRtcChecksum NO

 越 过 两 条 rtc 检 查 (0x58 及 0x59) 。 RTC 我 们 会 更 多 地 使


用 RTCMemoryFixup.kext 来防止它。

ExtendBTFeatureFlags NO


 代替 BT4LEContinuityFixup.kext 来实现 continuity。

ExternalDiskIcons NO

 修复苹果系统把内部硬盘识别为外置硬盘时(黄色图标的硬盘)开
启。

ForceSecureBootScheme NO

 只在 MacOS 安装在虚拟机并开启 SecurebootModel 时考虑开启。


IncreasePciBarSize NO

 解决卡 PCI configuration,一般卡 pci configuration 都是因为自己错误


的设置和硬件问题。

LapicKernelPanic NO

 适用于 HP 笔记本的内核奔溃选项。

LegacyCommpage NO

 老平台主板中使用 ssse3 需要开启来使用 macOS 10.4 - 10.6。


PanicNoKextDump YES

 防止 kext 出错打报告而让我们看不到真正的 panic 原因,初始


排错时最好打开。

PowerTimeoutKernelPanic YES

 一些设备自身的电源管理无法让系统进入睡眠而超时,导致内核奔
溃,如果有这个问题请选择 YES。

ThirdPartyDrives NO

 开 启 SATA 类 SSD 的 trim 功 能 , 我 没 有 SATA 类 的 ssd , 我 选


择 NO。自行根据情况选择。

XhciPortLimit YES


 解除 15 个 USB 端口限制

2.4.7 Config–Kernel–Scheme

 FuzzyMatch NO
 此选项是给 10.6 以及更早的系统使用,我们不做探讨。

KernelArch NO

 此选项是给 10.7 以及更早的系统使用,不做探讨,直接填写默认


的 x86_64。

KernelCache Auto

 选择更加合适的内核缓存方式以提升启动速度。

2.5 Config–Misc

这里都是一些开机引导类的设置。
2.5.1 Config–Misc–BlessOverride

用于覆盖 Windows bootmgfw.efi 的位置以便识别 Windows 引导项,


OpenCore 和 Windows 的引导文件在同一硬盘的同一个 ESP 分区下使用

▼ Misc <Dictionary>

|__ ▼ BlessOverride <Array>

|__ Item 0 <String> \EFI\Microsoft\Boot\bootmgfw.efi

2.5.2 Config–Misc–Boot

ConsoleAttributes 0

 设置开机选择界面的颜色,默认直接填 0。使用方法为填入字体颜色
和 背景颜 色的 值的 16 进制之和 。 例如 蓝色字 (0x01) + 红色背
景 (0x40) = 0x41。色彩选择如下:

字体颜色

 0x00 — 黑
 0x01 — 蓝
 0x02 — 绿
 0x03 — 青
 0x04 — 红
 0x05 — 艳红
 0x06 — 棕
 0x07 — 淡灰
 0x08 — 深灰
 0x09 — 淡蓝
 0x0A — 淡绿
 0x0B — 淡青
 0x0C — 淡红
 0x0D — 淡艳红
 0x0E — 黄
 0x0F — 白(这里是白色)

背景颜色

 0x00 — 黑
 0x10 — 蓝
 0x20 — 绿
 0x30 — 青
 0x40 — 红
 0x50 — 艳红
 0x60 — 棕
 0x70 — 淡灰

HibernateMode None

检测休眠模式。与系统内的休眠模式 (hibernatemode 25) 配合, 引导


进系统会还原休眠前的状态, 建议关闭

None: 关闭休眠支持

Auto: 自动检测 RTC 和 NVRAM 模式


RTC: RTC 模式

PickerAttributes 17

当你使用 OC 主题时,你可以通过计算以下数值之和来配合使用 OC
主题,建议使用数字 17

0x0001: 是否加载自制的图标。如果是 tool 类的图标应该放在


Resource/Image/xx.icon(与 tool 同名);如果是自定义路径的启动
硬盘,应放在同样位置并被命名为路径.icns。

0x0002: 在图标下显示渲染的文字指示。

0x0004: 使用默认的图标。

0x0008: 使用老式的图标。

0x0010: 在主题界面中允许使用鼠标。

使用 17 这个值意味着是 1+2+4+10

PickerAudioAssist NO

 是否开启开机朗读文字功能,一般选择 NO,如果你要开启,请同时
阅读章节 2.8.2 和 2.8.7 的相关音频设置。

PickerMode Builtin

 是否使用 OC 的开机启动盘选项,如果我们填 Builtin 就是不使用


任何主题;如果我们填 External 就会调用第三方主题。
官网推荐主题下载
请将下载好的 Resources 件放入 ESP/EFI/OC 下,同时,
你需要将 OpenCanopy.efi 放入 Drivers 文件夹下并加载。

PollAppleHotKeys YES

 是否开启一些热键功能,包括 ?+K,?+S

ShowPicker YES

 是否显示开机启动盘选项。

TakeoffDelay 0

 开机热键延时,如果你按热键来不及按,你可以设置 5000 到 10000


之间的值让你有更多时间按热键(毫秒)。

Timeout 5

 倒计时进入指定硬盘,这里我们按需求填写,我填写 5,代表 5 秒
钟进入指定硬盘。
2.5.3 Config–Misc–Debug

是否开启 debug 模式,这里我们暂时不需要,全部按默认设置。

2.5.4 Config–Misc–Entries

这里是帮助我们添加一些你希望的引导路径,这个会在之后的进阶教程中
讲,这里暂时略过不填写。

2.5.5 Config–Misc–Security

AllowNvramReset YES

 是否在开机引导项中加入重置 NVRAM 功能的选项。

AllowSetDefault YES

 选择 yes 后即可在开机选择系统页面中通过 Ctrl+Enter 键设


置默认启动盘。

ApECID 0

 一般按默认的 0 填写,如果要开启安全启动的身份认证,请随便填
写一串数字,比如手机号。

AuthRestart NO

 Filevault 相关项,选择 NO。

BlacklistAppleUpdate YES

 如 果 使 用 MacOS 11 , 请 开 启 它 , 因 为 在 NVRAM 中 设 置 run-efi-


updater 并不能阻止苹果对固件的控制升级。

BootProtect None

 如果你的开机顺序总是改变,你需要填写为 Bootstrap 来保证 OPEN


CORE.EFI 的永久性而免遭到其他操作系统对开机顺位的破坏。在填
写此项为 Bootstrap 后,你同样需要保证 RequestBootVarRouting
是开启的。你可能需要阅读此答案来确保 Bootstrap 被正确设置了。

DmgLoading Any

 如果你没有开启安全启动,请填写 Any;如果使用安全启动,请填
写 Signed(注意大小写)。

EnablePassword NO

 此选项正在开发。

ExposeSensitiveData 2

 模拟 nvram,填 3,如果你有原生 nvram,填写 2。

HaltLevel 2147483648

 按默认设置即可。

PasswordHash 留空

 按默认,如果开启了 EnablePassword,则填写密码的 hash 值。

PasswordSalt 留空

 按默认,如果开启了 EnablePassword,则填写密码的 salt 值。

ScanPolicy 0

 填 0。我们也许会碰到开机的时候默认进入的系统永远是
WINDOWS,并无法更改,之后我们在进阶教程中讲述,如何让 MAC
盘排在第一个,让 WIN 排在后面。

SecureBootModel Disabled

 是否开启安全启动模式,一般我们填写 Disabled (注意大小写)


来关闭此功能。

Vault Optional


 是否开启保险箱功能,我们选择 Optional 不开启它。

2.5.6 Config–Misc–Tools

用于运行 OC 调试工具, 例如验证 CFG 锁 (VerifyMsrE2)

 Arguments
 传递的参数
 Auxiliary: NO
 NO 默认不隐藏

 Name 名称(如 openshell )

 OpenCore 启动项中显示的名称
 Enabled YES/NO
 启用或禁用
 Path 文件名称(如 openshell.efi)
 Tools 文件夹下的文件名

2.6 Config–NVRAM

2.6.1 Config–NVRAM–Add
4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14

UIScale Data <02> //这里填写 01 为普通的 UI 显示模式,02 为开启 HIDPI 的 UI 显示模式,我选择 02

DefaultBackgroundColor Data <00000000> //默认开机背景色为黑色

7C436110-AB2A-4BBB-A880-FE41995C9F82

boot-args String Slide=1 darkwake=0 -v //slide=1 表示从第一组内存开始连续注入;darkwake=0 代表一键唤醒


置中节能选项的小憩功能。如果你要用小憩功能请填 8; -v 是跑代码,在没装好稳定的黑果前我建议加上,方便定位
再删除 -v

csr-active-config Data <e7030000> //关闭 SIP 保护

nvda_drv Data <31> //对 10.13 系统之前的 N 卡的相关设置,我们不做讨论。

prev-lang:kbd Data <7a682d48616e733a323532> //语言设置相关,记得改成这个,这个是中文

7C436110-AB2A-4BBB-A880-FE41995C9F82 //默认就行,如果需要使用 RTC 屏蔽选项,具体参考 RTC 综述

2.6.2 Config–NVRAM–Delete

NVRAM 的数据不可被覆盖,必须先被删除再添加,我们这里按默认设置
不必理会。
2.6.3 Config–NVRAM–LegacySchema

这里是模拟 NVRAM 的变量设置,大部分默认已经填好,我们只需添加两


个变量即可。

打开 7C436110-AB2A-4BBB-A880-FE41995C9F82 这一栏,添加两个 item 如


下:

item 11 String efi-boot-device

item 12 String efi-boot-device-data

2.6.4 Config–NVRAM–LegacyEnable

如果你的主板不支持原生 NVRAM,请一定要选择 YES,反之则选择 N


O。
2.6.5 Config–NVRAM–WriteFlash

一般情况下我们需要选择 YES 来保证启动磁盘功能的正常使用,但开启后


可能会在一段时间后导致 CMOS 被写满,主板无法经过自检。这样的问题
请请参照 RTC 综述

2.6.6 Config–NVRAM–LegacyOverwrite

对模拟 nvram 用户来说,将 nvram.plist 写入硬件,我认为不管是原生


nvram 还是模拟 nvram,都选择 NO。

2.7 Config–PlatformInfo

这里我们填合适的机型。对于最近一代的主板来说,一般的原则,只有核
显的机器我们选 Macmini8,1;只有独显的机器我们选择 iMac Pro 1,1;有核
显和独显的我们选择 iMac 19,1。笔记本请按照对应的 cpu 型号来选择。

2.7.1 Config–PlatformInfo–Automatic
是否自动补全系统信息。这里我选 YES,不重要的信息让它自动填。

2.7.2 Config–PlatformInfo–CustomMemory

自定义内存选项,请选择 NO

2.7.3 Config–PlatformInfo–Generic

这里是我们需要填写的三码部分。

将 OpenCore 包下 Utilities/macserial 程序放到桌面,在终端下输入


以下命令

~/desktop/macserial --model iMacPro1,1 //你也可以换成你想要的机型比如 iMac 19.1


输入后你回获得一些序列号以及主板主板序列号,请自己选用一组,填写
到 MLB 以及 SystemSerialNumber 后重启。

重启后,请再在终端下输入:

ioreg -d2 -c IOPlatformExpertDevice | awk -F\" '/IOPlatformUUID/{print $(NF-1)}'

得到你的主板 UUID,填入 Generic 的 SystemUUID (此操作可以帮助你


的 win 不丢失激活)

AdviseWindows YES

 如果你的 windows 的 efi 不在 showpicker 的第一个,必须选择 Y


ES。

 SystemMemoryStatus Auto
 一些机型本身是可以升级内存,但在关于本机选项卡中不显示内存
选项时需要开启,一般选择 Auto。

SpoofVendor YES

 是否把主板名称更改为 ACDT,一般我们选择 YES。

ProcessorType 0

 为一些 es,qs 或者 amd 的 cpu 在关于本机中显示核心数。


UpdateDataHub YES

 更新 DataHub。

UpdateNVRAM YES

 更新 NVRAM。

UpdateSMBIOS YES

 更新 BIOS

UpdateSMBIOSMode Create

 用新分配的 EfiReservedMemoryType 替换原有的表, 戴尔笔记本需


要使用 Custom 并开启 CustomSMBIOSGuid

2.8 Config—-UEFI

2.8.1 Config–UEFI–APFS

EnableJumpstart YES

 从 APFS 容器中加载内置 APFS 驱动,建议开启 YES。此选项仍然依


据你的 Scanpolicy 来做出决定,请确保在 Scanpolicy 中放开 APFS
格式。

GlobalConnect NO

 一些主板需要选择 yes 才能完全加载 APFS,比如 HP 笔记本。



HideVerbose YES

 是否隐藏啰嗦模式,一般我们需要看日志的时候才开启,所以我们
选择隐藏,选择 YES。

JumpstartHotPlug YES

 是否加载 APFS 格式的热插设备.


MinDate 0

 加载最低发行的 APFS 格式。一些旧的 APFS 可能会危害电脑,我们


填 0。如果你想加载旧的发行日期的 APFS 格式硬盘,请填 -1。

MinVersion 0

 加载最低版本的 APFS 格式。填 0 代表从 HIGH SIERRA 开始加载。


填 -1 代表所有版本,建议填 0。

2.8.2 Config–UEFI–Audio
此项的内容是帮助你在开机阶段驱动板载音频,此项对 DP 等数字音频无
效。

AudioCodec 0

 填写音频声卡 in 节点。可以用 PinConfigurator 提取。

AudioDevice 0

 填写你声卡的路径。这里我们填写章节 2.3.1 中寻找到的声卡路径。这


里我填了 PciRoot(0x0)/Pci(0x1f,0x3),请按你自己的实际情况填
写。

AudioOut 0

 音频声卡 out 节点。可以用 PinConfigurator 提取。

AudioSupport NO

 是否开启黑苹果的提示音支持。

MinimumVolume 20

 声音音量,范围在 0-100 之间。

PlayChime Auto

 是否开启开机提示音;如果需要开启请填入 Enabled。

开启 UEFI 加载阶段的音频你必须下载 Audio 文件夹,并把


Audio 文件夹放到 ESP/EFI/OC/Resources 下。另外你必须注
意 AppleAudio 选项。

2.8.3 Config–UEFI–ConnectDrivers

是否加载补丁,我们选择 YES。

2.8.4 Config–UEFI–Drivers
Drivers

item0 String

0 .................... MemoryAllocation.efi

1 .................... OpenRuntime.efi

2 .................... HFSPlus.efi

3 .................... OpenCanopy.efi

2.8.5 Config–UEFI–Input

此选项是原生 Apple 开机热键的选项,需要配合我们之前设置


的 PollAppleHotKeys = yes 一起用。下面的设置完全按照默认情况就行
了。

如果你是华硕的 z87 或者 z97,你需要打开 PointerSupport


这个选项。

2.8.6 Config–UEFI–Output


ClearScreenOnModeSwitch NO

 消除开机时从图形模式转换到文本时出现残影的问题,如果没有这
个问题我们选择 NO。

ConsoleMode MAX

 主机的输出方式,一般情况下填 MAX,或者留空。

DirectGopRendering NO

 是否使用内置显卡直接渲染开机画面。

ForceResolution NO

 Intel Ironlake/Arrandale 及之前的核心显卡需要开启此功能来自定


义分辨率。

IgnoreTextInGraphics NO


 修复在不使用 -v 跑马模式时候,开机日志导致的苹果 LOGO 显示
不正确的问题。

ProvideConsoleGop YES

 调用显卡 GOP。

ReconnectOnResChange NO

 一些固件在 GOP 分辨率改变后会重新连接显示器才能输出,一般情


况下选择 NO。

ReplaceTabWithSpace NO

 一些固件在 UEFI Shell 下 Tab 功能键不生效,开启这个会用空


格键代替。

Resolution 留空

 开机 UEFI 阶段的分辨率。比如我的显示器是 4K、16:9 的,就填


写 3840x2160。根据情况填写或者不填。

SanitiseClearScreen YES

 修复 4K 及以上显示器的输出问题。

TextRenderer BuiltinGraphics

 OC 开机代码字体渲染方式

UgaPassThrough NO

 通过 uga 来代替那些无法使用 gop 的主板,一般带 uefi 的主板以及


显卡请选择 NO。

2.8.7 Config–UEFI–ProtocolOverrides

AppleAudio NO

 如果你想要开启如同白苹果一样的开机音效,请开启它,并且还需
要配合 UEFI--Audio 的正确设置。

AppleBootPolicy NO

 虚拟机的 Mac 需要用的。


AppleDebugLog NO

 重新安装苹果错误日志界面。

AppleEvent NO

 虚拟机并具有 Vault 的 Mac 需要用的。

AppleFramebufferInfo NO

 为虚拟机使用,不是虚拟机选择 NO。

AppleImageConversion NO

 重建 Apple 图标。

AppleImg4Verification NO

 当开启安全启动时必须开启它。

AppleKeyMap NO

 重建苹果功能键。

AppleRtcRam NO

 重装 AppleRtc 协议。

AppleSecureBoot NO

 苹果安全启动协议。

AppleSmcIo NO

 代替之前的 VirtualSMC.efi,在使用 vault 功能时需要开启。


AppleUserInterfaceTheme NO

 重新安装 Apple User Interface Theme 协议。

DataHub NO

 重建 Datahub。

DeviceProperties NO

 虚拟机或者老款的电脑需要选择 YES 才 能注入 Device


Property,我们选 NO。如果你发现你注入 Device Property 无效,
请选择 YES。

FirmwareVolume NO

 Vault/虚拟机/老款 Mac 需要开启才能相关项。


HashServices NO


 Vault 相关项。

OSInfo NO

 通知主板以及一些程序关于 Mac 引导的信息,一般情况选择 NO。

UnicodeCollation NO

 旧的主板需要,我们选 NO。

2.8.8 Config–UEFI–Quirks

DeduplicateBootOrder YES

 当 RequestBootVarRouting 选项为开启时,一些其他的操作系统
(e.g.windows)可能在某些主板(e.g.ASUS)中会找不到自己的引导而
重新创建,最终导致黑果在没有清理 NVRAM 的情况下是无法进入系
统,或者产生多个 OpenCore 引导项,请选择 YES。

ExitBootServicesDelay 0

 旧主板需要给予主板退出时间(单位为微秒),较新的主板直接填
0。旧的主板比如 Z87pro,填 3000000-5000000。

IgnoreInvalidFlexRatio NO

 如果你没有在 BIOS 中解锁 MSR0x194,一定要选 YES。

ReleaseUsbOwnership NO

 大部分的主板都有自动释放 USB 所有权的功能,我们选 NO。如果


你开机键盘鼠标卡死了,或者 USB 失灵,试试选 YES。

RequestBootVarRouting YES

 增加 启动磁盘 的可靠性。

TscSyncTimeout 0


 帮助一些 X99、X299 的主板开启全核同步功能。此选项旨在代
替 TSCAdjustReset.kext 等类似补丁,推荐的值是 500000。但是
此选项并不能在睡眠唤醒后生效,所以请填写默认值 0,并使用
TSCAdjustReset.kext 来做全核同步。

UnblockFsConnect NO

 惠普笔记本可能会让 OC 无法扫描到启动项,一般选择 NO,如果你


是惠普笔记本,请选择 YES。

2.8.9 Config—-UEFI—-ReservedMemory
Properties

此项为保留内存所用。一些硬件会把硬件 EFI 写进内存过程中占据必要的


UEFI 运行空间,所以我们可以通过此项来预留内存来保证 UEFI 的运行。填
写方式可以参考小兵的文章。来寻找指定内存的起始位置,以 4K 为一个节
点。一般情况下,此项我们并不需要理会。

3.0 OpenCore 完善

3.1 模拟 NVRAM
对 OC 而言,NVRAM 是非常核心的一环,不管是原生还是模拟的。如果你是
原生 nvram 的主板,请不必理会这章节。

这章节的主要内容为非原生 NVRAM 模拟生成 nvram.plist。

首先打开我们之前下载好的 OpenCore,进入目录下
的 Utilities/LogoutHook 文件夹,你会看到 LogoutHook.command 文
件。

打开 Terminal(终端)并输入 cd ~ 返回到用户根目录,输入 mv 和
一个空格,然后鼠标拖动 LogoutHook.command 文件到 Terminal(终
端),再在终端输入 ~/.LogoutHook.command

例如(不要直接复制这条命令行)

mv /Users/xjn/Downloads/OpenCore-0.6.2-RELEASE/Utilities/LogoutHook/LogoutHook.command ~/.LogoutHook.
 最后在 Terminal(终端)中,输入以下命令按回车:

sudo defaults write com.apple.loginwindow LogoutHook /Users/$USER/.LogoutHook.command

终端会提示要求你输入密码(密码打进去不会显示)。

重启,你会在 ESP/EFI/ 下看到 nvram.plist,代表已经成功模拟了。

3.2 建立自己的开机选择系统目录

因此部分需求太小众且繁琐,我折叠起来了,点击展开
3.3 提取 DSDT

尽管提取原始 DSDT 的方法非常多,我认为 CLOVER 的提取方法是最方便


并且靠谱的。我们需要一个空的 U 盘或者空的 ESP 分区,我的教程是非常
偏向小白的,所以这里提取我也会用到 windows,以及 Diskgenius 这个软
件,做最简单的示范。

进入 Windows,插入 U 盘,打开 DiskGenius,选中我们的 U 盘,并选择


顶部菜单栏的快速分区

 分区表类型:GUID
 不要创建新的 ESP 分区

 不要创建新的 MSR 分区

 分区格式为 FAT32

格式化完成后,放入我从黑果小兵镜像包提取出来的 EFI 放进去。这是


一个 clover 引导,但并不能引导你的系统,只能提取 DSDT。

插上 U 盘,重启,通过 U 盘引导,看到 Clover 界面,我们按 F4,这样


原始的 DSDT 文件就收集好了。


重新通过 OC 引导进入系统,我们打开 U 盘,EFI/Clover/ACPI/Orgin 下,
有我们的原始 ACPI 内容,我们只需要 DSDT.aml 这个就行了,保存到安
全的地方。

3.4 加载原生电源管理

提取 DSDT 后使用 MaciASL 打开,搜索你 CPU 的名字。一般情况下,CPU


的名字可能是: PR.CPU0,PR.P000,PR.PR00,SB.CPU0,SB.P000,SB.PR00, SCK0.C00
0, SCK0.CPU0。请依次搜索直到找到自己的 CPU 名字,比如我的就是
SCK0.C000

Processor (C000, 0x00, 0x00001810, 0x06)

Name (_HID, "ACPI0007" /* Processor Device */) // _HID: Hardware ID

Name (_UID, "SCK0-C000") // _UID: Unique ID

Method (_PXM, 0, NotSerialized) // _PXM: Device Proximity

If ((CLOD == 0x00))

Return (0x00)
}

Else

Local0 = DerefOf (APT0 [0x00])

Local1 = CNBS /* \CNBS */

Local1 -= 0x01

Local0 >>= Local1

Local0 &= 0x01

Local1 = 0x00

Local1 *= 0x02

If ((Local0 == 0x01))

Local1 += 0x01

Return (Local1)

打开宪武大大的 OC Little,到 05-注入设备/05-1-注入 x86/ 目录下,我们看


到宪武大大已经把大部分不同名字的 CPU 的 dsl 文件都做好了。我的 CPU
名字叫 SCK0.C000,打开 SSDT-PLUG-_SCK0.C000.dsl,左上角另存为
(save as), 其中文件格式(file format)必须选择 ACPI Machine Language
Binary,文件名字随便写吧,我就叫 plug-xcpm.aml,记住后缀为 .am
l。

将 plug-xcpm.aml 放入 EFI/OC/ACPI 下,并在 config.plist 中添加加


载此 aml 文件:

ACPI

Add

Item 0

Comment String plug-xcpm

Enable Boolean YES

Path String plug-xcpm.aml

加载后,重启,并清理一次 nvram,我们看到偏好设置–节能中,原生
电源管理已经被加载了。

3.4.1 节能五项
节能五项是白果台式机中,系统偏好设置—节能 中的五个选项。在加载原生
电源管理后,一般有 4 项节能出现,而第五项“断电后重启”这项还需要
加载 PPMC 以及 LPCB 下的 PMCR 才能出现。虽然没啥鸟用,但对于强迫
者而言,少一个一定很难受吧。如果你是笔记本,不需要看这章,白果笔
记本本身没有。如果你没有机械硬盘,也不会出现 Put hard disks to
sleep when possible。

直接下载 SSDT-PM.aml 载入即可。

3.5 解锁 macOS 的系统目录

bugprogrammer 给出了一个一劳永逸的解决方案:

解锁 macOS10.15 的系统分区

11 系统的解锁略麻烦:解锁 MacOS11 的系统区

3.6 关于 EC 控制器

EC 控制器是电脑自带的一个叫 embedded controller 的部件。在 10.15 的


系统环境中,笔记本电脑必须重命名原来的 EC,而一些台式机主板则需
要禁用。下面我会分开来讲解如何禁用 EC、如何加载 USB 电源管理支持。
3.6.1 禁用 EC 控制器

之前的章节中提供了重命名这种方式去讲 EC0 更名为 EC,其实这种方法


是只适合笔记本的,台式机最好还是禁用 EC。

打开之前提取出来的 DSDT.aml,搜索 PNP0C09,这里我搜到我的 EC 真实


名字叫做 H_EC,你的可能叫 EC0 或者别的什么奇怪的名字。

这里我可以看到我的 H_EC 已经是屏蔽掉的,怎么判定,你看下面有一


个 Return (Zero),意味着这个部件是不生效的,即禁用。这样的情况我
们不需要做任何 SSDT 去禁用这个真的 EC。

Scope (_SB.PCI0.LPCB)

Device (H_EC)

Name (_HID, EisaId ("PNP0C09") /* Embedded Controller Device */) // _HID: Hardware ID

Name (_UID, One) // _UID: Unique ID

Method (_STA, 0, NotSerialized) // _STA: Status

^^^GFX0.CLID = 0x03

Return (Zero)
}

那么什么样的情况是需要我们去屏蔽的呢?我发现基本上华硕的台式机主
板都会启用这个 EC 控制器,下面代码是华硕主板的 EC 部件,搜索 PNP0
C09,我们看到这种情况下,这个叫 EC0 的 EC 控制器是开启的,注意他
没有 return (Zero) 这个语句,我们需要通过 SSDT 去屏蔽它。

Device (EC0)

Name (_HID, EisaId ("PNP0C09") /* Embedded Controller Device */) // _HID: Hardware ID

Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings

IO (Decode16,

0x0062, // Range Minimum

0x0062, // Range Maximum

0x00, // Alignment

0x01, // Length

IO (Decode16,
0x0066, // Range Minimum

0x0066, // Range Maximum

0x00, // Alignment

0x01, // Length

})

这里我提供了一个禁用 EC 的补丁,请直接下载,打开后左上角另存为
(save as), 其中文件格式(file format)必须选择 ACPI Machine Language
Binary,文件名字随便写吧,我就叫 ssdt-no-EC.aml,记住后缀为 .am
l。将 ssdt-no-EC.aml 放入 EFI/OC/ACPI 目录下,并在 config.plist
中加载此 aml 文件。

直接下载 SSDT-PM.aml 载入即可。

如果你的 EC 名字叫 H_EC 或者别的什么的,你打开这个 .dsl 文件,替


换代码中所有的 EC0 为 H_EC。

External (_SB.PCI0.LPCB, DeviceObj)


External (_SB_.PCI0.LPCB.H_EC, DeviceObj)

Scope (\_SB.PCI0.LPCB.H_EC)

Method (_STA, 0, NotSerialized) // _STA: Status

If (_OSI ("Darwin"))

Return (0)

Else

Return (0x0F)

当你的电脑没有 EC 后,你仍然需要仿冒 EC 来完成全部操作。

3.6.2 重命名 EC 控制器


笔记本不能禁用 EC,禁用 EC 后会直接导致笔记本没有电池。那么我们怎
么去重命名 EC 呢?按照上面提到的方法,找到你 EC 的真实名字,在之前
的章节中我提供了假如你的笔记本的 EC 叫做 EC0 时候的重命名办法,
那如果你的 E C 叫别的乱七八糟的名字呢?

EC 名,比如你的 EC 叫做 H_EC,我们打开在线的 HEX 转换器,输


入 H_EC,并点击下面的 16 进制转换,就可以看到转换出来的值是 485
F4543,把这个值替换到 Find 这个选项卡中就行了。你也会注意到,EC
的 hex-16 进制为 45435F5F,刚好是 Replace 的值。这就是一个非常简
单实用的 OC 重命名。切记!OC 万不得已不要用重命名!

Comment: H_EC to EC

Count: 0

Enabled: YES

Find: <485F4543>

Limit: 0

Mask: <>

OemTable: <>

Replace: <45435F5F>

ReplaceMask: <>

Skip: 0

TableLength: 0

TableSignature: <>
3.6.3 仿冒 EC 及 USBX 供电
禁用 EC 后你需要创建仿冒 EC 来进入系统,同时开启 USB 的快速供电技术
(需设备支持)。你可以比较下面两张图,第二张是功能正确开启的。
这部分内容是仿冒 EC,注意不是每一个 DSDT 的路径都
在 SB.PCI0.LPCB,请搜索 0x001F0000 来确定实际位置和名称。比如我
的主板是在 SB.PC00.LPC0。

Scope (\_SB.PCI0.LPCB)

Device (EC)

Name (_HID, "ACID0001") // _HID: Hardware ID

Method (_STA, 0, NotSerialized) // _STA: Status

If (_OSI ("Darwin"))

Return (0x0F)

Else

Return (Zero)

}
}
3.7 睡眠即醒的相关问题

睡眠即醒很大程度上跟 USB 的定制相关,一般一个好的 USB 定制就能解


决睡眠即醒的问题。当然还有很多无法解决的问题,比如蓝牙不能在 HUB
下进行内建,等等。甚至有些时候我们都不知道为什么黑果会睡不着,那
有没有一个办法让黑果强制睡眠呢?答案是有的。经过我的摸索,有几种
方法能达到强制睡眠的效果,只是方法不同而已,但主要围绕的还是 0d
/6d 的数值来做一些工作。这些方法涉及了很多 OC 领域的一些小技巧,我
也顺便展示给大家。

0d/6d补丁是阻止一些部件参与唤醒工作,这其中包括了
xhc 部件,意味着你无法使用鼠标键盘唤醒,只能用电源键
唤醒。但若你有一组除了 xhc 之外的 usb 控制器,那把键盘
鼠标插在那两个控制器上,可以在使用强制睡眠的情况下用
键盘鼠标唤醒电脑。

3.7.1 分辨 0D/06

主板一般有 5 个部件是直接参与唤醒工作的,这五个部件分别是
XHC(USB 控制器)、CNVW(CNVI 网卡,如果你的主板自带的话) 、
GLAN(有线网卡)、XDCI(USB 相关)、HDEF(音频)。旧的一些主板可能
会有不同的命名,比如 XHC 有叫 EH01,HDEF 叫做 HDAS 等,这里不做讨
论。而这些设备往往会直接影响睡眠,比如你输入:
log show --last 1d | grep "Wake reason"

我们会看到类似的输出结果

2020-10-31 03:35:45.196371+0800 0x74 Default 0x0 0 0 kernel: (AppleACPIPlatform) AppleACPIPlatformPowe


reason: XDCI CNVW

2020-10-31 03:35:45.196373+0800 0x74 Default 0x0 0 0 kernel: (AppleACPIPlatform) AppleACPIPlatformPowe


reason: XDCI CNVW

那么即 是 XDCI CNVW 导致了睡眠出现了问题。于是,我们用几种方法去屏


蔽或者说修改这些部件,来达到电脑正常睡眠的效果。
我们打开之前提取的 SSDT,随便搜索五大部件中的一个,比如说 XDCI:

主要是看上图中 XDCI 下的 _PRW 属性值,可以直接看到 Return 的值


为 GPRW (0x6D, 0x04)。其中 6D 这个数值看主板而定,有些主板叫
做 0D,而后面 04 这个值的含义为 S4 级别的电源管理,即休眠甚至关
机情况下的唤醒;有些后面的数值是 03,代表着 S3 级电源管理。这个我
打一个大家比较熟悉的例子, GLAN 这个网卡部件的 PRW 值也是 0x0
4,为什么要是 04 呢?因为这样我们可以使用远程通过网络启动主机功
能。

3.7.1.1 方法一: OC 全局重命名强制睡眠

上一步中已经确认了你的主板是 0D 还是 06,打开 OC little


的 06/0D 补丁,选择合适自己主板的补丁集,比如我的是 Name-6D 更名.
plist。将补丁抄入自己的 config.plist 后重启生效。

全局重命名会导致其他系统无法通过 OC 引导开机,不建议
使用。

3.7.1.2 方法二: 沿用 Clover 版本的 0D/06 补丁&展示


TgtBridge 在 OC 下的用法

宪武大大做的 clover 版本的 0d/6d 补丁,其实没啥必要讲,只是有留言问


了 tgtbridge 在 oc 下怎么用,那我就展示一下吧。这个补丁原理是一样的,
通过重命名的方式改 _prw。

直接下载宪武大大的 clover hotpatch 补丁包,打开 plist 文件。那我们拿出


一组数据来讲解怎么把它翻译成 oc 版本:
Comment String XHC:_PRW to XPRW

Disabled Boolean True//此补丁并未生效,这里要改成 false 才会生效

Find 5F505257 //hex 转 text 的含义即是:_PRW Replace 58505257 //hex 转 text 的含义即是:XPRW TgtBridge 58
转 text 的含义即是:XHC_

这组改名是对 XHC 下的 PRW 改名为 xprw,这样的话,之前 prw 下的


(0x6D, 0x04) 即不生效了。而指定 xhc 的方法即是使用了 tgtbridge,因为
整张 dsdt 上有几十上百个 _PRW,你必须通过 tgtbridge 来指定到底是哪
一个部件的 _PRW。

那么 OC 到底怎么使用 tgtbridge 来特定某一部件下的内容重命名呢?我们


先把上面一段 clover 的补丁转换成 oc 的版本先吧:

Comment String XHC:_PRW to XPRW

Count Number //需要重点解释

Enabled Boolean True //表示应用此补丁,不应用选 False

Find Data 5F505257 //hex 转 text 的含义即是:_PRW

Limit Number 0 //这个按默认即可 不去管他

Mask Data <> //这个按默认即可 不去管他

OemTableId Data <> //这个按默认即可 不去管他


Replace Data 58505257 //hex 转 text 的含义即是:XPRW

ReplaceMask Data <> //这个按默认即可 不去管他

Skip Number //需要重点解释

TableLength Number 0 //这个按默认即可 不去管他

TableSignature Data 44534454 //hex 转 text 的含义即是:DSDT,这里按默认即可,代表对 dsdt 进行修改

这里就是一个还没全部翻译好的 oc 版改名 xhc 的 prw。那么如何定位 xhc


下的 _prw 呢,主要是填写 Count 和 Skip。其实 oc 的 tgtbridge 是
通过一个个数过去来定位具体哪一个位置的。比如 xhc 的 prw 是整张 dsdt
里面的第 55 个,那 skip 填 54,意味着跳过前 54 个,从第 55 个开
始执行。那执行多少次呢?执行一次 count 就填 1;比如你要同时改
第 55 个和 56 个,那 count 就填 2。说了这么多,我来实操一下吧:
打开 dsdt,在左下角直接搜索_PRW,就能把整张表的_PRW 筛选出来了:
我总共数了一下,一共有 56 个_PRW。我们再在主内容栏上按 ? +F 搜索
xhc,直接找到 xhc 的 _PRW,刚好我们看到我的 xhc 实在整张表的倒数第
4 个,也就是正数第 53 个:
那么我们就可以补充完整张表了:

Comment String XHC:_PRW to XPRW

Count Number 1

Enabled Boolean True

Find Data 5F505257

Limit Number 0

Mask Data <>

OemTableId Data <>

Replace Data 58505257

ReplaceMask Data <>

Skip Number 52

TableLength Number 0

TableSignature Data 44534454

如果你想第 53、54、55 个都改掉,那 count 就写 3,意味着顺序执行 3 次。


好了,就这样,有问题留言。
3.7.1.3 方法三:配合 SSDT+重命名的强制睡眠补丁(推
荐)

oc 不提倡用户直接全局重命名,如果真的要用重命名,也一定是搭配 ssdt
去做重命名,所以这个方法也是宪武大大和我最推荐的一种方法。

打开宪武大大的 OC-SSDT 包,找到 0D/6D 文件夹,打开 SSDT-


GPRW.dsl。

// In config ACPI, GPRW to XPRW

// Find: 47505257 02

// Replace: 58505257 02 //这里提示你要应用这个补丁,你必须在 config 中的 ACPI-PATCH 里面加入如上重命名内

//

DefinitionBlock ("", "SSDT", 2, "ACDT", "GPRW", 0)

External(XPRW, MethodObj) //寻找 dsdt 表中叫做 XPRW 的内容,这是要你在 config 中先把 gprw 改名成 xprw 才会生
什么这个补丁的重命名必须是这个 ssdt 和重命名一起用的原因,你第一个重命名不生效,这个 ssdt 也不会生效。

Method (GPRW, 2, NotSerialized)

If (_OSI ("Darwin")) //为了不破坏 dsdt 完整性,这里做了系统判断,当你运行 windows 的时候,此 ssdt 不生效

If ((0x6D == Arg0)) //如果你的 dsdt 中是 6D 进行判断


{

Return (Package ()

{ 0x6D,

Zero

})

If ((0x0D == Arg0)) //如果你的 dsdt 中是 0D 进行判断

Return (Package ()

{ 0x0D,

Zero

})

Return (XPRW (Arg0, Arg1)) //当运行 mac 系统时,如果你的 dsdt 中 XPRW 为 6d,或者 0d 时返回为 0,即屏蔽。

这个 ssdt 不需要你改任何内容,打开后左上角另存为(save as), 其中文件


格式(file format)必须选择 ACPI Machine Language Binary,文件名字就
叫,记住后缀为 aml。记得将 ssdt-gprw.aml 放入 EFI/OC/ACPI 目录下,
并在 config.plist 中加载此 aml 文件。
同时,我们需要在 ACPI--Patch 下增加一条全局重命名来配合此 SSDT。

Comment: GPRW to XPRW

Count:0

Enabled:YES

Find:<4750525702>

Limit:0

Mask:<>

OemTable:<>

Replace:<5850525702>

ReplaceMask:<>

Skip:0

TableLength:0

TableSignature:<>

3.8 OC 官方内核补丁集介绍
这里会长期更新 OC 官方提供的 Kernel Patch。

3.8.1 华硕等机型开机卡 F1

注意此 kp 补丁只对 10.14.4 以上系统版本生效,旧的我懒得提供了,需要


留言。更好的解决卡 f1 的方案请参照 rtc 综述

Kernel

Patch

Item 0

Base String

Comment String f1 patch (随便填,好记就行)

Count Number 1

Enabled Boolean Yes

Find Data 75330fb7

Identifier String com.apple.driver.AppleRTC

Limit Number 0

Mask Data

MaxKernel String
MinKernel String

Replace Data eb330fb7

ReplaceMask Data

Skip Number 0

3.8.2 关机卡 RTC

Kernel

Patch

Item 2

Base String __ZN8AppleRTC14updateChecksumEv

Comment String Disable RTC ck poweroff(随便填,好记就行)

Count Number 1

Enabled Boolean Yes

Find Data

Identifier String com.apple.driver.AppleRTC

Limit Number 0
Mask Data

MaxKernel String

MinKernel String

Replace Data c3

ReplaceMask Data

Skip Number 0

3.9 300 系列主板开启原生 NVRAM

打开你的 DSDT,搜索 001F0000,确定自己的

 lpc 部件名字,如图示,我的 lpc 部件名叫做 LPC0, 别的主板可能叫做


LPCB,请根据实际情况记录

 lpc 的路径,如图左下角红线提示,我的 LPC 路径在_SB_.PC00.LPC0


 下载 SSDT-PMC.dsl,根据自己的 dsdt 编辑相关内容:
左上角另存为(save as), 其中文件格式(file format)必须选择 ACPI
Machine Language Binary,文件名字随便写吧,我就叫 ssdt-pmc.aml,
记住后缀为 aml。记得将 ssdt-pmc.aml 放入 EFI/OC/ACPI 目录下,并在
config.plist 中添加加载此 aml 文件。

 如果你之前模拟过 nvram,请执行以下命令删除相关模拟内容:

# 删除文件 LogoutHook.command

sudo rm -rf $(sudo defaults read com.apple.loginwindow LogoutHook)

# 清空 LogoutHook 的触发设置

sudo defaults delete com.apple.loginwindow LogoutHook

删除 EFI 下的 nvram.plist。

同时你需要对 config.plist 进行设置:

 NVRAM–LegacyEnable 选择 No
 NVRAM–LegacyOverwrite 选择 No
 Booter–Quirks—-DisableVariableWrite 选择 no
 你也许要打开 NVRAM—WriteFlash 选择 YES(请尽可能不要选!)

3.10 Acidanthera Debug 错误调试

此博客有很多疏漏,你可能会碰到很多奇怪的问题而无法解决。一般来说,
一张开机-v 的截图只能解决一些很简单的问题,一些帮助者可能通过经验
判断你的错误所在,但这样的图无法定位错误,而 Acidanthera 提供了非
常非常强大的排错功能,我们可以利用它收集错误报告,在网络上获得帮
助。

如果我们需要 debug 报告,我们需要将所有的 Acidanthera 的 kext 以及 OC


bootloader 替换成 debug 版本,所有的 debug 版本都会在 github 中提供。
我们下载 debug 版本的 Opencore,替换:

 EFI/BOOT/
 BOOTx64.efi
 EFI/OC/Bootstrap/
 Bootstrap.efi
 EFI/OC/Drivers/
 OpenRuntime.efi
 EFI/OC/
 OpenCore.efi
 下载所有 Acidanthera 的 debug 版本 kexts,并替换到 EFI/OC/kexts

修改 config.plist 中的如下内容:
 AppleDebug YES
 ApplePanic YES
 DisableWatchdog YES
 Target 67
 DisplayLevel 2147483714
 PickerMode Builtin

在 Config.plist/NVRAM/7C436110-AB2A-4BBB-A880-FE41995C9F82/boot-args
栏目中增加

 -liludbgall liludump=30

保存后重启,你会得到:

 /EFI/下找到开机启动日志 (e.g. opencore-2020-11-16-083514.txt)


 /var/log 下得到所有 Acidanthera 的 kext 的日志(e.g.Lilu_1.5.0_20.1.txt)

如果无法进入系统,则只需要第一份日志。

你可以通过这两份日志快速定位错误,或者在网路上寻求帮助。

4.0 OpenCore 进阶

以下内容对你正常使用黑苹果已经无关了,如果你追求更好的黑果表现,
可以看下去,但这部分内容也需要你自己有更好的能力与耐心。如果你不
具备足够的条件,我不建议你看下去;如果你的失误导致硬件的损坏,我
也不会、也没能力负责。

4.1 CPU 的变频优化

此章节对你的要求会相对高一点,并且请你具备如下条件:

 有耐心
 CFG 已经解锁(这也许不是必要条件)
 已经打开原生电源管理。
 此章节只适用于 4 代之后的 CPU。
 在调整 CPU 变频时,出现失误导致 CPU 温度过高,能有正确的处理能
力保证 CPU 不烧毁,我对极端的后果不负责任。
 此教程对无核显用户不友好,需要自己更多的领悟。
 如果你不同意第五条,请不要看下去。

在 Intel 四代之后,苹果引入了新的内核级电源管理方式:XCPM(XNU CPU


Power Management),这种新的管理方式可以高效地管理电源及变频。同
时,苹果也推出了 HWP (HardWare controlled Performance states),这种技
术可以快速根据特定程序的需求,作出变频转换。我们这个章节,本质上
就是在加载 XCPM 的情况下,调整 HWP 来优化 CPU 的变频。

同时我要说的是,我在论坛上看到很多所谓的“变频”,有的甚至加载了
50 多个档位的变频,其实这种是完全没有意义的。我认为,变频是能在你
需要的高频的时候快速进入高频状态,在关闭程序后又能很快回到低档位,
换句话说,其实只需要三个档位就高了:睿频档,正常频率,以及低频档。


你需要搞清楚自己的 cpu 型号,并找到、换成与自己 cpu 型号最接近或
者一样的白苹果型号,并且此型号必须带有 HWP。一般新的笔记本机型
都具有,台式机的话推荐 iMac19.1 以及 Macmini8.1。可查询此帖选取适
合的机型。

执行如下命令:

cd ~/desktop

mkdir cpu

cd cpu

git clone https://github.com/corpnewt/CPUFriendFriend.git

git clone https://github.com/acidanthera/CPUFriend.git cp ~/desktop/cpu/CPUFriend/tools/ResourceConver


~/desktop/cpu/

CpuFriendFriend/CPUFriendFriend.command


你会看到如图的命令行,这里 1 of 4 代表第一段睿频的设置,以此类推,
数值越大睿频越高,下面要求你填写的是最低的频率值,你想要低一
点的 800MHZ 就填 08,高一点的 1300MHZ 就填 0D(注意大小写)

填完前两段后,它会要求你填写 EPP 值,EPP 值越低,性能表现越强。


我们是填的前两段的低频率部分,我们可以选择节能型的,比如
0x80,如果你想极致性能,可以填 0x00。

直至你填完所有 4 段变频需求后,便会生成你的变频 plist。我们执行以


下命令:

cp ~/Desktop/cpu/CpuFriendFriend/Results/*.* ~/Desktop/cpu

 我们会在桌面的 CPU 文件夹中找到你所需要的 ResourceConverter.sh


以及 Mac-xxxxxxx.plist 两个文件
 执行以下命令生成你最终需要的 CPUFriendDataProvider.kext,注意命令
行中 Mac-AA95B1DDAB278B95.plist,请替换成你自己的文件名,这样我
们就可以在桌面的 CPU 文件夹下拿到 CPUFriendDataProvider.kext。

cd ~/Desktop/cpu

./ResourceConverter.sh --kext ~/Desktop/cpu/Mac-AA95B1DDAB278B95.plist


我们再到 CPUFriend 的 release 页面下,下载最新的 release 版本,得到


里面的 CPUFriend.kext

将 CPUFriendDataProvider.kext 与 CPUFriend.kext 一起放到 oc/kexts 下,


并在 config 中加载,注意:CPUFriend.kext 应该放在
CPUFriendDataProvider.kext 的前面。

感谢 @请叫我官人 的帮助。完成,自行测试。

4.2 5700/XT/Redeon VII 显卡的性能优化

此教程已经发于 pcbeta:点此直达

上一篇:前端项目从 0-1 详解下一篇:typescript 构造函数的继承问题

You might also like