使用OpenCore引导黑苹果(转载防丢失)

作者:XJN 来源:blog.xjn819.com 时间:2020-09-09 17:09

简介

OpenCore(OC)是一种新的引导方式,随着越来越多的kexts开始放弃Clover, 我相信提早使用OC会对你未来使用黑苹果会有很大的帮助。这是一个自然的现象,就像变色龙被Clover淘汰,而现在OC代替Clover也是大势所趋。你应该需要看一些相关的文章,来帮助你理解我的正文内容,同时也需要下载我推荐的软件:

 

 

 

帖子更新内容查询

2020-07-23:

1.大家似乎对macos 11的测试版有点急迫,我这里半路更新Opencore0.60的内容。

2.增加ProvideMaxSlide (章节2.2.2)

3.增加GlobalConnect (章节2.8.8)

4.增加AppleFramebufferInfo (章节2.8.5)

5.增加UgaPassThrough (章节2.8.4)

6.删除BlacklistAppleUpdate (章节2.5.5)

7.增加boot-args:vsmcgen=1 用以暴露smc来安装macOS 11(章节2.6.1)

8.增加以及修改3.8.1/3.8.2/3.11.1章节讨论关于rtc的问题,以便于安装MacOS 11。

9.修改章节3.9关于核心显卡加速。

 

 

 

2020-06-14:

以下是opencore 0.5.9正式版的更新内容:

1.Block更名Delete(章节2.1.2标题;章节2.3.3标题;章节2.6.2标题)

2.删除Hideself (章节2.5.2)

3.增加BlacklistAppleUpdate以及BootProtect(章节2.5.5)

4.删除DirectGopCacheMode (章节2.8.4)

5.增加DeduplicateBootOrder以及TscSyncTimeout (章节2.8.6)

 

2020-05-05:

1.最近BAT哥要考试,小兵的精解OPENCORE会停更一段时间,所以就我来写了,以后我只会在正式发行版中更新。这次更新的是0.5.8正式版,晚点写完。

2. 删除ApfsDriverLoader.efi (章节1.0) ;增加APFS章节(章节2.8.8)。

3.增加DisableRtcChecksum(章节2.4.5)。

4.Protocol更名ProtocolOverrides (章节2.8.5)。

5.增加RTC屏蔽选项(章节2.6.1)以及AppleRtcRam(章节2.8.5)。

6.增加ReservedMemory Properties (章节2.8.9)。

 

 

0.0 BIOS设置

 

直接抄袭@黑果小兵了~嘻嘻嘻

禁用如下:

英文 中文
Fast Boot 快速启动
CFG Lock (MSR 0xE2 write protection) CFG 锁 (MSR 0xE2 写入保护)
VT-d VT-d
CSM 兼容性支持模块

 

启用如下:

英文 中文
VT-x VT-x
Above 4G decoding 大于 4G 地址空间解码
Hyper Threading 处理器超线程
Execute Disable Bit 执行禁止位
EHCI/XHCI Hand-off 接手 EHCI/XHCI 控制
OS type: other types 操作系统类型: 其他

 

1.0 整理OPENCORE目录

 

  • 打开下载好的最新版OC(0.5.1),把Doc文件夹下面的SampleFull.plist改名为config.plist,并把此文件移动到EFI目录下面。
  • 打开EFI—Kexts,我们把常用的一些kexts先放进去,一般情况下你需要放如下Kexts:

               *Lilu.kext                             ———- Acidanthera驱动全家桶的底层依赖/下载地址

               *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—Drivers,我们把常用的一些.efi文件放进去,一般情况下你需要放如下补丁:

               *MemoryAllocation.efi                          ———- 帮助主板空出第一个512MB内存,为后面的内存注入做铺垫,若要使用hibernation功能请不要使用它/下载地址

               *OpenRuntime.efi                                ———- 内存寻址补丁/ 在Opencore的程序包的drivers文件夹下。

               *HFSPlus.efi                                        ———- HFS格式支持,在安装MAC或者更新时必须使用此补丁,并且此补丁的效率显然高于官方的vboxhfs.efi/下载地址

               *OpenUsbKbDxe.efi                            ———- 键盘组合键的使用,在Opencore的程序包的drivers文件夹下。

                 *OpenCanopy.efi                                     ———— 如果你想使用第三方主题,请加载此项, 在Opencore的程序包的drivers文件夹下

 

下载完成后,我们的整个EFI文件夹如下图所示:

 

 

2.0 Config.plist 修改

 

这一章会把config的各个大项目分开来,内容会写的繁琐一点,为了让小白明白各个选项的用途,当然有能力的人可以直接看我最前面的几个链接来配置config.plist。我这里强制要求你使用XCode 10或者Propertree来编辑Config.plist,其他的任何软件我都不建议使用,包括Plistedit pro。

 

2.1 Config—-ACPI

ACPI包括了四个部分:Add, Block, Patch, Quirks。这里我们先把root下面的两条#WARNING – 1和#WARNING – 2删除,这两条没有实际意义。

 

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
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
 
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:<>
Comment: EC0 to EC Count:0 Enabled:YES Find:<4543305F> Limit:0 Mask:<> OemTable:<> Replace:<45435F5F> ReplaceMask:<> Skip:0 TableLength:0 TableSignature:<>
 
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控制器的名字,这些内容会在第三章中写出。

 

  • 华擎、华硕、微星主板可能会遇到RTC问题而无法进入系统,这同样需要添加hotpatch补丁来解决:
 
 
 
 
Comment: RTC fix
 
Count:0
 
Enabled:YES
 
Find:<A00A9353 54415301>
 
Limit:0
 
Mask:<>
 
OemTable:<>
 
Replace:<A00A910A FF0BFFFF>
 
ReplaceMask:<>
 
Skip:0
 
TableLength:0
 
TableSignature:<>
Comment: RTC fix Count:0 Enabled:YES Find:<A00A9353 54415301> Limit:0 Mask:<> OemTable:<> Replace:<A00A910A FF0BFFFF> ReplaceMask:<> Skip:0 TableLength:0 TableSignature:<>
 
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

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

Quirks Value 解释
FadtEnableReset NO 一些旧的主板需要对FADT进行标记来激活电脑的开机和关机功能,这里我们不许要启动它(如果你遇到关机变重启,可以打开试试,我们之后也会在nvram中将这个问题修复)
NormalizeHeaders YES 清理ACPI头,一些主板的ACPI表需要打开这个修复启动。但如果补丁点亮系统,请试试NO
RebaseRegions NO 换硬件、升级BIOS等对硬件的操作会对ACPI表产生影响,一般不需要打开,若发现卡PCI Configuraion Begin,请尝试打开
ResetHwSig NO 休眠相关项,台式机不需要
ResetLogoStatus NO 顾名思义了,关了

      

2.2 Config—–Booter

内存相关选项设置。

2.2.1 Config—Boot—MmioWhitelist

默认的第一项是为Haswell芯片提供的内存寻址修复,如果此类芯片碰到内存相关问题,请开启它(enable选择yes)。

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

2.2.2 Config—Boot—Quirks

此项与OpenRuntime.efi有关。在aptiomemoryfix停更后,此补丁已经更名为Openruntime, 并将一些功能与OC合并、模块化。对于无法原生nvram的主板来说,这里的选项需要格外注意。当然我也会把像300系列、x299、c422这样支持原生nvram的选择方法一并写进去。

 

  • AvoidRuntimeDefrag:大部分UEFI都会写入时间、电源管理等信息,这个所有黑苹果主板都应该选择YES

 

  • DevirtualiseMmio:内存注入方式包括KASLR方式(分布式注射到各个内存地址中)以及连续性方式。在使用KASLR时,PCIE加载到内存,可能会占据所有avaliable值而导致OC的内核以及内核缓存无法注入,导致启动失败。此项目前建议选择YES,并且在下一项ProtectUefiServices中也选择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:非原生NVRAM主板需要模拟nvram.plist进而写入variable值,因此我们要禁止此项来防止其他程序对nvram进行写入,我们这里选YES。需要注意一点,如果你的主板支持原生nvram,请选择NO!

 

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

 

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

 

  • EnableWriteUnprotector:保证nvram能正常写入而不受到UEFI内的一些服务的影响,无论什么主板都要选择YES

 

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

 

  • ProtectMemoryRegions:官方对此项目的解释与AvoidRuntimeDefrag类似,除非你明白这是什么,不然选择NO,其实我也不明白。

 

  • ProtectSecureBoot:保护uefi安全启动被写入,我选择YES。

 

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

 

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

 

  • ProvideMaxSlide:如果你没有启用KASLR的话,请选择NO,反之则选择YES。

 

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

 

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

 

  • SignalAppleOS: 通知同一台电脑上的设备mac上的硬件选择,此项应该是给白苹果用的。如果你的mac开启了核显,但是win下核显不能开启,请打开。我选择NO。

 

  • SyncRuntimePermissions:修正硬件在注入内存时无法注入权限的问题。一般此类问题存在2018年后的主板。一般我们选择NO。

 

 

2.3 Config—–DeviceProperties

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

 

2.3.1  声卡

这里首先我们需要找自己声卡的地址,打开hackintool,到PCI列表中寻找IOReg IOname那栏,一般声卡的设备名称叫做HDEF或者HDAS:

这里我们找到的声卡PCI路径为PciRoot(0x0)/Pci(0x1f,0x3)。我们把预先填写在那里的PciRoot(0x0)/Pci(0x1b,0x0)项替换成我们真正的声卡路径。后面一段我们看到预先填写的声卡ID为<01000000>,这里我们需要把它换成自己系统的ID。

  • 打开先前要求下载的Hackintool,到声卡选项部分,我们可以看到自己的声卡编号,我的是ALC1220。

 

  • 打开黑果小兵关于声卡的博客,并搜索我们的声卡型号:ALC1220,我们发现我们的声卡型号对应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。

 

  • 一些奇怪的声卡可能需要注入device ID才能用,不知道为啥:
 
 
 
 
PciRoot(0x0)/Pci(0x1f,0x3)
device-id data <70a10000> //这个device id是固定的,不要问为什么是这个id
layout-id data <0b000000> //这个Layout id我瞎写的,你按实际情况写
PciRoot(0x0)/Pci(0x1f,0x3) device-id data <70a10000> //这个device id是固定的,不要问为什么是这个id layout-id data <0b000000> //这个Layout id我瞎写的,你按实际情况写
 
PciRoot(0x0)/Pci(0x1f,0x3) 
   device-id         data        <70a10000>  //这个device id是固定的,不要问为什么是这个id
   layout-id         data        <0b000000>  //这个Layout id我瞎写的,你按实际情况写

 

 

  • 如果你测试的ID都无效,请确保你的操作过程正确、并测试用万能声卡补丁来替换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>
enable-hdmi20 data <01000000> //如果你的hdmi不是2.0的(主板说明书会写),不需要填写这行。
framebuffer-unifiedmem data <00000080> //核显显存相关
AAPL,ig-platform-id data <07009b3e> device-id data <9b3e0000> enable-hdmi20 data <01000000> //如果你的hdmi不是2.0的(主板说明书会写),不需要填写这行。 framebuffer-unifiedmem data <00000080> //核显显存相关
 
AAPL,ig-platform-id     data    <07009b3e>
device-id               data    <9b3e0000>
enable-hdmi20           data    <01000000>  //如果你的hdmi不是2.0的(主板说明书会写),不需要填写这行。
framebuffer-unifiedmem  data    <00000080>  //核显显存相关

 

2.3.2.2 没核心显卡的用户

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

 

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

这种情况我们一般把核心显卡作为加速用,而显示则用独立显卡。这样,我们填一个作为加速用的核显ID即可了:

 
 
 
 
AAPL,ig-platform-id data <0300983e>
AAPL,ig-platform-id data <0300983e>
 
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,那么lilu必须填在第一个;SMCProcessor.kext依赖于Virtualsmc.kext。那virtualsmc必须放在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 4
BundlePath String WhateverGreen.kext
Comment String
Enabled Boolean YES
ExecutablePath String Contents/MacOS/WhateverGreen
MaxKernel String
MinKernel String
PlistPath String Contents/Info.plist
 
............
............
Item 7
BundlePath String USBPorts.kext
Comment String
Enabled Boolean YES
ExecutablePath String //一些没有执行文件的kext不需要填写
MaxKernel String
MinKernel String
PlistPath String Contents/Info.plist
 
............
............
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 4 BundlePath String WhateverGreen.kext Comment String Enabled Boolean YES ExecutablePath String Contents/MacOS/WhateverGreen MaxKernel String MinKernel String PlistPath String Contents/Info.plist ............ ............ Item 7 BundlePath String USBPorts.kext Comment String Enabled Boolean YES ExecutablePath String //一些没有执行文件的kext不需要填写 MaxKernel String MinKernel String PlistPath String Contents/Info.plist ............ ............
 
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 4
    BundlePath         String     WhateverGreen.kext          
    Comment            String                         
    Enabled            Boolean      YES               
    ExecutablePath     String     Contents/MacOS/WhateverGreen
    MaxKernel          String                          
    MinKernel          String                          
    PlistPath          String     Contents/Info.plist  

............
............
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加载电源管理的,我们这里不做此方面讨论(我没这么老的CPU)。所有选项按默认即可。

 

2.4.4 Config—–Kernel—–Patch

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

如果你碰到华硕开机卡F1的,请看章节

如果你碰到macos 11安装过程中卡pci的,请看章节

 

2.4.5 Config—–Kernel—–Quirks

这里是内核相关的快捷选项,比较重要。

AppleCpuPmCfgLock:四代之前的CPU,如果未解锁CFG(即MSR0xE2)请选择YES。如何解CFG锁我在这篇文章中有详细教程。如果你不会解这个锁,你就选择YES,解锁的情况下选择NO

 

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

 

AppleXcpmExtraMsrs: 主要在没有原生电源管理的CPU上启用,一般是Haswell-E, Broadwell-E, Skylake-X这三种CPU需要填写YES。除此之外的CPU选择NO。

 

AppleXcpmForceBoost:选择yes时将电脑的cpu频率锁定为最高频率,不建议开启,我选择NO。

 

CustomSMBIOSGuid: 戴尔笔记本专用项,我们选择NO。

 

DisableIoMapper: 禁用vt-d,我们在BIOS里已经禁用vt-d了,这里我们选择NO就行了。

 

DisableRtcChecksum:越过两条rtc检查(0x58及0x59)。一般情况下,卡RTC我们会更多地使用RTCMemoryFixup.kext来防止它。我们一般情况下选择NO。

 

DummyPowerManagement:替代NullCpuPowerManagement.kext,如果你使用此补丁,请删除并选择yes。我们一般选择no。

 

ExternalDiskIcons: 修复苹果系统把内部硬盘识别为外置硬盘时(黄色图标的硬盘)开启,我们一般选择NO。

 

IncreasePciBarSize:解决卡PCI configuration,如果碰到请选择yes, 我们选择no。注意,一般卡pci configuration都是因为自己错误的设置和硬件问题。

 

LapicKernelPanic: 适用于HP笔记本的内核奔溃选项,我们选择NO。

 

PanicNoKextDump: 防止kext出错打报告而让我们看不到真正的panic原因,这个随便选,我选择NO。

 

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

 

ThirdPartyDrives: 开启Sata类SSD的trim功能,我没有sata类的ssd,我选择NO。自行根据情况选择。

 

XhciPortLimit: 解除15个端口限制,我选择YES。

 

 

2.5 Config—-Misc

这里都是一些开机引导类的设置。

 

2.5.1 Config—–Misc—–BlessOverride

这个选项是帮助我们寻找一些不寻常的EFI位置的,除非你有这种情况,不然我们不需要填写任何东西。

 

2.5.2 Config—–Misc—–Boot

 

ConsoleAttributes: 设置开机选择界面的颜色,默认直接填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。如果你的主板支持原生nvram、并想测试休眠,可以考虑填auto。

 

HideAuxiliary:在开机选择画面隐藏一些辅助项目,比如recovery盘,clean NVRAM等。一般我们选择NO。

 

PickerAttributes:当你使用OC主题时,你可以通过计算以下数值之和来配合使用OC主题,OC主题至今还在测试阶段。默认填0,你可能使用到的值如下:

  • 0x0004简化主题图标下的文字
  • 0x0008使用老式的图标

 

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

 

PickerMode: 是否使用OC的开机启动盘选项,如果我们填Builtin就是不使用任何主题;如果我们填External就会调用第三方主题。

*注:目前第三方主题只有https://github.com/acidanthera/OcBinaryData下载,请将下载好的文件如图放置,同时,你需要将OpenCanopy.efi放入Drivers文件夹下并加载:

 

PollAppleHotKeys:是否开启一些热键功能,包括Cmd+K;Cmd+S。我选的是yes。如果你开机发现键盘无法选择,也选NO,并且删除OC/Drivers下的AppleUsbKbDxe.efi 。

 

 

ShowPicker: 是否显示开机启动盘选项,比如MAC,WINDOWS那些。我们选择YES。

 

TakeoffDelay:开机热键延时,如果你按热键老是老不急按,你可以设置5000到10000之间的值让你有更多时间按热键。

 

Timeout: 倒计时进入指定硬盘,这里我们按需求填写,我填写5,代表5秒钟进入指定硬盘。

 

 

2.5.3 Config—–Misc—–Debug

是否开启debug模式,这里我们暂时不需要,全部忽略过。

 

 

2.5.4 Config—–Misc—–Entries

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

 

2.5.5 Config—–Misc—–Security

AllowNvramReset: 是否在开机引导项中加入重置nvram缓存功能的选项,我们选YES。

 

AllowSetDefault:选择yes后即可在开机选择系统页面中通过Ctrl+enter键设置默认启动盘。

 

AuthRestart:filevault相关项,选择NO。

 

BootProtect:请填写Bootstrap。此选项能保证OPENCORE.EFI的永久性而免遭到其他操作系统对开机顺位的破坏。在填写此项后,你同样需要保证RequestBootVarRouting是开启的。

 

ExposeSensitiveData: 因为要使用到模拟nvram,这个数值我们必须填3。如果我们是原生nvram,填写2。

 

HaltLevel: 按默认设置即可。

 

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

 

Vault: 黑苹果的vault加密方式,我们不需要这个功能,填Optional。

 

 

 

2.5.6 Config—–Misc—–Tools

这里是加入一些开机时候的工具的。其实我觉得只有重置nvram的工具是有用的,但之前的设置里面我们已经开启了,这个选项就没啥用了,不用理会。

 

 

2.6 Config—-NVRAM

这是关于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 vsmcgen=1 //slide=1表示从第一组内存开始连续注入;darkwake=0代表一键唤醒机器并偏好设置中节能选项的小憩功能。如果你要用小憩功能请填8; -v是跑代码,在没装好稳定的黑果前我建议加上,方便定位错误,弄完后再删除-v;vsmcgen=1为macos 11专用,以便于暴露smc部件。
bootercfg String log=0 debug=0 level=0 //这条自己添加进去,是关闭开机时的代码的。
csr-active-config Data <e7030000> //关闭SIP保护
nvda_drv Data <31> //对10.13系统之前的N卡的相关设置,我们不做讨论。
prev-lang:kbd Data <7a68 2d48 616e 733a 3235 32> //语言设置相关,记得改成这个,这个是中文
 
7C436110-AB2A-4BBB-A880-FE41995C9F82
填写相关RTC屏蔽选项,具体参考<code>AppleRtcRam</code>
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 vsmcgen=1 //slide=1表示从第一组内存开始连续注入;darkwake=0代表一键唤醒机器并偏好设置中节能选项的小憩功能。如果你要用小憩功能请填8; -v是跑代码,在没装好稳定的黑果前我建议加上,方便定位错误,弄完后再删除-v;vsmcgen=1为macos 11专用,以便于暴露smc部件。 bootercfg String log=0 debug=0 level=0 //这条自己添加进去,是关闭开机时的代码的。 csr-active-config Data <e7030000> //关闭SIP保护 nvda_drv Data <31> //对10.13系统之前的N卡的相关设置,我们不做讨论。 prev-lang:kbd Data <7a68 2d48 616e 733a 3235 32> //语言设置相关,记得改成这个,这个是中文 7C436110-AB2A-4BBB-A880-FE41995C9F82 填写相关RTC屏蔽选项,具体参考<code>AppleRtcRam</code>
 
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 vsmcgen=1 //slide=1表示从第一组内存开始连续注入;darkwake=0代表一键唤醒机器并偏好设置中节能选项的小憩功能。如果你要用小憩功能请填8; -v是跑代码,在没装好稳定的黑果前我建议加上,方便定位错误,弄完后再删除-v;vsmcgen=1为macos 11专用,以便于暴露smc部件。
                 bootercfg                String       log=0 debug=0 level=0  //这条自己添加进去,是关闭开机时的代码的。
                 csr-active-config        Data          <e7030000>            //关闭SIP保护
                 nvda_drv                 Data          <31>                  //对10.13系统之前的N卡的相关设置,我们不做讨论。
                 prev-lang:kbd            Data          <7a68 2d48 616e 733a 3235 32>  //语言设置相关,记得改成这个,这个是中文

7C436110-AB2A-4BBB-A880-FE41995C9F82
                 填写相关RTC屏蔽选项,具体参考AppleRtcRam

 

 

2.6.2 Config—–NVRAM—–Delete

禁用一些nvram变量,我们这里按默认设置不必理会。

 

2.6.3 Config—–NVRAM—–LegacyEnable

如果你的主板不支持原生NVRAM,请一定要选择YES! 如果你的主板支持原生nvram的,填no。

 

2.6.4 Config—–NVRAM—–LegacySchema

这里是nvram的变量设置,大部分默认已经填好,我们只需添加两个变量即可。

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

 
 
 
 
item 11 String efi-boot-device
item 12 String efi-boot-device-data
item 11 String efi-boot-device item 12 String efi-boot-device-data
 
item 11             String       efi-boot-device
item 12             String       efi-boot-device-data

 

2.6.5 LegacyOverwrite

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

2.6.6 WriteFlash

如果你的主板bios因为nvram导入垃圾内容,请关闭它,一般都是选择no。

 

2.7 Config—-PlatformInfo

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

 

因为这部分内容太过复杂,其实很多内容都不必要填写,我们直接删除Datahub,PlatfromNVRAM,SMBIOS这三项,无需填写。

 

2.7.1 Config—–PlatformInfo—–Automatic

这里意思是是否自动填写系统信息。因为后面的很多选项都好繁琐,我们只要认真填几个选项就行了,这里我选YES,不重要的信息让它自动填。

 

2.7.2 Config—–PlatformInfo—–Generic

这里是我们需要填写的三码部分。获得三码,我们可以运用一下Clover的Clover Configurator帮我们生成一下相关的数据:

  • 打开Clover configurator,并到SMBIOS选项卡中,选择合适的机型,这里我们以iMac19,1 为例:

 

  • 我们换到Rt variables里,点击ROM下的生成,获得一个ROM编号,这样我们就获得了所有需要的信息了。

 

  • 我们整理一下刚才获得的信息并依次填入Generic下面即可。

 

  • 值得注意的是,SystemUUID这一项最好留空,让OC自动生成,它会影响你的WINDOWS激活状态。

 

  • AdviseWindows:如果你的windows的efi不在showpicker的第一个,必须选择yes,这里一般选择yes。

 

  • SpoofVendor:是否把主板名称更改为acdt,一般我们选择yes。

2.7.3 Config—–PlatformInfo—–剩余部分

UpdateDataHub:选择YES

 

UpdateNVRAM:选择YES

 

UpdateSMBIOS:选择YES

 

UpdateSMBIOSMode:选择Create

 

2.8 Config—-UEFI

这里我们需要填写UEFI相关的设置。

 

2.8.1 Config—–UEFI—-ConnectDrivers

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

 

2.8.2 Config—–UEFI—-Drivers

把我们之前放在OC/EFI/Drivers下面的驱动一一填上,这里我们也注意一下填入的顺序以及文件名的大小写

 
 
 
 
Drivers
item0 String
........................ MemoryAllocation.efi
........................ OpenRuntime.efi
........................ HFSPlus.efi
........................ OpenUsbKbDxe.efi
........................ OpenCanopy.efi
Drivers item0 String ........................ MemoryAllocation.efi ........................ OpenRuntime.efi ........................ HFSPlus.efi ........................ OpenUsbKbDxe.efi ........................ OpenCanopy.efi
 
Drivers
     item0          String       
     ........................    MemoryAllocation.efi
     ........................    OpenRuntime.efi
     ........................    HFSPlus.efi
     ........................    OpenUsbKbDxe.efi
     ........................    OpenCanopy.efi

 

2.8.3 Config—–UEFI—-Input

此选项是原生apple开机热键的选项,需要配合我们之前设置的PollAppleHotKeys=yes以及AppleUsbKbDxe.efi补丁一起用。下面的设置完全按照默认情况就行了。因为我的键盘是苹果原生键盘,不支持这个功能,所以我直接PollAppleHotKeys里填了NO,这里也不会生效的。

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

 

2.8.4 Config—–UEFI—-Output

 

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

 

ConsoleMode:这里填主机的输出方式,一般情况下填MAX,或者留空

 

DirectGopRendering:是否使用内置显卡直接渲染开机画面,建议选择no。

 

IgnoreTextInGraphics: 修复在不使用-v跑马模式时候,开机日志导致的苹果logo显示不正确的问题。如果有这种情况选择YES,一般我们选择NO。

 

ProvideConsoleGop:调用显卡gop,我选择YES。

 

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

 

ReplaceTabWithSpace:一些固件在UEFI Shell下TAB功能键不生效。开启这个会用空格键代替。一般我们选择NO。

 

Resolution:开机分辨率。比如我的显示器是4K、16:9的,我就填写3840×2160。这个你根据情况填写或者不填。

 

SanitiseClearScreen: 修复4k及以上显示器的输出问题,选择YES。

 

TextRenderer:OC开机代码字体渲染方式,我这里填BuiltinGraphics

 

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

 

2.8.5 Config—–UEFI—-ProtocolOverrides

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

 

AppleBootPolicy: 虚拟机的mac需要用的,我们选择NO。

 

AppleDebugLog:重新安装苹果错误日志界面,一般选择NO。

 

AppleEvent: 虚拟机并具有vault的mac需要用的,我们选择NO。

 

AppleFramebufferInfo: 为虚拟机使用,不是虚拟机选择no。

 

AppleImageConversion: 重建apple图标,选择NO。

 

AppleKeyMap: 重建苹果功能键,选择NO。

 

AppleRtcRam:重装applertc协议。一般选择NO,如果你要屏蔽相关选项,请在2.6.1章节中添加相关屏蔽项目。项目可以通过RtcRW提取,或者阅读此文章来指定你想屏蔽的内容。

 

AppleSmcIo:代替之前的VirtualSMC.efi,请选择YES

 

AppleUserInterfaceTheme: 重新安装 Apple User Interface Theme 协议,选择NO。

 

DataHub:重建datahub,这里我们选NO。

 

DeviceProperties: 虚拟机或者老款的电脑需要选择YES才能注入device property,我们选NO。如果你发现你注入device property无效,请选择YES。

 

FirmwareVolume: VAULT相关项,我们选NO。

 

HashServices: VAULT相关项,我们选NO。

 

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

 

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

 

 

2.8.6 Config—–UEFI—-Quirks

 

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

 

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

 

IgnoreInvalidFlexRatio:如果你没有在bios中解锁MSR0x194,一定要选YES。

 

ReleaseUsbOwnership:大部分的主板都有自动释放USB所有权的功能,我们选NO。如果你开机键盘鼠标卡死了,或者USB失灵,试试选Yes。

 

RequestBootVarFallback:一些固件会主动扫描系统启动盘的位置而阻止OC扫描,如果碰到这样的问题选择YES,一般这个BUG在华硕的主板中比较常见。

 

RequestBootVarRouting: 增加”启动磁盘” 的可靠性,这里选择YES。

 

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

 

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

 

2.8.7 Config—–UEFI—-Audio

AudioCodec:填写音频声卡in节点,一般为数字10,20,33之类的。可以用此软件提取。

PinConfigurator2.2.2汉化版

 

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

 

AudioOut:音频声卡out节点,一般为数字10,20,33之类的。

 

AudioSupport:是否开启黑苹果的开机提示音支持。如果你选择YES,后面的内容你必须认真看,不支持DP类的数字音频

 

MinimumVolume:声音音量。范围在0-100之间,默认是20。

 

PlayChime:如果要使用开机duang声音,请选择YES。

 

VolumeAmplifier:按照默认设置。

 

注意,如果你选择开启音频提示音,你需要下载此压缩包,解压后放到OC/目录下,如图。

 

2.8.8 Config—–UEFI—-APFS

EnableJumpstart: 从APFS容器中加载内置APFS驱动,建议开启YES。此选项仍然依据你的Scanpolicy来做出决定,请确保在Scanpolicy中放开APFS格式。

 

GlobalConnect:一些主板需要选择yes才能完全加载APFS,比如HP笔记本。一般我们选择NO。

 

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

 

JumpstartHotPlug:是否加载APFS格式的热插设备,一般我们选择YES。

 

MinDate:加载最低发行的APFS格式。一些旧的apfs可能会危害电脑,我们填0。如果你想加载旧的发行日期的APFS格式硬盘,请填-1。

 

MinVersion:加载最低版本的APFS格式。填0代表从HIGH SIERRA开始加载。填-1代表所有版本,建议填0。

 

2.8.9 Config—–UEFI—-ReservedMemory Properties

此项为保留内存所用。一些硬件会把硬件EFI写进内存过程中占据必要的UEFI运行空间,所以我们可以通过此项来预留内存来保证UEFI的运行。填写方式可以参考小兵的文章。来寻找指定内存的起始位置,以4K为一个节点。

 

一般情况下,此项我们并不需要理会。

2.9 小节

到这里,我们应该可以通过OC正确引导MAC OS了,但是还有很多问题需要去修补,包括模拟nvram,寻找EC控制器,原生的电源管理等。我会在下一个章节写这些东西。

 

 

3.0 OpenCore 完善

 

3.1 模拟NVRAM

对OC而言,NVRAM是非常核心的一环,不管是原生还是模拟的。如果你是原生nvram的主板,请不必理会这章节。这张的主要内容为生成模拟的NVRAM.plist。

 

  • 首先打开我们之前下载好的opencore,进入目录下的Utilities/LogoutHook,并将LogoutHook放入一个安全的位置。这里我推荐将他放到文档目录下。

 

  • 右键finder,前往目录,填/Users, 再点进入以你名字命名的文件夹,既能看到Documents(文档)目录了,把我们的LogoutHook放在里面。

 

  • 打开Terminal (终端),输入一下命令:
 
 
 
 
sudo defaults write com.apple.loginwindow LogoutHook /Users/你的用户名/Documents/LogoutHook/LogoutHook.command
比如:
sudo defaults write com.apple.loginwindow LogoutHook /Users/xjn/Documents/LogoutHook/LogoutHook.command
sudo defaults write com.apple.loginwindow LogoutHook /Users/你的用户名/Documents/LogoutHook/LogoutHook.command 比如: sudo defaults write com.apple.loginwindow LogoutHook /Users/xjn/Documents/LogoutHook/LogoutHook.command
 
sudo defaults write com.apple.loginwindow LogoutHook /Users/你的用户名/Documents/LogoutHook/LogoutHook.command
比如:
sudo defaults write com.apple.loginwindow LogoutHook /Users/xjn/Documents/LogoutHook/LogoutHook.command

 

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

 

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

 

  • 值得一提,nvram.plist在开机的加载需要之前我们要求放入的EmuVariableRuntimeDxe.efi来读取,请确保此补丁存在。

 

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即可。
  • 确保AppleSupportPkg版本为2.1.4以及之后,可以在我这里提供编译好的。
  • 确保config.plist下/Misc/Security/ExposeSensitiveData=3Booter/Quirks/DisableVariableWrite=True/YES ; NVRAM/LegacyEnable=True/YES 
  • 确保文件夹OC/Drivers/下没有VariableRuntimeDxe.efi

 

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

  • 下载LoginHook.command,把它与LogoutHook.command放在一起,并执行: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扫描策略:

## 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
(1)+(2)+(3)+(9)= 0x00000001+0x00000002+0x00000100+0x00080000
 
(1)+(2)+(3)+(9)= 0x00000001+0x00000002+0x00000100+0x00080000

 

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

 

输入:

 
 
 
 
1+2+100+80000=80103
1+2+100+80000=80103
 
1+2+100+80000=80103

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

我们把524547填到scanpolicy中,重启,你就会看到第一个选项就是你的MAC盘了。但如果你还安装了WINDOWS什么的,选项中却没有了,别急,我们现在要把WIN的引导添加到mac的后面去。注:似乎oc还不能引导ubuntu,请用Bios快捷键进入,未证实。

 

3.2.2 第二部分

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

 

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

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


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

 

 

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

 
 
 
 
diskutil list
diskutil list
 
diskutil list

 

我们找到你需要的盘的盘名,比如我的windows在disk0这个位置,而引导WIN的EFI文件夹的盘位是disk0s1。注意,这里我们不讨论Gpt格式的WIN引导位置该在哪里,如果你实在不清楚,可以把disk0s1以及dsik0s2都记录下来。

 

接着输入:

 
 
 
 
diskutil info disk0s1
diskutil info disk0s1
 
diskutil info disk0s1

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

 

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

重启回到mac,加载efi分区,打开刚才的111.txt,我们搜索刚才记录下来的FF555974-AB3F-40B7-8530-AE6462E197CE,我们搜到如下内容,而标注的即是WINDOWS的引导路径:

 

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

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

 

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

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

 

 

3.3 提取DSDT

提取DSDT是我们之后完善系统的必需品,没有他我们无法找到相关的硬件位置,我们可以通过Clover直接提取,这里我们需要一个空的U盘。我的教程是非常偏向小白的,所以这里提取我也会用到windows,以及Diskgenius这个软件,做最简单的示范。

 

  • 插入U盘,我们打开diskgenius,选中我们的U盘,并选择顶部菜单栏的快速分区:

 

  • 严格按照我的图示选择,不要创建esp msr分区,并且分区格式为fat32。

 

  • 格式化完成后,放入我从黑果小兵镜像包提取出来的EFI(点击下载)放进去。这是一个clover引导,但并不能引导你的系统,只能提取DSDT。

 

  • 插上U盘,重启,通过U盘引导,看到Clover界面,我们按F4,这样原始的DSDT文件就收集好了。

 

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

 

 

3.4 加载原生电源管理

在提取dsdt后,我们可以得到相关里硬件名字及目录,这样我们就可以加载原生电源管理。这里非常感谢宪武大大在ssdt这块的付出成果!我们先下载一下宪武大大的OC-SSDT包

以下的内容,你需要文章开始阶段提供下载的MaciASL以及刚才提取的DSDT.aml

 

  • 用MaciASL打开DSDT.aml
  • 搜索你cpu的名字。一般情况下,CPU的名字可能是: PR.CPU0,PR.P000,PR.PR00,SB.CPU0,SB.P000,SB.PR00, SCK0.C000, SCK0.CPU0。请依次搜索直到找到自己的CPU名字,比如我的就是SB.PR00

 

打开宪武大大的OC-SSDT包,到x86目录下,我们看到宪武大大已经把大部分不同名字的CPU的dsl文件都做好了。我的cpu名字叫SB.PR00,我直接打开SSDT-PLUG-_SB.PR00.dsl这个文件,左上角另存为(save as), 其中文件格式(file format)必须选择ACPI Machine Language Binary,文件名字随便写吧,我就叫plug-xcpm.aml,记住后缀为aml。

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

 

 
 
 
 
<dict>
<key>Comment</key>
<string>XCPM</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>plug-xcpm.aml</string>
</dict>
<dict> <key>Comment</key> <string>XCPM</string> <key>Enabled</key> <true/> <key>Path</key> <string>plug-xcpm.aml</string> </dict>
 
<dict>
<key>Comment</key>
<string>XCPM</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>plug-xcpm.aml</string>
</dict>

 

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

 

3.5 加载节能五项

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

直接下载SSDT-PM.aml载入即可。这个里面的内容我不想解释了。

SSDT-PM.aml

 

3.6 Mac OS 10.15下解锁S/L/E目录

在10.15系统中,尽管你已经通过config解锁了SIP,但系统目录仍然需要命令去开启。这里群友bugprogrammer给出了一个一劳永逸的解决方案,请到他的博客中查看方法:解锁macOS10.15的系统分区

 

3.7 关于EC控制器

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

 

3.7.1 禁用EC控制器

之前我在2.1.3章节中提供了重命名这种方式去讲EC0更名为EC,其实这种方法是只适合笔记本的,台式机最好还是禁用EC。

我这里会把笔记本重命名EC以及台式机禁用EC写在一起。

 

打开之前提取出来的DSDT.aml,搜索PNP0C09,这里我搜到我的ec真实名字叫做H_EC,你的可能叫EC0或者别的什么奇怪的名字。

这里我可以看到我的H_EC已经是屏蔽掉的,怎么判定,你看下面有一个Return (Zero),意味着这个部件是不生效的,即禁用。这样的情况我们不需要做任何SSDT去禁用这个真的EC。

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

 

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

SSDT-no-EC.dsl

如果你的EC名字叫H_EC或者别的什么的,你打开这个.dsl文件,改一下图中红线中的字即可。

 

 

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

我们先找到你的EC名字,比如你的EC叫做H_EC,我们打开在线的HEX转换器,输入H_EC,并点击下面的16进制转换,就可以看到转换出来的值是485F4543,把这个值替换到find这个选项卡中就行了。你也会注意到,EC的hex-16进制为45435F5F,刚好是Replace的值。这就是一个非常简单实用的OC重命名。但切记!OC万不得已不要用重命名!笔记本的EC是实在没有办法。

 
 
 
 
Comment: H_EC to EC
Count:0
Enabled:YES
Find:<485F4543>
Limit:0 Mask:<>
OemTable:<>
Replace:<45435F5F>
ReplaceMask:<>
Skip:0
TableLength:0
TableSignature:<>
Comment: H_EC to EC Count:0 Enabled:YES Find:<485F4543> Limit:0 Mask:<> OemTable:<> Replace:<45435F5F> ReplaceMask:<> Skip:0 TableLength:0 TableSignature:<>
 
Comment: H_EC to EC 
Count:0 
Enabled:YES 
Find:<485F4543> 
Limit:0 Mask:<> 
OemTable:<> 
Replace:<45435F5F> 
ReplaceMask:<> 
Skip:0 
TableLength:0 
TableSignature:<>

 

 

3.7.2  USBX供电

开启apple自家的快速充电,这个需要设备支持此功能。你可以比较下面两张图,显然第二张是正确的。

从10.15开始,USB电源的控制被直接分配到了IOResources上面:

我们只需要一个简单的KEXT补丁来加载它

USBPower.kext

请你确定你已经用hackintool定制了你的usb口,并使用了usbports.kext(或者你直接实用USBInjectAll也行)!而不是ssdt类的定制,ssdt类的端口定制并没有对win进行判断请不要用!如何定制自己的usbports.kext,请看黑果小兵的视频教程:https://www.bilibili.com/video/av38860673

下载这个KEXT补丁,你可能需要对补丁进行修改才能用。右键kext显示包内容,一直点进去,直到打开info.plist。我们展开IOKitPersonalities_x86_64,可以看到机型是iMac19,1,请把它改成你正在使用的机型,把补丁放入OC/kexts下,并在config.plist中加载这个补丁,重启即可。

 

3.8 RTC相关问题

在之前的教程里我提供了一个rtc fix的重命名补丁(见2.1.3章节)。对OC而言,重命名就是比较忌讳的,而且我也非常讨厌重命名,所以这个不能忍啊!

因此,我们现在需要通过对RTC进行修复,来抛弃那个RTC重命名补丁。

 

在一些主板中,自带了AWAC部件,这个部件对于RTC来说是互相反锁的,我们必须禁用AWAC才能启动RTC,从而去掉之前使用的重命名补丁。如何去确定你的ACPI中有AWAC,打开IO Registry Explorer,我们查找AppleACPIEventController栏目下有没有AWAC这个部件,下面截图中是有AWAC这种情况:

 

这里我们直接使用宪武大大提供的ssdt,放入acpi目录下并在config中载入即可。(这个包是宪武大大在群里面发的最新版,他的github还未更新此文件,目前是10月28日)。加载此补丁后,你再打开IO Registry Explorer,你会发现awac已经没有了,并且多出了一个rtc部件,表示此补丁生效,并且你也可以删除之前在config里面添加的rtc fix补丁。

SSDT-RTC_Y-AWAC_N.aml

 

3.8.1 华硕X99及X299的RTC问题

首先华硕的主板尽可能不要使用3xxx系列的bios版本,因为更新比较大且无意义,我是在没时间去整理新版本的acpi。

打开你的dsdt,搜索PNP0B00,如果发现内容如下,你需要修改你的rtc。

 
 
 
 
Device (RTC)
{
Name (_HID, EisaId ("PNP0B00")) // _HID: Hardware ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0070, // Range Minimum
0x0070, // Range Maximum
0x01, // Alignment
0x02, // Length
)
IO (Decode16,
0x0074, // Range Minimum
0x0074, // Range Maximum
0x01, // Alignment
0x04, // Length
)
IRQNoFlags ()
{8}
})
}
 
<span style="color: #ff0000;">左下角位置在DSDT>_SB>PC00>LPC0</span>
Device (RTC) { Name (_HID, EisaId ("PNP0B00")) // _HID: Hardware ID Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings { IO (Decode16, 0x0070, // Range Minimum 0x0070, // Range Maximum 0x01, // Alignment 0x02, // Length ) IO (Decode16, 0x0074, // Range Minimum 0x0074, // Range Maximum 0x01, // Alignment 0x04, // Length ) IRQNoFlags () {8} }) } <span style="color: #ff0000;">左下角位置在DSDT>_SB>PC00>LPC0</span>
 
Device (RTC)
{
    Name (_HID, EisaId ("PNP0B00"))  // _HID: Hardware ID
    Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
    {
        IO (Decode16,
            0x0070,             // Range Minimum
            0x0070,             // Range Maximum
            0x01,               // Alignment
            0x02,               // Length
            )
        IO (Decode16,
            0x0074,             // Range Minimum
            0x0074,             // Range Maximum
            0x01,               // Alignment
            0x04,               // Length
            )
        IRQNoFlags ()
            {8}
    })
}

左下角位置在DSDT>_SB>PC00>LPC0

 

一般来说,rtc的资源位置是从0x0070-0x0077。上面的代码中我们可以看到它把rtc资源分割成了两个部分:从0x0070到0x0072之前,以及0x0074到0x0078之前。这意味着0x0072以及0x0073被遗漏了。因此我们需要填补以保证macos 11的运行。我们使用以下补丁(补丁来自OC-Little)

 
 
 
 
DefinitionBlock ("", "SSDT", 2, "ACDT", "RTC0", 0)
{
External (_SB.PCI0.LPCB, DeviceObj)
 
Scope (_SB.PCI0.LPCB)
{
Device (RTC0)
{
Name (_HID, EisaId ("PNP0B00"))
Name (_CRS, ResourceTemplate ()
{
IO (Decode16,
0x0070,
0x0070,
0x01,
0x08,
)
IRQNoFlags ()
{8}
})
Method (_STA, 0, NotSerialized)
{
If (_OSI ("Darwin"))
{
Return (0x0F)
}
Else
{
Return (0)
}
}
}
}
}
DefinitionBlock ("", "SSDT", 2, "ACDT", "RTC0", 0) { External (_SB.PCI0.LPCB, DeviceObj) Scope (_SB.PCI0.LPCB) { Device (RTC0) { Name (_HID, EisaId ("PNP0B00")) Name (_CRS, ResourceTemplate () { IO (Decode16, 0x0070, 0x0070, 0x01, 0x08, ) IRQNoFlags () {8} }) Method (_STA, 0, NotSerialized) { If (_OSI ("Darwin")) { Return (0x0F) } Else { Return (0) } } } } }
 
DefinitionBlock ("", "SSDT", 2, "ACDT", "RTC0", 0)
{
    External (_SB.PCI0.LPCB, DeviceObj)

    Scope (_SB.PCI0.LPCB)
    {
        Device (RTC0)
        {
            Name (_HID, EisaId ("PNP0B00"))
            Name (_CRS, ResourceTemplate ()
            {
                IO (Decode16,
                    0x0070, 
                    0x0070, 
                    0x01, 
                    0x08,
                    )
                IRQNoFlags ()
                    {8}
            })
            Method (_STA, 0, NotSerialized)
            {
                If (_OSI ("Darwin"))
                {
                    Return (0x0F)
                }
                Else
                {
                    Return (0)
                }
            }
        }
    }
}

 

我们根据自己的dsdt来修改,比如我的rtc位置在DSDT>_SB>PC00>LPC0,那么我就把对应的PCI0改为PC00;把LPCB改为LPC0。

已经修改好的在这里下载,具体位置请根据自己主板dsdt对应填入,并放入OC/ACPI下,并在config.plist中加载此ssdt。

 

SSDT-RTC0.aml

 

3.8.2 华硕等一些主板开机卡F1的问题

这篇文章的内容有点零散,我把这部分的内容写到了3.11.1章节。

 

3.9 FCPX加速

FCPX在黑果下主要有两个问题:1.核显无法拉到最满的1.2GHZ,独显尤其是vega芯片的显卡不满载工作,看戏。这里我们主要针对具有核显和独显的机器进行优化(只有核显或者只有独显的不用试了),让核显跑满速度,提升整个FCPX的效率。至于只有独显的机器,我暂时没有找到比较好的方案,这也是我为什么不推荐买带f的cpu,毕竟黑果没有t2芯片,我们需要核显来支撑一些东西。提示:z170,z270,z370因BIOS缺陷可能无法使用。

这本来是一个比较繁琐的教程,多亏了群友@Bugprogrammer将whatevergreen简化了:博主魔改版Whatevergreen解析,还你正常核显频率(1.2g)

这里我已经帮大家编译好了,把原版的whatevergreen替换了就行了。此WhateverGreen.kext保留了AGDP黑屏补丁、开机紫条补丁以及改名补丁,非常精简。

现在看核显(GFX)整个工作效率都能维持在1.2GHZ上,(我这里对CPU做了优化,可能实际没我这么夸张)如图:

 

此方法比较过时了,拉高核心显卡的方法,请使用原版Whatevergreen,并在boot-args中加入igfxfw=2。

 

什么?效率还是不够高?大哥是开影视工作室的吗!?好吧,请看“CPU的变频优化”这章,记得CPU要有水冷哦!

 

3.10 睡眠即醒的相关问题

睡眠即醒很大程度上跟USB的定制相关,一般一个好的USB定制就能解决睡眠即醒的问题。当然系统的更新,MacOS的也在做不断的调整,比如蓝牙不能在HUB下进行内建,比如雷电卡必须将4个端口全部内建才行,等等。甚至有些时候我们都不知道为什么黑果会睡不着,那有没有一个办法让黑果强制睡眠呢?答案是有的。经过我的摸索,有几种方法能达到强制睡眠的效果,只是方法不同而已,但主要围绕的还是0d/6d的数值来做一些工作。那刚好,这些方法涉及了很多黑果领域的一些小技巧,我也顺便展示给大家。

 

注意:0d/6d补丁的本质是阻止一些部件参与唤醒工作,这其中包括了xhc部件,这意味着你无法使用鼠标键盘唤醒,只能用电源键唤醒。

若你有一组除了xhc之外的usb控制器,那把键盘鼠标插在那两个控制器上,这样可以即使用强制睡眠,也仍然可以键盘鼠标唤醒电脑。

3.10.1  方法一:OC版本的0D/06补丁

300系列的主板一般有5个部件是直接参与唤醒工作的,这五个部件分别是XHC(USB控制器)、CNVW(CNVI网卡,如果你的主板自带的话)、GLAN(有线网卡)、XDCI(USB相关)、HDEF(音频)。旧的一些主板可能会有不同的命名,比如XHC有叫EH01,HDEF叫做HDAS等,这里不做讨论。而这些设备往往会直接影响睡眠,比如你输入小兵哥哥经常说的这个命令:

log show --last 1d | grep "Wake reason"

 

我们有时候会看到如下结果:

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

我们打开之前提取的SSDT,随便搜索五大部件中的一个,比如说XDCI:

 

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

那说了这么多,我们到底要做什么呢?我们要做的就是屏蔽掉他们,不让他们参与主机唤醒这个工作。这样可以彻底解决睡眠即醒的问题。

 

首先通过DSDT里确定你的返回值到底是0D还是6D,比如我这里返回的是6D,就记住自己是6D的。照旧打开宪武大大的OC-SSDT包,打开目录下的0D6D补丁包,看到两个plist的更名文件,我是6D的就直接实用6D更名补丁,打开我们看到两个patches,一个是把03(即S3级别电源管理)改名为00(即取消它的参与唤醒工作)。另一个是把04(S4级电源管理)改成00(取消它的参与唤醒工作)。

 

整个过程其实很简单,就是把宪武大大的两个补丁加到自己的CONFIG里去而已。这里主要运用的方法是HOTPATCH的重命名功能。

 

 

3.10.2  方法二:沿用Clover版本的0D/06补丁&展示TgtBridge在OC下的用法

宪武大大做的clover版本的0d/6d补丁,其实没啥必要讲,只是有留言问了tgtbridge在oc下怎么用,那我就展示一下吧。这个补丁原理是一样的,通过重命名的方式改_prw。

直接下载宪武大大的clover hotpatch补丁包,打开“11-1-睡了即醒(0D/6D)补丁”下的plist文件,按照clover的方式,其实把这些补丁直接拖到clover下就行了。那我们拿出一组数据来讲解怎么把它翻译成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_
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_
 
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进行修改
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进行修改
 
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个,那skip填54,意味着跳过前54个,从第55个开始执行。那执行多少次呢?执行一次count就填1;比如你要同时改第55个和56个,那count就填2。说了这么多,我来实操一下吧:

 

打开dsdt,在左下角直接搜索_PRW,就能把整张表的_PRW筛选出来了:

我总共数了一下,一共有56个_PRW。我们再在主内容栏上按command+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
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
 
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.10.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,即屏蔽。
}
}
// // 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,即屏蔽。 } }
 
//
// 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的重命名:

 

3.10.4  方法四:从白果DSDT中学习到的睡眠补丁

最近群友在看白果的dsdt中发现白果的5大部件_PRW值都是(0x69,0x03)。那么何不试试把这5大部件的s4级电源管理都改成s3级呢?实践证明在某一些机器上把04改成03是有效的,方法如下:

 

3.11 OC官方内核补丁集介绍

这里会长期更新OC官方提供的Kernel Patch (KP)补丁。

 

3.11.1 华硕等机型开机卡F1

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

 
 
 
 
Kernel
Patch
Item 0
Base String
Comment String f1 patch (随便填,好记就行)
Count Number 1
Enabled Boolean Yes或者True
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
Kernel Patch Item 0 Base String Comment String f1 patch (随便填,好记就行) Count Number 1 Enabled Boolean Yes或者True 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
 
Kernel
  Patch
     Item 0
         Base            String
         Comment         String         f1 patch (随便填,好记就行)
         Count           Number         1
         Enabled         Boolean        Yes或者True
         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

 

 

如果你使用以上补丁仍然卡F1,你有必要使用RTCMemoryFixup.kext这个补丁对CMOS内存进行修补。

我们将此kext放入OC/Kexts下面,并在config中加载它。

一般来说,我们CMOS的总内存池是从00-FF(这个是16进制,换算成10进制就是从0-255),我们可以通过增加boot-args:rtcfx_exclude=00-FF来完全屏蔽cmos(当然这样写你完全失去了cmos记忆的功能了)

我们需要通过二分法来定位你出错的cmos位置。把00-FF分成两部分,也就是00-7F以及80-FF。我们分别填一次rtcfx_exclude=00-7F以及rtcfx_exclude=80-FF,试试看开机还有没有卡F1。比如说我使用的rtcfx_exclude=80-FF是不卡f1了,那我们继续对80-FF进行拆分为:0x80-0xBF 和 0xC0-0xFF。以此类推,直到你拆分到最后的那一段位置为止。

是不是觉得超级麻烦,我也这么觉得。

 

3.11.2 系统版本10.15.2开始无法自动进入睡眠补丁

在@Bugprogrammer 的qq群中曾推广过使用SSDT-SBUS.aml来解决这个问题,有些人可以自动睡,有些人不行,我也不知道为什么,我甚至不知道为什么新主板要加这个补丁。如果你用了有效那就用吧。

 

除此之外,OC官方推荐开启小憩后可以自动睡眠,但小憩带来的问题是它会自动醒,OC提供如下补丁来解决这个问题:

 
 
 
 
Kernel
Patch
Item 1
Base String __ZN8AppleRTC18setupDateTimeAlarmEPK11RTCDateTime
Comment String RTC Wake(随便填,好记就行)
Count Number 1
Enabled Boolean Yes或者True
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
Kernel Patch Item 1 Base String __ZN8AppleRTC18setupDateTimeAlarmEPK11RTCDateTime Comment String RTC Wake(随便填,好记就行) Count Number 1 Enabled Boolean Yes或者True 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
 
Kernel 
  Patch 
    Item 1 
       Base         String    __ZN8AppleRTC18setupDateTimeAlarmEPK11RTCDateTime 
       Comment      String    RTC Wake(随便填,好记就行) 
       Count        Number    1 
       Enabled      Boolean   Yes或者True 
       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.11.3 关机卡RTC

 
 
 
 
Kernel
Patch
Item 2
Base String __ZN8AppleRTC14updateChecksumEv
Comment String Disable RTC ck poweroff(随便填,好记就行)
Count Number 1
Enabled Boolean Yes或者True
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
Kernel Patch Item 2 Base String __ZN8AppleRTC14updateChecksumEv Comment String Disable RTC ck poweroff(随便填,好记就行) Count Number 1 Enabled Boolean Yes或者True 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
 
Kernel 
   Patch 
      Item 2 
        Base          String       __ZN8AppleRTC14updateChecksumEv
        Comment       String       Disable RTC ck poweroff(随便填,好记就行) 
        Count         Number       1 
        Enabled       Boolean      Yes或者True 
        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.12 300系列主板开启原生NVRAM

OC在0.5.5正式版开始支持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
    # 删除文件 LogoutHook.command sudo rm -rf $(sudo defaults read com.apple.loginwindow LogoutHook) # 清空 LogoutHook 的触发设置 sudo defaults delete com.apple.loginwindow LogoutHook
     
    # 删除文件 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/false
  • NVRAM—LegacyOverwrite 选择no/false
  • Booter—Quirks—-DisableVariableWrite 选择no/false
  • 你也许要打开NVRAM—WriteFlash 选择YES(请尽可能不要选!)

 

 

4.0 OpenCore 进阶

 

 

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

4.1 CPU的变频优化

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

  • 有耐心
  • CFG已经解锁,可以看我博客中apitomemoryfix那篇文章解锁。(这也许不是必要条件
  • 已经通过3.4章节打开原生电源管理。
  • 此章节只适用于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
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
 
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(注意大小写)

 

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

 

  • 直至你填完所有4段变频需求后,便会生成你的变频plist。我们执行以下命令:
 
 
 
 
cp ~/Desktop/cpu/CpuFriendFriend/Results/*.* ~/Desktop/cpu
cp ~/Desktop/cpu/CpuFriendFriend/Results/*.* ~/Desktop/cpu
 
cp ~/Desktop/cpu/CpuFriendFriend/Results/*.* ~/Desktop/cpu

 

  • 我们会在桌面的CPU文件夹中找到你所需要的ResourceConverter.sh以及Mac-xxxxxxx.plist两个文件

 

  • 执行以下命令生成你最终需要的CPUFriendDataProvider.kext
 
 
 
 
cd ~/Desktop/cpu
./ResourceConverter.sh --kext ~/Desktop/cpu/Mac-AA95B1DDAB278B95.plist
cd ~/Desktop/cpu ./ResourceConverter.sh --kext ~/Desktop/cpu/Mac-AA95B1DDAB278B95.plist
 
cd ~/Desktop/cpu
./ResourceConverter.sh --kext ~/Desktop/cpu/Mac-AA95B1DDAB278B95.plist

注意命令行中Mac-AA95B1DDAB278B95.plist,请替换成你自己的文件名,这样我们就可以在桌面的CPU文件夹下拿到CPUFriendDataProvider.kext

 

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

 

  • CPUFriendDataProvider.kextCPUFriend.kext一起放到oc/kexts下,并在config中加载,注意:CPUFriend.kext应该放在CPUFriendDataProvider.kext的前面。

 

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

 

 

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

 

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

4.3