将操作系统类型设置为Windows8.1/10是因为部分主板在Other模式下会将系统认作是Windows7从而禁用UEFI的某些功能并开启CSM,200系及以后的主板理论上不存在这个问题
打开下载好的最新版OC,把Doc文件夹下面的Sample.plist改名为config.plist,并把此文件移动到EFI目录下面。打开EFI--Kexts,我们把常用的一些kexts先放进去,一般情况下你需要放如下Kexts:
一些机型用了1820A,1560,1830等网卡,需要自己放对应驱动;有线螃蟹卡也自己放一下驱动;笔记本类需要更多传感器的,请自行补齐VirtualSMC的那些传感器补丁
打开EFI--Drives,里面的驱动介绍如下:
这章会把config的项目分开来,内容繁琐,为了让小白明白各个选项的用途。当然有能力的人可以直接看我最前面的几个链接来配置config.plist。我这里强制要求你使用Propertree来编辑Config.plist,其他的任何软件我都不建议使用。
ACPI包括了四个部分:Add,Block,Patch,Quirks。这里我们先把root下面的几条#WARNING删除,这几条没有实际意义。
这部分主要填写我们使用的SSDT以及DSDT文件,如果没有请把0-8的ssdt全部删除。如果你有修改的SSDT或者DSDT文件,请先将文件放入EFI/OC/ACPI下。
因为我使用雷电卡,我需要添加两条关于雷电卡的ssdt文件:
Item0CommentStringThunderbolt3-DTGP//填一个你自己能辨别的名字,方便知道是啥EnableBooleanYES//表示加载此SSDT,反之NO则为不加载PathStringSSDT-DTGP.aml//为你ssdt放在EFI/OC/ACPI下的文件名,必须一致Item1CommentStringThunderbolt3EnableBooleanYESPathStringSSDT-TB3.aml2.1.2Config–ACPI–Delete这个目录下是禁用一些SSDT/DSDT,没什么用,我把下面的item全都删了。
这里我们需要填写一下热补丁。
Comment:EC0toECCount:0Enabled:YESFind:<4543305F>Limit:0Mask:<>OemTable:<>Replace:<45435F5F>ReplaceMask:<>Skip:0TableLength:0TableSignature:<>一些主板的EC控制器名字可能会叫H_EC等,请自行提取DSDT并搜索PNP0C09,来获取EC控制器的名字,这些内容会在第三章中写出。
Comment:RTCfixCount:0Enabled:YESFind:
此项与OpenRuntime.efi有关。在aptiomemoryfix停更后,此补丁已经更名为Openruntime,并将一些功能与OC合并、模块化。对于无法原生nvram的主板来说,这里的选项需要格外注意。当然我也会把像300/400系列、x299、C246、C422这样支持原生nvram的选择方法一并写进去。
KASLR是更加高效的内存注入方式,但不代表每台机器都能使用这种方案,这里我提供两种关于内存的设置:
此项是用来注入你的设备的,主要是显卡和声卡两部分。同样你也可以定制一些设备到你的关于本机--系统报告--PCI列表中,尽管没有多大的意义。
这里首先我们需要确认自己的声卡驱动已经被加载,终端下输入:
kextstat|grep-E"AppleHDA|AppleALC|Lilu"我们会得到被加载的驱动,请确保as.vit9696.Lilu;as.vit9696.AppleALC;com.apple.driver.AppleHDAController;com.apple.driver.AppleHDA已经被加载。
~/desktop/gfxutil-fHDEF//一般来说我们在使用Applealc后,板载声卡的部件名都叫HDEF我们输入后会得到声卡的PCI路径,比如我输出的就是:
00:1f.38086: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。
比如我的CodecID为283906408,声卡型号ALCS1220A,对应1,2,3,5,7,11,13,15,16,27,28,29,34的layoutID。我们需要一个个测试过去,选定自己能用的。这里我们选择7这个ID进行测试,将7转化成16进制格式为07,后面为了满足格式要求添加6个0,则为07000000,将这个值替换刚才预先填的01000000中;如果我们测试ID为27,27的16进制为1b,补上6个0则为1b000000。
打开PciRoot(0x0)/Pci(0x2,0x0)这项,此项为驱动核心显卡。驱动核心显卡我们要分情况讨论:
8代和9代的核显ID为:3E9b0007,deviceID为3e9b0000,但是我们需要符合苹果的倒叙格式填入:
这种情况我们一般把核心显卡作为加速用,而显示则用独立显卡。这样,我们填一个作为加速用的核显ID即可了,8代9代10代除外的cpu请搜索黑果小兵的博客:
AAPL,ig-platform-iddata<0300983e>2.3.3Delete这里是禁用一些设备的,我们按默认就行了,不需要任何修改。
这里默认情况下很多我们需要的补丁已经被加载里面了,但是enabled那块我们要手动改成yes去开启它,把一些不用的删了:
Item0BundlePathStringLilu.kext//kext的名字CommentString//你自己填一个注释,可以不填EnabledBooleanYES//启动此补丁,反之则为关闭ExecutablePathStringContents/MacOS/Lilu//通过右键kext显示包内容查找lilu运行文件的真正路径MaxKernelString//此补丁支持的最大系统版本,填19为10.15,18位10.14;我们一般情况下留空MinKernelString//此补丁支持的最小系统版本PlistPathStringContents/Info.plist//kext的plist位置,可以右键kext显示包内容查找正确路径..............................................Item7BundlePathStringUSBPorts.kextCommentStringEnabledBooleanYESExecutablePathString//一些没有执行文件的kext不需要填写MaxKernelStringMinKernelStringPlistPathStringContents/Info.plist..............................................2.4.2Config–Kernel–Block禁用一些kexts,这里好像没啥用,不用理会。
此选项帮助IvyBridge和一些不受支持的CPU加载电源管理的,我们这里不做此方面讨论。所有选项按默认即可。
特殊情况下我们需要强制加载某一些kext来达到某种目的,一般我们不理会此项。
这里都是一些开机引导类的设置。
用于覆盖Windowsbootmgfw.efi的位置以便识别Windows引导项,OpenCore和Windows的引导文件在同一硬盘的同一个ESP分区下使用
▼Misc
是否开启debug模式,这里我们暂时不需要,全部按默认设置。
这里是帮助我们添加一些你希望的引导路径,这个会在之后的进阶教程中讲,这里暂时略过不填写。
用于运行OC调试工具,例如验证CFG锁(VerifyMsrE2)
这里是模拟NVRAM的变量设置,大部分默认已经填好,我们只需添加两个变量即可。
打开7C436110-AB2A-4BBB-A880-FE41995C9F82这一栏,添加两个item如下:
item11Stringefi-boot-deviceitem12Stringefi-boot-device-data2.6.4Config–NVRAM–LegacyEnable如果你的主板不支持原生NVRAM,请一定要选择YES,反之则选择NO。
对模拟nvram用户来说,将nvram.plist写入硬件,我认为不管是原生nvram还是模拟nvram,都选择NO。
这里我们填合适的机型。对于最近一代的主板来说,一般的原则,只有核显的机器我们选Macmini8,1;只有独显的机器我们选择iMacPro1,1;有核显和独显的我们选择iMac19,1。笔记本请按照对应的cpu型号来选择。
是否自动补全系统信息。这里我选YES,不重要的信息让它自动填。
自定义内存选项,请选择NO
这里是我们需要填写的三码部分。
将OpenCore包下Utilities/macserial程序放到桌面,在终端下输入以下命令
~/desktop/macserial--modeliMacPro1,1//你也可以换成你想要的机型比如iMac19.1输入后你回获得一些序列号以及主板主板序列号,请自己选用一组,填写到MLB以及SystemSerialNumber后重启。
重启后,请再在终端下输入:
此项的内容是帮助你在开机阶段驱动板载音频,此项对DP等数字音频无效。
是否加载补丁,我们选择YES。
Driversitem0String0....................MemoryAllocation.efi1....................OpenRuntime.efi2....................HFSPlus.efi3....................OpenCanopy.efi2.8.5Config–UEFI–Input此选项是原生Apple开机热键的选项,需要配合我们之前设置的PollAppleHotKeys=yes一起用。下面的设置完全按照默认情况就行了。
如果你是华硕的z87或者z97,你需要打开PointerSupport这个选项。
对OC而言,NVRAM是非常核心的一环,不管是原生还是模拟的。如果你是原生nvram的主板,请不必理会这章节。
这章节的主要内容为非原生NVRAM模拟生成nvram.plist。
例如(不要直接复制这条命令行)mv/Users/xjn/Downloads/OpenCore-0.6.2-RELEASE/Utilities/LogoutHook/LogoutHook.command~/.LogoutHook.commandsudodefaultswritecom.apple.loginwindowLogoutHook/Users/$USER/.LogoutHook.command3.2建立自己的开机选择系统目录因此部分需求太小众且繁琐,我折叠起来了,点击展开3.3提取DSDT尽管提取原始DSDT的方法非常多,我认为CLOVER的提取方法是最方便并且靠谱的。我们需要一个空的U盘或者空的ESP分区,我的教程是非常偏向小白的,所以这里提取我也会用到windows,以及Diskgenius这个软件,做最简单的示范。
提取DSDT后使用MaciASL打开,搜索你CPU的名字。一般情况下,CPU的名字可能是:PR.CPU0,PR.P000,PR.PR00,SB.CPU0,SB.P000,SB.PR00,SCK0.C000,SCK0.CPU0。请依次搜索直到找到自己的CPU名字,比如我的就是SCK0.C000
将plug-xcpm.aml放入EFI/OC/ACPI下,并在config.plist中添加加载此aml文件:
ACPIAddItem0CommentStringplug-xcpmEnableBooleanYESPathStringplug-xcpm.aml加载后,重启,并清理一次nvram,我们看到偏好设置–节能中,原生电源管理已经被加载了。
节能五项是白果台式机中,系统偏好设置—节能中的五个选项。在加载原生电源管理后,一般有4项节能出现,而第五项“断电后重启”这项还需要加载PPMC以及LPCB下的PMCR才能出现。虽然没啥鸟用,但对于强迫者而言,少一个一定很难受吧。如果你是笔记本,不需要看这章,白果笔记本本身没有。如果你没有机械硬盘,也不会出现Putharddiskstosleepwhenpossible。
bugprogrammer给出了一个一劳永逸的解决方案:
EC控制器是电脑自带的一个叫embeddedcontroller的部件。在10.15的系统环境中,笔记本电脑必须重命名原来的EC,而一些台式机主板则需要禁用。下面我会分开来讲解如何禁用EC、如何加载USB电源管理支持。
打开之前提取出来的DSDT.aml,搜索PNP0C09,这里我搜到我的EC真实名字叫做H_EC,你的可能叫EC0或者别的什么奇怪的名字。
这里我可以看到我的H_EC已经是屏蔽掉的,怎么判定,你看下面有一个Return(Zero),意味着这个部件是不生效的,即禁用。这样的情况我们不需要做任何SSDT去禁用这个真的EC。
Scope(_SB.PCI0.LPCB){Device(H_EC){Name(_HID,EisaId("PNP0C09")/*EmbeddedControllerDevice*/)//_HID:HardwareIDName(_UID,One)//_UID:UniqueIDMethod(_STA,0,NotSerialized)//_STA:Status{^^^GFX0.CLID=0x03Return(Zero)}那么什么样的情况是需要我们去屏蔽的呢?我发现基本上华硕的台式机主板都会启用这个EC控制器,下面代码是华硕主板的EC部件,搜索PNP0C09,我们看到这种情况下,这个叫EC0的EC控制器是开启的,注意他没有return(Zero)这个语句,我们需要通过SSDT去屏蔽它。
Device(EC0){Name(_HID,EisaId("PNP0C09")/*EmbeddedControllerDevice*/)//_HID:HardwareIDName(_CRS,ResourceTemplate()//_CRS:CurrentResourceSettings{IO(Decode16,0x0062,//RangeMinimum0x0062,//RangeMaximum0x00,//Alignment0x01,//Length)IO(Decode16,0x0066,//RangeMinimum0x0066,//RangeMaximum0x00,//Alignment0x01,//Length)})这里我提供了一个禁用EC的补丁,请直接下载,打开后左上角另存为(saveas),其中文件格式(fileformat)必须选择ACPIMachineLanguageBinary,文件名字随便写吧,我就叫ssdt-no-EC.aml,记住后缀为.aml。将ssdt-no-EC.aml放入EFI/OC/ACPI目录下,并在config.plist中加载此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来完成全部操作。
这部分内容是仿冒EC,注意不是每一个DSDT的路径都在SB.PCI0.LPCB,请搜索0x001F0000来确定实际位置和名称。比如我的主板是在SB.PC00.LPC0。
0d/6d补丁是阻止一些部件参与唤醒工作,这其中包括了xhc部件,意味着你无法使用鼠标键盘唤醒,只能用电源键唤醒。但若你有一组除了xhc之外的usb控制器,那把键盘鼠标插在那两个控制器上,可以在使用强制睡眠的情况下用键盘鼠标唤醒电脑。
logshow--last1d|grep"Wakereason"我们会看到类似的输出结果
2020-10-3103:35:45.196371+08000x74Default0x000kernel:(AppleACPIPlatform)AppleACPIPlatformPowerWakereason:XDCICNVW2020-10-3103:35:45.196373+08000x74Default0x000kernel:(AppleACPIPlatform)AppleACPIPlatformPowerWakereason:XDCICNVW那么即是XDCICNVW导致了睡眠出现了问题。于是,我们用几种方法去屏蔽或者说修改这些部件,来达到电脑正常睡眠的效果。
主要是看上图中XDCI下的_PRW属性值,可以直接看到Return的值为GPRW(0x6D,0x04)。其中6D这个数值看主板而定,有些主板叫做0D,而后面04这个值的含义为S4级别的电源管理,即休眠甚至关机情况下的唤醒;有些后面的数值是03,代表着S3级电源管理。这个我打一个大家比较熟悉的例子,GLAN这个网卡部件的PRW值也是0x04,为什么要是04呢?因为这样我们可以使用远程通过网络启动主机功能。
上一步中已经确认了你的主板是0D还是06,打开OClittle的06/0D补丁,选择合适自己主板的补丁集,比如我的是Name-6D更名.plist。将补丁抄入自己的config.plist后重启生效。
全局重命名会导致其他系统无法通过OC引导开机,不建议使用。
宪武大大做的clover版本的0d/6d补丁,其实没啥必要讲,只是有留言问了tgtbridge在oc下怎么用,那我就展示一下吧。这个补丁原理是一样的,通过重命名的方式改_prw。
CommentStringXHC:_PRWtoXPRWDisabledBooleanTrue//此补丁并未生效,这里要改成false才会生效Find5F505257//hex转text的含义即是:_PRWReplace58505257//hex转text的含义即是:XPRWTgtBridge5848435F//hex转text的含义即是:XHC_这组改名是对XHC下的PRW改名为xprw,这样的话,之前prw下的(0x6D,0x04)即不生效了。而指定xhc的方法即是使用了tgtbridge,因为整张dsdt上有几十上百个_PRW,你必须通过tgtbridge来指定到底是哪一个部件的_PRW。
那么OC到底怎么使用tgtbridge来特定某一部件下的内容重命名呢?我们先把上面一段clover的补丁转换成oc的版本先吧:
CommentStringXHC:_PRWtoXPRWCountNumber//需要重点解释EnabledBooleanTrue//表示应用此补丁,不应用选FalseFindData5F505257//hex转text的含义即是:_PRWLimitNumber0//这个按默认即可不去管他MaskData<>//这个按默认即可不去管他OemTableIdData<>//这个按默认即可不去管他ReplaceData58505257//hex转text的含义即是:XPRWReplaceMaskData<>//这个按默认即可不去管他SkipNumber//需要重点解释TableLengthNumber0//这个按默认即可不去管他TableSignatureData44534454//hex转text的含义即是:DSDT,这里按默认即可,代表对dsdt进行修改这里就是一个还没全部翻译好的oc版改名xhc的prw。那么如何定位xhc下的_prw呢,主要是填写Count和Skip。其实oc的tgtbridge是通过一个个数过去来定位具体哪一个位置的。比如xhc的prw是整张dsdt里面的第55个,那skip填54,意味着跳过前54个,从第55个开始执行。那执行多少次呢?执行一次count就填1;比如你要同时改第55个和56个,那count就填2。说了这么多,我来实操一下吧:
我总共数了一下,一共有56个_PRW。我们再在主内容栏上按+F搜索xhc,直接找到xhc的_PRW,刚好我们看到我的xhc实在整张表的倒数第4个,也就是正数第53个:
那么我们就可以补充完整张表了:
CommentStringXHC:_PRWtoXPRWCountNumber1EnabledBooleanTrueFindData5F505257LimitNumber0MaskData<>OemTableIdData<>ReplaceData58505257ReplaceMaskData<>SkipNumber52TableLengthNumber0TableSignatureData44534454如果你想第53、54、55个都改掉,那count就写3,意味着顺序执行3次。好了,就这样,有问题留言。
oc不提倡用户直接全局重命名,如果真的要用重命名,也一定是搭配ssdt去做重命名,所以这个方法也是宪武大大和我最推荐的一种方法。
打开宪武大大的OC-SSDT包,找到0D/6D文件夹,打开SSDT-GPRW.dsl。
同时,我们需要在ACPI--Patch下增加一条全局重命名来配合此SSDT。
Comment:GPRWtoXPRWCount:0Enabled:YESFind:<4750525702>Limit:0Mask:<>OemTable:<>Replace:<5850525702>ReplaceMask:<>Skip:0TableLength:0TableSignature:<>3.8OC官方内核补丁集介绍这里会长期更新OC官方提供的KernelPatch。
KernelPatchItem0BaseStringCommentStringf1patch(随便填,好记就行)CountNumber1EnabledBooleanYesFindData75330fb7IdentifierStringcom.apple.driver.AppleRTCLimitNumber0MaskDataMaxKernelStringMinKernelStringReplaceDataeb330fb7ReplaceMaskDataSkipNumber03.8.2关机卡RTCKernelPatchItem2BaseString__ZN8AppleRTC14updateChecksumEvCommentStringDisableRTCckpoweroff(随便填,好记就行)CountNumber1EnabledBooleanYesFindDataIdentifierStringcom.apple.driver.AppleRTCLimitNumber0MaskDataMaxKernelStringMinKernelStringReplaceDatac3ReplaceMaskDataSkipNumber03.9300系列主板开启原生NVRAM打开你的DSDT,搜索001F0000,确定自己的
左上角另存为(saveas),其中文件格式(fileformat)必须选择ACPIMachineLanguageBinary,文件名字随便写吧,我就叫ssdt-pmc.aml,记住后缀为aml。记得将ssdt-pmc.aml放入EFI/OC/ACPI目录下,并在config.plist中添加加载此aml文件。
#删除文件LogoutHook.commandsudorm-rf$(sudodefaultsreadcom.apple.loginwindowLogoutHook)#清空LogoutHook的触发设置sudodefaultsdeletecom.apple.loginwindowLogoutHook3.10AcidantheraDebug错误调试此博客有很多疏漏,你可能会碰到很多奇怪的问题而无法解决。一般来说,一张开机-v的截图只能解决一些很简单的问题,一些帮助者可能通过经验判断你的错误所在,但这样的图无法定位错误,而Acidanthera提供了非常非常强大的排错功能,我们可以利用它收集错误报告,在网络上获得帮助。
如果我们需要debug报告,我们需要将所有的Acidanthera的kext以及OCbootloader替换成debug版本,所有的debug版本都会在github中提供。我们下载debug版本的Opencore,替换:
修改config.plist中的如下内容:
在Config.plist/NVRAM/7C436110-AB2A-4BBB-A880-FE41995C9F82/boot-args栏目中增加
保存后重启,你会得到:
如果无法进入系统,则只需要第一份日志。
你可以通过这两份日志快速定位错误,或者在网路上寻求帮助。
以下内容对你正常使用黑苹果已经无关了,如果你追求更好的黑果表现,可以看下去,但这部分内容也需要你自己有更好的能力与耐心。如果你不具备足够的条件,我不建议你看下去;如果你的失误导致硬件的损坏,我也不会、也没能力负责。
此章节对你的要求会相对高一点,并且请你具备如下条件:
在Intel四代之后,苹果引入了新的内核级电源管理方式:XCPM(XNUCPUPowerManagement),这种新的管理方式可以高效地管理电源及变频。同时,苹果也推出了HWP(HardWarecontrolledPerformancestates),这种技术可以快速根据特定程序的需求,作出变频转换。我们这个章节,本质上就是在加载XCPM的情况下,调整HWP来优化CPU的变频。
同时我要说的是,我在论坛上看到很多所谓的“变频”,有的甚至加载了50多个档位的变频,其实这种是完全没有意义的。我认为,变频是能在你需要的高频的时候快速进入高频状态,在关闭程序后又能很快回到低档位,换句话说,其实只需要三个档位就高了:睿频档,正常频率,以及低频档。