使用 OpenCore 引导黑苹果

简介

Opencore引导的相关设置,已停更。


阅读


软件下载


更新日记

点击查询帖子最近更新

2022-12-17

适配OpenCore 0.8.7

  • 增加Config–Kernel–Quirks-CustomPciSerialDevice
  • 增加Config–Kernel–Quirks-ForceAquantiaEthernet
  • 3.10章节增加LogModules
  • 删除Misc–Security–AllowSetDefault
  • 删除Misc–Security–AllowToggleSip
  • 增加Config–Misc–Serial
  • 增加Config–Misc–Tools–FullNvramAccess
  • 修改Config–UEFI–AppleInput
  • 修改Config–UEFI–Audio
  • 修改Config–UEFI–Drivers
  • 其他一些小修改
  • 更新时间跨度太大,若有问题请留言

2021-12-11

适配OpenCore 0.7.6

  • 删除Config–NVRAM–Add下关于UIScale的设置
  • 增加UEFI–Output–ReconnectGraphicsOnConnect
  • 增加UEFI–Output–UIScale
  • 增加UEFI–Quirks–EnableVmx

2021-11-23

适配OpenCore 0.7.5

  • 增加Booters/Quirk/ResizeAppleGpuBars
  • 修改UEFI/Drivers
  • 增加UEFI/Quirks/ForceOcWriteFlash
  • 增加UEFI/Quirks/ResizeGpuBars
  • 修改3.5 解锁 macOS 的系统目录

2021-08-03

适配OpenCore 0.7.2

  • 增加ACPI/Quirks/SyncTableIds
  • 增加Kernel/Scheme/CustomKernel
  • 增加UEFI/AppleInput/GraphicsInputMirroring

2021-06-13

2021-06-12

  • 增加Config/Kernel/Quirks/ProvideCurrentCpuInfo
  • 增加Config/Misc/Security/AllowToggleSip
  • 增加Config/Misc/Tools/Flavour
  • 增加Config/Misc/Tools/RealPath
  • 增加Config/Misc/Tools/TextMode
  • 增加Config/NVRAM/Add/ForceDisplayRotationInEFI
  • 增加Config/PlatformInfo/Generic/AdviseFeatures
  • 删除Config/PlatformInfo/Generic/AdviseWindows
  • 修改Config/UEFI/Output/GopPassThrough
  • 增加Config/UEFI/ProtocolOverrides/AppleEg2Info
  • 请同步更新OcBinaryData!

2021-06-07

  • 因问题比较严重,更新Kernel/quirks/SetApfsTrimTimeout的说明。

2021-05-06

适配OpenCore 0.6.9

  • 修改Config/UEFI/AppleInput/CustomDelays
  • 修改Config/UEFI/AppleInput/KeyInitialDelay
  • 修改Config/UEFI/AppleInput/KeySubsequentDelay
  • 增加Config/UEFI/Quirks/EnableVectorAcceleration
  • 增加Config/UEFI/Quirks/ForgeUefiSupport
  • 增加Config/UEFI/Quirks/ReloadOptionRoms

2021-04-15

适配OpenCore 0.6.8

2021-03-17

适配OpenCore 0.6.7

2021-02-06

适配OpenCore 0.6.6

  • 请同步更新OcBinaryData!
  • 增加Kernel/quirks/SetApfsTrimTimeout
  • 增加Misc/boot/LauncherOption
  • 增加Misc/boot/LauncherPath
  • 删除Misc/Security/BootProtect
  • 增加Config/PlatformInfo/Generic/UseRawUuidEncoding
  • 增加UEFI/Quirks/DisableSecurityPolicy
  • 删除DeduplicateBootOrder

2021-01-18

  • 增加Misc/Boot/PickerVariant 请同步更新OcBinaryData!
  • 增加UEFI/Audio/SetupDelay
  • 删除UEFI/Quirk/DeduplicateBootOrder
  • 增加Config/PlatformInfo/Generic/MaxBIOSVersion

2020-12-12

适配OpenCore 0.6.4

  • 增加booter/quirk/AllowRelocationBlock
  • 增加booter/Patch
  • 修改Misc/Boot/PickerAttributes
  • 修改misc/Security/BootProtect
  • 修改UEFI/Audio/PlayChime

2020-11-02

适配OpenCore 0.6.3

  • 增加ForceResolution
  • 增加ForceSecureBootScheme
  • 增加CustomMemory

2020-10-14:

1.Opencore 0.6.2 正式版修改如下 variables:

  • 增加 ExtendBTFeatureFlags (章节2.4.6)
  • 移除 DummyPowerManagement(章节2.4.6)
  • 增加 LegacyCommpage(章节2.4.6)
  • 增加 SystemMemoryStatus (章节2.7.2)
  • 增加 ProcessorType(章节2.7.2)

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:

一些机型用了 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.plist。我这里强制要求你使用 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 标志的硬件需要开启
  • SyncTableIds: NO
    • 解决当用Opencore引导windows 7及更早的系统时,因缺少SLIC table而无法激活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,并且在下一项 ProtectUefiServices 中也选择 YES

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

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

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

  • DisableSingleUser: NO

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

    • 主板支持原生 nvram,请选择 NO。非原生NVRAM主板需要模拟 nvram.plist 进而写入 variable 值,因此我们要禁止此项来防止其他程序对 nvram 进行写入,我们这里选 YES
  • DiscardHibernateMap: NO

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

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

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

    • 休眠(hibernation)中唤醒使用OpenCore的SHA-1加密验证,我们不适用休眠功能就关闭。休眠不是睡眠!
  • 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,一旦超过就可能无法开机;又比如一些硬件会直接把读写权限写进内存里,而苹果却不能给与写入权限。如果你遇到此类的问题,请尝试开启它。注意此项目与 EnableWriteUnprotector 存在冲突关系,确保开启这个的时候,另一个是关闭的。另外,此项又需要与 SyncRuntimePermissions 项搭配使用。一般情况下请选择 NO
  • ResizeAppleGpuBars: -1

    • 此选项用于适配BIOS具备Resizable BAR功能的主板。BIOS支持此功能可以给Windows带来更好的显卡性能,但另一方面会导致MacOS不稳定。

    • 填如下值对应相对功能:

      • 当值为-1时:关闭此功能
      • 当值为0时: 预留1MB
      • 当值为1时: 预留2MB
      • 当值为2时: 预留4MB
      • 当值为10时: 预留1GB
      • 若要开启此功能建议填0
  • 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.Liluas.vit9696.AppleALCcom.apple.driver.AppleHDAControllercom.apple.driver.AppleHDA 已经被加载。

找自己声卡的地址,准备好在文章开头要求下载的 gfxutil,将 gfxutil 程序放在桌面,输入:

~/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代除外的 cpu 请搜索黑果小兵的博客:

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

注意,10代cpu虽然使用同样的UHD 630,但具体加速代码在iMac 20.1机型下不同,请自行查询


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, Broadwell-E, Skylake-X 这三种 CPU 需要填写 YES。除此之外的 CPU 选择 NO
  • AppleXcpmForceBoost: NO

    • 开启时将电脑的 cpu 频率锁定为最高频率。
  • CustomPciSerialDevice: NO

    • 修改COM串口的默认地址。
  • 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

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

    • 开启次项目以便使用AQC107万兆网卡,同时需要注意关闭DisableIOMapper、开启BIOS中的VT-D等选项以确保VT-D在MacOS中AppleVTD正常运行。
  • 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
  • ProvideCurrentCpuInfo NO

    • 给hyper-V虚拟化MacOS时提供cpu的信息,保证全核同步。
  • SetApfsTrimTimeout -1

    • APFS文件系统根据空间是否被使用或者是空的来设计的,这种设计跟其他文件系统是不同的,一般被设计成被使用空的或者未映射三种情况。这种不同可能带来在启动时系统需要更多的时间来做trim,甚至导致无法进入系统。这个选项是为了设计一个时间节点来终止trim进入系统。一般来说填入-1是不阻止这个trim过程,但如果你有这个问题,你可以设置一个时间,单位为微秒。

    • 因最近的系统更新,当trim过程超过10秒,系统开机时苹果会自动跳过trim,这样会导致一些品牌的ssd无法正常工作,出现系统崩溃,冻屏,死机等问题。解决的办法有两种,一种是将此选项设置一个超长的时间来保证trim结束,(e.g.4294967295),带来的后果是开机非常慢,第二种方法是设置一个非常短的时间直接跳过trim过程(e.g.999)。关闭trim会带来大量的问题,所有的闪存不具备覆写的功能(除了傲腾),需要通过trim来删除日志中需要删除的空间,不然的话,硬盘的速度会直线下降。我们应该避免使用有这类问题的SSD。

    • 目前检查到的兼容性不够好的硬盘包括并不限于:

      • Samsung 950 Pro
      • Samsung 960 Evo/Pro
      • Samsung 970 Evo/Pro
      • Samsung SM961
      • GIGABYTE 512 GB M.2 PCIe SS
      • ADATA Swordfish 2 TB M.2-2280
      • SK Hynix HFS001TD9TNG-L5B0B
      • SK Hynix P31
      • Samsung PM981
      • Micron 2200V MTFDHBA512TCK
      • Asgard AN3+ (STAR1000P)
      • Intel 760p (一些批次)
      • Optane
      • 省略无数其他,列表中的有一些也许没问题,并不是一网打死。
  • ThirdPartyDrives NO

    • 开启 SATA 类 SSD 的 trim 功能,我没有 SATA 类的 ssd,我选择 NO。自行根据情况选择。
  • XhciPortLimit YES

    • 解除 15 个 USB 端口限制。11.3系统不要开启,并自行定义usb端口。

2.4.7 Config–Kernel–Scheme

  • CustomKernel NO

    • 当使用AMD/Atom等CPU时请开启。
  • 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 引导项, OpenCoreWindows 的引导文件在同一硬盘的同一个 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 模式

  • HibernateSkipsPicker NO

    • 在休眠唤醒后不显示picker,一般不开启。
  • HideAuxiliary NO

    • 在tool下等具有Auxiliary并被开启的插件,补丁等是否需要被隐藏起来。
  • LauncherOption Disabled

    • Disabled:对启动项不做任何事
    • Full:把OC的启动项永远置顶在uefi启动顺序中,填入此项后,你必须同时打开RequestBootVarRouting
    • Short:主要给Insydecpu来使用并创建OC启动项。
  • LauncherPath Default

    • Default: 自动加载默认的OpenCore.efi
    • 路径+xxx.efi:给出指定路径来加载OC。比如我们把OpenCore.efi更名为qq.efi并放在\EFI\qq.efi,你就可以填写\EFI\qq.efi
  • 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

    • Builtin: 不使用任何主题
    • External: 调用第三方主题
    • Apple: 给白果用的
  • PickerVariant Auto

    • Auto: 自动选择,根据DefaultBackgroundColour来自动选择并具有时间控制的黑夜或白天的模式。
    • Default: 使用Resource/Images/GoldenGate/ 这个主题
    • 填路径:使用自己的主题,主题文件夹该放在Resource/Images/下,比如Resource/Images/customised/xjn,则在这个选项中填customised/xjn

    官网推荐主题下载
    请将下载好的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

  • AllowSetDefault YES

    • 选择 yes 后即可在开机选择系统页面中通过 Ctrl+Enter 键设置默认启动盘。
  • ApECID 0

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

    • Filevault 相关项,选择 NO
  • BlacklistAppleUpdate YES

    • 如果使用MacOS 11,请开启它,因为在NVRAM中设置run-efi-updater并不能阻止苹果对固件的控制升级。
  • DmgLoading Signed

    • 如果你没有开启安全启动,请填写 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 Default

    • 是否开启安全启动模式。
  • Vault Optional

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

2.5.6 Config–Misc–Serial

  • init NO

    • 是否初始化串口设备
  • Override NO

    • 是否自定义串口设备,如果开启,请关注CustomPciSerialDevice选项,另自定义串口设备的选项请查阅官方说明文档,此文不展开描述。

2.5.7 Config–Misc–Tools

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

  • Arguments
    • 传递的参数
  • Auxiliary: NO
    • NO 默认不隐藏
  • Comment: 随便填
    • 随便填
  • Enabled YES/NO
    • 启用或禁用
  • Flavour Auto
    • PickerAttributes设置成0x0080时适应主题需求
  • FullNvramAccess NO
    • 是否关闭OpenRuntime.efi对NVRAM的保护,一般情况请关闭。
  • Name 名称(如 openshell )
    • OpenCore 启动项中显示的名称
  • Path 文件名称(如 openshell.efi)
    • Tools 文件夹下的文件名
  • RealPath NO
    • 一般不启用
  • TextMode NO
    • 一般不启用

2.6 Config–NVRAM


2.6.1 Config–NVRAM–Add

4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14
    DefaultBackgroundColor      Data       <00000000> //默认开机背景色为黑色

7C436110-AB2A-4BBB-A880-FE41995C9F82
    boot-args                   String    darkwake=0 -v //darkwake=0 代表一键唤醒机器并偏好设置中节能选项的小憩功能。如果你要用小憩功能请填8; -v 是跑代码,在没装好稳定的黑果前我建议加上,方便定位错误,弄完后再删除 -v
    csr-active-config           Data       <e7030000> //关闭 SIP 保护
    nvda_drv                    Data       <31> //对 10.13 系统之前的N卡的相关设置,我们不做讨论。
    prev-lang:kbd               Data       <7a682d48616e733a323532> //语言设置相关,记得改成这个,这个是中文
    ForceDisplayRotationInEFI   Number     0   开机的UEFI界面是否需要调整,比如你是竖屏的,可以填0,90,180,270。请同时开启AppleEg2Info
    7C436110-AB2A-4BBB-A880-FE41995C9F82 //默认就行,如果需要使用 RTC 屏蔽选项,具体参考RTC综述

当你的机型为带有内屏(e.g.iMac19.1),并且你使用Navi系列显卡,请在boot-args中增加agdpmod=pikera


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–WriteFlash

一般情况下我们需要选择 YES 来保证启动磁盘功能的正常使用,但开启后可能会在一段时间后导致 CMOS 被写满,主板无法经过自检。这样的问题请请参照RTC综述


2.6.5 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,填入 GenericSystemUUID (此操作可以帮助你的 win 不丢失激活)

  • AdviseFeatures YES

    • 旧的主板不开启这项会让:
      • 当WINDOWS的EFI引导不在第一个分区时,将无法引导。
      • MacOS无法安装在APFS硬盘上。
  • MaxBIOSVersion 0

    • 一般情况填0,旧款的白苹果需要填写9999.999.999.999.999
  • 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
  • UseRawUuidEncoding NO

    • 一般来说我们都选NO
    • 除非你的UUID,比如:AABBCCDD-EEFF-GGHH-IIJJ-KKLLMMNNOOPP。解码后即是AA BB CC DD EE FF GG HH II JJ KK LL MM NN OO PP,但在实际系统中显示DD CC BB AA FF EE HH GG II JJ KK LL MM NN OO PP。你需要开启这个选项。

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–AppleInput

  • AppleEvent Auto

    • 在UEFI界面中使用APPLE自带的键鼠控制还是用OC制作的。
      • 填写Builtin:使用OpenCore的控制
      • 填写OEM:使用Apple自带的控制
      • 填写Auto:自动选择
  • CustomDelays NO

    • 在UEFI界面中控制键盘连击的延迟。当AppleEvent=OEM 时此选项无效。
      • NO:使用Apple默认的500ms首次延迟和50ms的随后延迟。
      • YES:根据KeyInitialDelay KeySubsequentDelay来设置延迟。
  • GraphicsInputMirroring YES

    • NO: 使用Apple的键盘控制,这可能导致在一些环境下无法使用键盘输入(e.g. Windows BitLocker)。
    • YES:可以让OpenCore在引导一些系统的UEFI模式下时仍然可以使用键盘输入。
  • KeyInitialDelay 50

    • 设置UEFI界面第一次延迟时间,50是500ms,此选项必须在CustomDelays=True时生效。
  • KeySubsequentDelay 5

    • 设置UEFI界面键与键之间的延迟时间,5是50ms,此选项必须在CustomDelays=True时生效。
  • PointerDwellClickTimeout 0

    • 设置UEFI界面中自动左键单击的时间,例如设置5则为指针设备悬停50ms后自动按下左键单击,0为关闭。
  • PointerDwellDoubleClickTimeout 0

    • 设置UEFI界面中自动左键双击的时间,例如设置5则为指针设备悬停50ms后自动按下左键双击,0为关闭。
  • PointerDwellRadius 0

    • 设置悬停的容忍度,此容忍度根据UIScale来确定。在容忍度内的值,则认为是指针设备悬停了,则触发PointerDwellClickTimeoutPointerDwellDoubleClickTimeout
  • PointerPollMask -1

    • 轮询多少台指针设备,-1为所有,若需要限定,通过debug模式读取你想轮询设备的序号并添加,具体查阅官方文档。
  • PointerPollMax 0

    • 轮询指针设备的最大时间。0为不更改。
  • PointerPollMin 0

    • 轮询指针设备的最小时间。0为不更改。
  • PointerSpeedDiv 1

    • 设置UEFI界面中,光标的跟踪速度版本,一般填1。
  • PointerSpeedMul 1

    • 设置UEFI界面中,光标的灵敏度版本,一般填1。

2.8.3 Config–UEFI–Audio

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

  • AudioCodec 0

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

    • 填写你声卡的路径。这里我们填写章节2.3.1中寻找到的声卡路径。这里我填了 PciRoot(0x0)/Pci(0x1f,0x3),请按你自己的实际情况填写。
  • AudioOutMask 0

    • 音频声卡out节点。可以用 PinConfigurator 提取。
  • AudioSupport NO

    • 是否开启黑苹果的开机提示音支持。
  • DisconnectHda NO

    • 一些主板需要通过第三方驱动e.g. AudioDxe来接管音频设备,一般不开启。
  • MaximumGain -15

    • UEFI声音音量的最大值。
  • MinimumAssistGain -30

    • UEFI声音音量的最小值。
  • MinimumAudibleGain -128

    • 一些系统设置的音量低于了音频设备的最小音量,则即使播放了音乐也无法听到,这些声音会导致在UEFI中暂停,设置此项以避免这种情况。
  • PlayChime Auto

    • 是否开启开机提示音;如果需要开启请填入Enabled
  • ResetTrafficClass No

    • 在不使用AppleALC.kext时驱动声卡,一些芯片组上的声卡并不被设置为TC0,比如ICH09。当我们使用AppleALC时,默认被设置为了alctsel。
  • SetupDelay 0

    • 一些codecs要求特殊的延迟才能正常使用。一般填0,而如需填写以0.5为单位增加。
  • VolumeAmplifier 0

    • 非必要情况下填写0。

开启UEFI加载阶段的音频你必须下载Audio文件夹,并把 Audio 文件夹放到 ESP/EFI/OC/Resources 下。另外你必须注意 AppleAudio 选项。


2.8.4 Config–UEFI–ConnectDrivers

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


2.8.5 Config–UEFI–Drivers

Drivers
...  item0                          Dictionary
       Arguments...........String .....
       Comment.............string...... HFSPlus
       Enabled.............Boolean..... Yes
       LoadEarly...........Boolean..... No
       Path................String...... HfsPlus.efi

...  item1                          Dictionary
       Arguments...........String .....
       Comment.............string...... OpenRuntime
       Enabled.............Boolean..... Yes
       LoadEarly...........Boolean..... No
       Path................String...... OpenRuntime.efi       
...  item2                         Dictionary
       Arguments...........String .....
       Comment.............string...... OpenCanopy.efi
       Enabled.............Boolean..... No (请参考PickerMode选项设置)
       LoadEarly...........Boolean..... No
       Path................String...... OpenCanopy.efi    
3 .................... 

2.8.6 Config–UEFI–Input

此选项是原生 Apple 开机热键的选项,需要配合我们之前设置的 PollAppleHotKeys = yes 一起用。下面的设置完全按照默认情况就行了。

如果你是华硕的z87或者z97,你需要打开PointerSupport这个选项。


2.8.7 Config–UEFI–Output

  • ClearScreenOnModeSwitch NO

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

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

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

    • Intel Ironlake/Arrandale 及之前的核心显卡需要开启此功能来自定义分辨率。
  • GopPassThrough Disabled

    • 在UGA环境中调用显卡GOP。若要开启它,你必须同时开启ProvideConsoleGop
  • IgnoreTextInGraphics NO

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

    • 调用显卡 GOP。
  • ReconnectGraphicsOnConnect NO

    • 在老的设备中需要开启这个设置并加载BiosVideo.efi才能更好的呈现UEFI界面,如果要加载这个.efi文件请开启这个,一般情况下请不要开启这个选项。
  • ReconnectOnResChange NO

    • 一些固件在 GOP 分辨率改变后会重新连接显示器才能输出,一般情况下选择 NO
  • ReplaceTabWithSpace NO

    • 一些固件在 UEFI ShellTab 功能键不生效,开启这个会用空格键代替。
  • Resolution 留空

    • 开机 UEFI 阶段的分辨率。比如我的显示器是 4K、16:9 的,就填写 3840x2160。根据情况填写或者不填。
  • SanitiseClearScreen YES

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

    • OC 开机代码字体渲染方式
  • UIScale 2

    • 在UEFI界面设置图像拉伸尺度:
      • 1 : 一倍拉伸,正常显示
      • 2 : 2倍拉伸,等同于苹果的HiDPI效果
      • -1 : 不做任何设置
      • 0 : 自动选择
  • UgaPassThrough NO

    • 通过 uga 来代替那些无法使用 gop 的主板,一般带 uefi 的主板以及显卡请选择 NO

2.8.8 Config–UEFI–ProtocolOverrides

  • AppleAudio NO

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

    • 虚拟机的 Mac 需要用的。
  • AppleDebugLog NO

    • 重新安装苹果错误日志界面。
  • AppleEg2Info NO

    • 配合ForceDisplayRotationInEFI调整开机时画面的显示角度,当你要用竖屏的时候不仅要在nvram中设置ForceDisplayRotationInEFI的角度,这个也要开启。
  • 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.9 Config–UEFI–Quirks

  • ActivateHpetSupport NO

    • 老主板比如ICH6芯片组不具备相关的HPET设置,老的主板你可能需要开启它。
  • EnableVectorAcceleration YES

    • 在CPU支持avx512或者avx的情况下,在UEFI界面中开启avx加速。
  • EnableVmx NO

    • 当使用Opencore引导Windows时,是否开启VMX功能。如果要使用此功能首先请在BIOS中开启,再设置此选项。
  • DisableSecurityPolicy NO

    • 关闭主板的UEFI上的Secure Boot。请不要在BIOS中开启Secure Boot并同时开启这个!
  • ExitBootServicesDelay 0

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

    • 请尽可能关闭它。除非你的主板是eg. Thinkpad T430 and T530。这样的主板必须开启才能保证多系统运行,如果你需要打开它,请在开启后重置NVRAM。
  • ForgeUefiSupport NO

    • 旧的NVIDIA显卡使用UEFI 2.0的gop,但在一些老的MAC中只支持UEFI 1.X。这个开关帮助旧的MAC使用NVDIA2.0的GOP。
  • IgnoreInvalidFlexRatio NO

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

    • 大部分的主板都有自动释放 USB 所有权的功能——BIOS/XHCI EHCI hand-off,我们选 NO。如果你开机键盘鼠标卡死了,或者 USB 失灵,试试选 YES
  • ReloadOptionRoms NO

    • 配合ForgeUefiSupport使用。
  • RequestBootVarRouting YES

    • 增加 启动磁盘 的可靠性。
  • ResizeGpuBars -1

    • 以Opencore为引导时,使用此功能可以自由设置GPU的PCI BAR 大小。注意此功能是通用的,而ResizeAppleGpuBars是针对MacOS系统的。你可以设置的大小如:
      • 当值为-1时,此功能关闭
      • 当值为0时,设置BAR为1MB
      • 当值为1时,设置BAR为2MB
      • 当值为2时,设置BAR为4MB
      • 当值为19时,设置BAR为512GB

        MacOS的极限为1GB,此选项无法更改MacOS的上限。

  • TscSyncTimeout 0

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

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

2.8.10 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.command
  • 最后在 Terminal(终端)中,输入以下命令按回车:
sudo defaults write com.apple.loginwindow LogoutHook /Users/$USER/.LogoutHook.command
  • 终端会提示要求你输入密码(密码打进去不会显示)。

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


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

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

这个教程主要针对的是非原生 nvram 主板的用户,如果你是原生 nvram 的用户,直接在偏好设置—启动磁盘中选定你希望设置为默认启动的磁盘即可,不必往下看浪费时间!

此步骤可能只适合 OC 纯净安装的系统,如果你之前使用过 clover 或者 oc mod 版本,请参照《精解opencore》中模拟 nvram 的方法。

非原生 nvram 用户必须完成以下几点:

  • 通过 3.1的教程 建立 nvram.plist.

  • 确保 OpenCore 的版本为 2019年11月20日 之后的。更新 OpenCore 替换 BOOT/BOOTx64.efi 以及 OC/OpenCore.efi 即可。

  • 确保 config.plist/Misc/Security/ExposeSensitiveData=3Booter/Quirks/DisableVariableWrite=YES ; NVRAM/LegacyEnable= YES

  • 确保文件夹 ESP/EFI/OC/Drivers/ 下没有 VariableRuntimeDxe.efi

如果你是华硕的非原生nvram主板,你还需要做(此文件由群友 @哞 提供):

sudo defaults write com.apple.loginwindow LoginHook ~/.LoginHook.command

3.2.1 以及 3.2.2 也是排列启动盘开机进入顺序的,比较麻烦,不推荐。


3.2.1 第一部分

我们首先要对 Config--Misc--Security--scanpolicy 这个值进行修改,默认的是 0,代表着扫描所有硬盘,而我们现在只让它扫我们的苹果系统硬盘。

感谢 @xlivans 提供的 OC 扫描策略:

  - 2F0303 —官方推荐值+允许扫描HFS文件系统+允许扫描USB设备

    最终扫描策略数值 = 3080963

OC-引导扫描策略

  • 设置位置:Misc\Security\ScanPolicy
  • 定义:

  (01)0x00000001 — 限定为文件系统,由以下允许扫描文件系统子项开启

  (02)0x00000002 — 限定为设备类型,由以下允许扫描设备类型子项开启

  允许扫描文件系统子项

  (03)0x00000100 — 允许扫描APFS文件系统

  (04)0x00000200 — 允许扫描HFS文件系统

  (05)0x00000400 — 允许扫描EFI系统分区文件系统

  允许扫描设备类型子项

  (06)0x00010000 — 允许扫描SATA设备

  (07)0x00020000 — 允许扫描SAS和Mac NVMe设备

  (08)0x00040000 — 允许扫描SCSI设备

  (09)0x00080000 — 允许扫描NVMe设备

  (10)0x00100000 — 允许扫描CD / DVD设备

  (11)0x00200000 — 允许扫描USB设备

  (12)0x00400000 — 允许扫描FireWire设备

  (13)0x00800000 — 允许扫描读卡器设备

  扫描策略数值=(01)+(02)+1个或数个允许扫描文件系统子项+1个或数个允许扫描设备类型子项

  例如:希望扫描对象是APFS文件系统的USB设备,扫描策略数值=(01)+(02)+(03)+(11),经16进制加法计算得出,扫描策略数值=0x200103

  注意,使用时需将16进制转换为10进制。示例最终扫描策略数值=2097411

  • 几种扫描策略

  - F0103 —官方推荐值:(01)+(02)+(03)+(06)+(07)+(08)+(09)

    最终扫描策略数值 = 983299

  - 0—允许扫描所有已知文件系统+允许扫描所有已知设备类型。

  - 2F0303 —官方推荐值+允许扫描HFS文件系统+允许扫描USB设备

    最终扫描策略数值 = 3080963

我们这里让 OC 只扫描 MAC 盘。根据说明,(1)+(2)是必须选的;因为我的 MAC 是 APFS,所以系统子项类我选(3);我的 MAC 是安装在 NVME 上的,所以我在设备类型上选择(09),如果你是安装在 SATA 盘上的,你应该选(6)。

这样我们的公式就是:

(1)+(2)+(3)+(9)= 0x00000001+0x00000002+0x00000100+0x00080000

拿起苹果自带的计算器,按住command+3切换到编程型计算器,并转换到16进制模式:

1+2+100+80000=80103

得到数值后,我们再按一下转换10进制的按键,得出 524547 这个数值。

我们把 524547 填到 scanpolicy 中,重启,你就会看到第一个选项就是你的MAC盘了。但如果你还安装了WINDOWS什么的,选项中却没有了,别急,我们现在要把WIN的引导添加到mac的后面去。


3.2.2 第二部分

现在我们要在开机画面中,将其他的一些系统排在mac后面。此项需要你下载debug版本的Opencore,请在文章开始部分提到的Opencore程序下载界面进行下载,并备份好你目前的EFI。

首先我们需要把下载好的 Opencore-Debug 版本里的 ESP/EFI/BOOT/BOOTx64.efi 以及 ESP/EFI/OpenCore.efi 两个文件替换到你正在使用中的 EFI 里去。修改你正在使用的 EFI/OC/Config.plist:

Misc
    Debug
       DisableWatchDog    Boolean    YES
       Target             Number     65

     Security
       ScanPolicy         Number     0 //这里我们要先改为0来寻找windows的地址,之后找到后改回之前算出来的即可

接着,我们需要寻找你其他系统的UUID,我们打开终端,输入

diskutil list

找到你需要的盘的盘名,比如我的windows在disk0这个位置,而引导WIN的EFI文件夹的盘位是disk0s1。注意,Windows必须为GPT引导模式

/dev/disk1 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI                         314.6 MB   disk0s1
   2:       Microsoft Basic Data BOOTCAMP                999.7 GB   disk0s2

接着输入:

diskutil info disk0s1

在输出内容里,我们需要的是 Disk / Partition UUID,我的是 FF555974-AB3F-40B7-8530-AE6462E197CE,把它记下来。

现在我们通过oc的开机选项直接重启到windows,我们打开DiskGenius,并且到我们mac的EFI盘符下,我们看到有一个日志报告 opencore-xxxxx-xxxxx 生成,为了好记,我们右键把它改名叫 111.txt,并拖到桌面。

打开刚才的 111.txt,我们搜索刚才记录下来的 FF555974-AB3F-40B7-8530-AE6462E197CE

搜到类似这样的路径就是我们需要的:

PciRoot(0x0)/Pci(0x1B,0x0)/Pci(0x0,0x0)/NVMe(0x1,CB-27-B3-91-53-38-25-00)/HD(1,GPT,FF555974-AB3F-40B7-8530-AE6462E197CE,0x800,0x96000)/\EFI\BOOT\BOOTX64.EFI

把之前我们备份好的EFI,全部替换回去。把 disablewatchdogtargetscanpolicy 都改回原来的。这样我们的EFI又回到正式版本了,而不是 DEBUG 版本了。

回到Mac,打开 config.plist,我们把 win 的引导路径添加到 misc--entries,并在此下面添加一个 item,输入如图内容:

Entries
   Arguments     String    
   Comment       String     Windows 10//你随便取个名字
   Enabled       Boolean    YES
   Name          String     Windows 10/开机选择界面的名字
   Path          String     PciRoot(0x0)/Pci(0x1B,0x0)/Pci(0x0,0x0)/NVMe(0x1,CB-27-B3-91-53-38-25-00)/HD(1,GPT,FF555974-AB3F-40B7-8530-AE6462E197CE,0x800,0x96000)/\EFI\BOOT\BOOTX64.EFI
   TextMode      Boolean    No

保存重启后,你会看到windows10放在了mac的下面。

tips: 你可以showpicker选择no,就不会看到选择界面了,而当你需要时,只需要在开机时候按住option或者esc就可以唤出选择界面了,非常白果的体验哦。


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.C000, 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,记住后缀为 .aml

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的系统分区

自MacOS 11起,解锁/Library/system/extensions/不再适用,因系统快照签章。
如果要修改此目录,可以利用Opencore的Kernel block功能先禁用Library/system/extensions的某一个kext,再把修改好的kext通过OC加载;亦可以放置/library/extensions目录。


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部件,搜索 PNP0C09,我们看到这种情况下,这个叫 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,记住后缀为 .aml。将 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进制转换,就可以看到转换出来的值是 485F4543,把这个值替换到 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的快速供电技术(需设备支持)。你可以比较下面两张图,第二张是功能正确开启的。
Screen Shot 2020-10-31 at 3.40.07 PM.png

这部分内容是仿冒 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)
                }
            }
        }
    }

Screenshot-2020-02-05-at-10.47.54-AM.png


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) AppleACPIPlatformPower Wake reason: XDCI CNVW
2020-10-31 03:35:45.196373+0800 0x74       Default     0x0                  0      0    kernel: (AppleACPIPlatform) AppleACPIPlatformPower Wake reason: XDCI CNVW

那么即 是XDCI CNVW 导致了睡眠出现了问题。于是,我们用几种方法去屏蔽或者说修改这些部件,来达到电脑正常睡眠的效果。

我们打开之前提取的SSDT,随便搜索五大部件中的一个,比如说 XDCI:
截屏2019-11-07下午11.06.02.png

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

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

上一步中已经确认了你的主板是 0D 还是 06,打开 OC little06/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    5848435F         //hex转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 呢,主要是填写 CountSkip。其实 oc 的 tgtbridge 是通过一个个数过去来定位具体哪一个位置的。比如xhc的prw是整张dsdt里面的第55个,那 skip54,意味着跳过前 54 个,从第 55 个开始执行。那执行多少次呢?执行一次 count 就填 1;比如你要同时改第 55 个和 56 个,那 count 就填 2。说了这么多,我来实操一下吧:

打开dsdt,在左下角直接搜索_PRW,就能把整张表的_PRW筛选出来了:
截屏2019-11-08上午2.57.43.png

我总共数了一下,一共有56个_PRW。我们再在主内容栏上按 +F 搜索 xhc,直接找到 xhc 的 _PRW,刚好我们看到我的 xhc 实在整张表的倒数第 4 个,也就是正数第 53 个:

截屏2019-11-08上午3.00.36.png

那么我们就可以补充完整张表了:

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

Screenshot-2020-02-05-at-10.47.54-AM.png

  • 下载SSDT-PMC.dsl,根据自己的dsdt编辑相关内容:

Screenshot-2020-02-05-at-10.53.33-AM.png

左上角另存为(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
  • LogModules *
  • 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/ResourceConverter.sh ~/desktop/cpu/
CpuFriendFriend/CPUFriendFriend.command
  • 你会看到如图的命令行,这里1 of 4代表第一段睿频的设置,以此类推,数值越大睿频越高,下面要求你填写的是最低的频率值,你想要低一点的800MHZ就填08,高一点的1300MHZ就填0D(注意大小写)Screen-Shot-2019-12-09-at-11.28.30-AM.png

  • 填完前两段后,它会要求你填写EPP值,EPP值越低,性能表现越强。我们是填的前两段的低频率部分,我们可以选择节能型的,比如0x80,如果你想极致性能,可以填0x00。
    Screen-Shot-2019-12-09-at-11.32.38-AM.png

  • 直至你填完所有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.kextCPUFriend.kext一起放到oc/kexts下,并在config中加载,注意:CPUFriend.kext应该放在CPUFriendDataProvider.kext的前面。

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


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

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

此文章以不再适用Big sur及后的系统。

上一篇
下一篇