黑苹果(Hackintosh)的折腾时光

前言

距离去年正式开始折腾黑苹果,到现在已有一年半的时间,在这段时间里,从自以为了解系统(曾经安装过很多版本的win和linux)安装,到为了实现一个硬件驱动而焦头烂额,再到站在大牛肩膀上实现自己的驱动,期间感慨良多。虽然在远景上写过几篇帖子,也主要是为自己储备相关的技术素材,方便以后继续黑。于是打算借着简书的markdown功能写一篇总结,也算是markdown的第一次练手吧。

安装macOS的初衷

  • 想自学Swift
  • 对macOS无限好奇
  • macOS有良好的软件体验
  • 能提升程序员的生产力

使用黑苹果的体验

由于花了将近一年的时间实现了几乎所有驱动,才使得现在有了接近完美的macOS体验。

  • 工具软件使用便利快捷键飞起来
  • 与ios高度的协调性
  • apple自己开发的app好用还免费(17年刚免费的三件套)
  • 对游戏的支持不好,才更好集中精力工作学习

macOS工具软件的良好体验,也让我从win系统到软件全盗版的人开始在macOS和ios上付费买软件了(虽然后来购买了正版win8并升级成正版win10,但是macOS已经成主力系统了)。

对于macOS,未来……

如今已经越来越离不开macOS了,也更期待Retina屏幕、触控板,尤其在体验过朋友的触控板,以及自己黑的台式机使用2K屏后,未来也许考虑拥有一台真正的macbook pro吧……


说一说黑苹果的那些坑

展示一下配置

雷 神 G170P 笔 记 本,蓝 天(CLEVO)P170SMA模 具
CPU:Core i7-4710MQ 2.50GHz
主 板:CLEVO P17SM-A
硬 盘:威刚SSD 256GB
内 存:16 GB ( 威 刚 DDR3L 1600MHz )
显 卡:Nvidia GTX970M Intel HD4600
有 线 网 卡:瑞 昱 RTL8168/8111/8112
无 线 网 卡:博通BCM94352HMB(原 装intel网 卡,无 解)
声 卡:Realtek ALC892

深坑警示:

黑苹果终究还是要仿制各种驱动的,如果苹果本身就不支持,再没有硬件厂商的支持,那就意味着再折腾也是徒劳

  • AMD的CPU往往需要破解内核,越新的CPU越难驱动,同时集显也不支持,intel最新CPU则可以修改fakeID来驱动,尽量不选AMD的CPU

  • 由于intel与Nvida的Optimus双显卡切换技术,直接给MXM显卡直接判了死刑,不仅驱动不了,还会带来满频率和能耗的问题。除了个别笔记本厂商良心的提供了独立输出,否则就不要再挣扎了。
    解决办法:
    1.在BIOS层面由SG切换至IGFX(集显独显切换->集显模式)再分配最大共享显存DVMT Pre-Allocated,我设置为1024,个别主板上限设置,无法启动系统的根据情况降低。当然这样的结果会导致安装win也没有独显可用
    2.在修改DSDT和SSDT文件屏蔽独显,win系统中独显不会受到影响

  • intel无线网卡的蓝牙功能可以免驱,但是wifi就不要挣扎了,无解。老老实实换个博通或者usb网卡吧

  • 引导模式主要分为变色龙、clover、Ozmosis,
    变色龙用传统bios引导,mbr硬盘分区。大多用懒人版系统,也用原版,但可调参数较少,对新手不友好。
    四叶草(clover)支持UEFI引导,gpt硬盘分区。原版系统安装,功能强大,适合新手。
    Ozmosis适用于精通DSDT和SSDT修改的高手,刷BIOS来直接引导macOS,难度较高,关键是支持的主板少,现在以华硕和技嘉为主。

我个人尝试了变色龙和四叶草,最后选择了四叶草,因为在前期真的很方便,后期升级系统很方便


黑苹果的过程

对黑苹果有一定了解后,就会发现黑苹果真正最主要的事情就是实现驱动,驱动实现了,安装和升级系统都是简单的事情,下面也主要以调试驱动为主。
零基础的新手推荐先了解一下基础知识(感谢远景论坛和黑苹果乐园)

目录

一.刷入破解版BIOS
二.安装系统
三.调整config
四.屏蔽独显,集显开启QE/CI
五.实现CPU变频
六.定制USB驱动
七.实现蓝牙+WIFI
八.定制声卡驱动
九.实现亮度驱动
十.实现睡眠

一.刷入破解版BIOS

由于雷神原版的BIOS长期不更新,并且隐藏了很多功能,为了方便以后的调试不得已选择破解版的BIOS,由于刷BIOS有风险,需要仔细研究以后再进行操作。在刷机之前,一定要反复确认BIOS是否适用于你的电脑。现在部分新主板支持Q-flash、M-flash刷写BIOS,这种方法简单安全,并且很多有中文提示,就不建议按照以下操作来刷写BIOS了

1.进 入bios ,CMOS设 置 中 禁 用Intel Anti-Theft Technology,如 果 该 项 目 是 可 行 的。
2.制 作 一 个 U盘 启 动 盘(也 就 是PE工 具),把bios解 压 到U盘 中 新 建 的bios文 件 夹 里,方 便dos下 查 找
3.重 启 进 入PE下纯DOS环境下,运 行meset.exe(DOS命 令 不 会 的 百 度 吧),系 统 会 自 动 重 启。
4.运 行 在 纯DOS flashme.bat,系 统 将 自 动 关 机。
5.电 池 和 电 源 适 配 器 断 开5秒,然 后 连 电。
6.在 系 统 上,系 统 会 自 动 重 新 启 动。
7.进 入CMOS设 置 检 查BIOS版 本 和 加 载 系 统 默 认,保 存 更 改 并 重 新 启 动。

之后需要使用集显的,在bios设 置 下 找 到Chipset → Graphics Configuration → Primary Display设 置IGFX(集 显 模 式)
Aperture Size设 置512(因 为 我 的 内 存 是 16G,所 以 选 最 大,根 据 情 况 可 以 适 当 降 低)
DVMT Pre-Allocated设 置1024(我 也 是 选 最 大,根 据 情 况 适 当 降 低)
DVMT Total Gfx Mem设 置MAX

想用DSDT+SSDT屏蔽独显的,Primary Display可以不用管,使用正常的集显独显切换模式就可以,但是需要分配共享内存

二.安装系统

首先clover支持UEFI引导,因此在主板支持的情况下可以将硬盘设置为GUID分区(即GPT)
为了方便分出了两个EFI分区分别引导win10和macOS(macOS安装格式化安装盘时会有几率导致EFI分区被格,分开引导以防万一)


分区展示

之后制作U盘进行安装

三、调整config

clover引导最大的方便之处在于config文件中有大量的参数可以调整,可以解决很多实际问题。下面以我笔记本调整为例进行说明。下面是10.12.6驱动完美后config文件,位于efi分区/EFI/CLOVER中

ACPI
<key>ACPI</key>
    <dict>
        <key>DSDT</key>//DSDT修复补丁
        <dict>
            <key>Debug</key>
            <false/>
            <key>DropOEM_DSM</key>
            <false/>
            <key>Fixes</key>
            <dict>
                <key>FixDarwin_0002</key>//使系统更多设备能在acpi模式下工作
                <true/>
                <key>FixShutdown_0004</key>//修复关机断电问题
                <true/>
            </dict>
            <key>ReuseFFFF</key>
            <false/>
            <key>SlpSmiAtWake</key>//帮助解决UEFI模式下睡眠和关机问题
            <true/>
            <key>SuspendOverride</key>//休眠覆写,影响Fixshutdown补丁
            <true/>
            <key>Patches</key>
            <array>
                <dict>
                    <key>Comment</key>
                    <string>Rename EHC2 to EH02</string>//USB遮盖器(实现USB驱动中详细介绍)
                    <key>Disabled</key>
                    <false/>
                    <key>Find</key>
                    <data>
                    RUhDMg==
                    </data>
                    <key>Replace</key>
                    <data>
                    RUgwMg==
                    </data>
                </dict>
                <dict>
                    <key>Comment</key>
                    <string>Rename EHC1 to EH02</string>(实现USB驱动中详细介绍)
                    <key>Disabled</key>
                    <false/>
                    <key>Find</key>
                    <data>
                    RUhDMQ==
                    </data>
                    <key>Replace</key>
                    <data>
                    RUgwMQ==
                    </data>
                </dict>
                <dict>
                    <key>Comment</key>
                    <string>Rename XHC1 to XHC</string>(实现USB驱动中详细介绍)
                    <key>Disabled</key>
                    <false/>
                    <key>Find</key>
                    <data>
                    WEhDMQ==
                    </data>
                    <key>Replace</key>
                    <data>
                    WEhD
                    </data>
                </dict>
                <dict>
                    <key>Comment</key>
                    <string>change _OSI to XOSI</string>//模拟win系统中USB运行模式
                    <key>Find</key>
                    <data>
                    X09TSQ==
                    </data>
                    <key>Replace</key>
                    <data>
                    WE9TSQ==
                    </data>
                </dict>
            </array>
            <key>ReuseFFFF</key>
            <false/>
        </dict>
        <key>HaltEnabler</key>//解决重启或关机无法断电问题
        <true/>
        <key>SSDT</key>
        <dict>
            <key>DropOem</key>丢弃所有自带表,完全启用自定义ssdt。
            <true/>
            <key>Generate</key>
            <false/>
            <key>PluginType</key>
            <integer>1</integer>
        </dict>
        <key>SortedOrder</key>//按顺序加载SSDT
        <array>
            <string>SSDT.aml</string>
            <string>SSDT-1.aml</string>
            <string>SSDT-2.aml</string>
            <string>SSDT-3.aml</string>
            <string>SSDT-4.aml</string>
            <string>SSDT-5.aml</string>
            <string>SSDT-6.aml</string>
            <string>SSDT-7.aml</string>
            <string>SSDT-8.aml</string>
            <string>SSDT-9.aml</string>
            <string>SSDT-10.aml</string>
            <string>SSDT-11.aml</string>
        </array>
    </dict>
Boot
<key>Boot</key>
    <dict>
        <key>Arguments</key>
        <string>dart=0 nv_disable=1</string>
          //dart=0 修复BIOS开启VT-d虚拟机设置导致的五国错误,未开启可不采用
          //nv_disable=1禁止加载nvidia驱动(在10.13中已经失效),需要加载则添加nvda_drv=1
        <key>Debug</key>
        <false/>

        <key>DefaultVolume</key>
        <string>macOS</string>
          //默认引导盘卷名

        <key>Secure</key>
        <false/>

        <key>Timeout</key>
        <integer>5</integer>
          //clover引导暂停时间

        <key>XMPDetection</key>
        <string>Yes</string>
          //适用于DDR3 XMP内存
    </dict>
Devices
<key>Devices</key>
    <dict>
//这段代码以实现声卡Audio、USB、以及其他设备仿冒使用
//我个人将这些设备功能在DSDT+SSDT中实现,这里没有代码
//实现方法在后面介绍
    </dict>
GUI
<key>GUI</key>
    <dict>
        <key>Language</key>
        <string>zh_CN:0</string>
        //键盘编码zh_CN:0或en:0(中文或英文)
        <key>Mouse</key>
        <dict>
            <key>DoubleClick</key>
            <integer>500</integer>
        //设置鼠标指针双击反应时间

            <key>Enabled</key>
            <false/>
        //关闭引导界面实现鼠标操作(实现需要添加鼠标图标,默认主题都有)
            <key>Mirror</key>
            <false/>
        //关闭鼠标翻转
            <key>Speed</key>
            <integer>8</integer>
        //鼠标速度
        </dict>

        <key>Scan</key>
       //设置clover引导项
        <dict>
            <key>Entries</key>
            <true/>//开启启动项侦测
            <key>Legacy</key>
            <false/>//关闭传统BIOS引导项
            <key>Tool</key>
            <false/>//关闭UEFI Tool项
        </dict>

        <key>ScreenResolution</key>
        <string>1920x1080</string>
       //clover引导界面分辨率1920x1080
        (UEFI方式引导,确认\EFI\Clover\drivers64UEFI\有CsmVideoDxe-64.efi驱动,
           同时在UEFI BIOS里开启CSM。如输入的分辨率无法识别时,需注入EDID.
          此外,对于独立显卡需在Graphics模块下开启以下设置:
          对于ATI /AMD显卡,开启PatchVBios选项
          对于Nvidia显卡,在PatchVBiosBytes选项里注入修改数值)
        
        <key>Theme</key>
        <string>Universe</string>
      //clover引导界面主题
    </dict>
Graphics
<key>Graphics</key>
    <dict>
        <key>CustomEDID</key>
        <data>
        AP///////wANrjUXAAAAADIWAQSVJhV4AtSVo1VQnScPUFQAAAABAQEBAQEB
    AQEBAQEBAQEBtDuASnE4NEAwIDUAftcQAAAYAAAA/gBOMTczSEdFLUUxMQog
        AAAA/gBDTU4KICAgICAgICAgAAAA/gBOMTczSEdFLUUxMQogAOA=
        </data>
        //注入显示屏EDID标识(可以解决显示器黑屏、花屏等问题)
        //方法(转自黑苹果乐园)https://imac.hk/clover-injection-edid.html

        <key>Inject</key>
        <dict>
            <key>ATI</key>
            <false/>
            <key>Intel</key>
            <true/>
        //开启注入集显
            <key>NVidia</key>
            <false/>
        </dict>
        
        <key>InjectEDID</key>
        <true/>
        //开启EDID注入

        <key>LoadVBios</key>
        <true/>

        //开启选择的显卡rom

        <key>NvidiaSingle</key>
        <false/>

        <key>ig-platform-id</key>
        <string>0x0a260006</string>
       //集显ig-platform-id(HD4600对应0x0a260006)
    </dict>
    <key>KernelAndKextPatches</key>
    <dict>
        <key>AppleRTC</key>//防止BIOS重置
        <true/>
        <key>AsusAICPUPM</key>//修复华硕主板电源管理驱动
        <false/>
        <key>Debug</key>
        <false/>
        <key>ForceKextsToLoad</key>
        <array>
            <string>\System\Library\Extensions\IONetworkingFamily.kext</string>
        </array>
        <key>KernelCpu</key>
        <false/>
        <key>KernelHaswellE</key>
        <false/>
        <key>KernelLapic</key>
        <false/>
        <key>KernelPm</key>//因Haswell平台锁定MSR,开启避免无限重启
        <true/>
        <key>KextsToPatch</key>//所有驱动的主要补丁集合
        <array>
            <dict>
                <key>Comment</key>//10.12.5后新亮度补丁
                <string>change F%uT%04x to F%uTxxxx for AppleBacklightInjector.kext (credit RehabMan)</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                RiV1VCUwNHgA
                </data>
                <key>Name</key>
                <string>com.apple.driver.AppleBacklight</string>
                <key>Replace</key>
                <data>
                RiV1VHh4eHgA
                </data>
            </dict>
            <dict>
                <key>Comment</key>//BCM94352HMB网卡补丁
                <string>AirPortBrcm4360</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                gflSqgAAdSk=
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                gflSqgAAZpA=
                </data>
            </dict>
            <dict>
                <key>Comment</key>//BCM94352HMB网卡补丁
                <string>AirPortBrcm4360 Patch 1</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                QTnEdRs=
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                QTnEZpA=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>AirPortBrcm4360 Patch 3</string>//BCM94352HMB网卡补丁
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                g33EBHQG
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                g33EBGaQ
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>AirPort Extreme</string>//BCM94352HMB网卡补丁
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                axAAAHUN
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                axAAAJCQ
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>AirPortBrcm4360 Patch 2</string>//BCM94352HMB网卡补丁
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                QQ+3zTnBdQw=
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                QQ+3zTnBZpA=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Enable 9MB cursor bytes, 0x0a260006</string>
                  //HD4600防花屏补丁
                <key>Find</key>
                <data>
                BgAmCgEDAwMAAAACAAAwAQAAYAA=
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                BgAmCgEDAwMAAAACAAAwAQAAkAA=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>QECI HD4600 Azul (GT2 Mobile to Desktop)</string>
                  //HD4600开启QECI补丁
                <key>Find</key>
                <data>
                hoASBA==
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                hoAWBA==
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                ////HD4600防花屏补丁
                <string>Frame Buffer</string>
                <key>Find</key>
                <data>
                AQMDAwAAAAIAADABAABgAA==
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                AQMDAwAAAAIAADABAACQAA==
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>QECI HD4600 (GT2 Mobile to Desktop)</string>
                //HD4600开启QECI补丁
                <key>Find</key>
                <data>
                hoASBA==
                </data>
                <key>Name</key>
                <string>AppleIntelHD5000Graphics</string>
                <key>Replace</key>
                <data>
                hoAWBA==
                </data>
            </dict>
            <dict>
                <key>Find</key>//SSD开启TRIM
                <data>
                QVBQTEUgU1NEAA==
                </data>
                <key>Name</key>
                <string>IOAHCIBlockStorage</string>
                <key>Replace</key>
                <data>
                AAAAAAAAAAAAAA==
                </data>
            </dict>
            <dict>
                <key>Find</key>//开启USB3.0补丁
                <data>
                g710////EA==
                </data>
                <key>Name</key>
                <string>AppleUSBXHCIPCI</string>
                <key>Replace</key>
                <data>
                g710////EA==
                </data>
            </dict>
            <dict>
                <key>Find</key>
                <data>
                AQAAdSU=
                </data>
                <key>Name</key>
                <string>IOGraphicsFamily</string>
                <key>Replace</key>
                <data>
                AQAA6yU=
                </data>
            </dict>
            <dict>
                <key>Find</key>//蓝牙补丁
                <data>
                SIX/dEdIiwc=
                </data>
                <key>Name</key>
                <string>IOBluetoothFamily</string>
                <key>Replace</key>
                <data>
                Qb4PAAAA60Q=
                </data>
            </dict>
            <dict>
                <key>Name</key>//HD4600防花屏补丁
                    <string>AppleIntelFramebufferAzul</string>
                <key>Comment</key>
                    <string>Isolate IntelAccelerator HD4600 10.12.x</string>
                <key>Find</key>
                    <data>SImLqAAAAA==</data>
                <key>Replace</key>
                    <data>kJCQkJCQkA==</data>
            </dict>
        </array>
    </dict>
SMBIOS
<key>SMBIOS</key>
    <dict>
        <key>BiosReleaseDate</key>
        <string>10/29/13</string>
        <key>BiosVendor</key>
        <string>Apple Inc.</string>
        <key>BiosVersion</key>
        <string>MBP111.88Z.0138.B03.1310291227</string>//MacBookPro11,1的Biosversion
        <key>Board-ID</key>
        <string>Mac-XXXXXXXXXXXXXXX</string>//MacBookPro11,1的ID
        <key>BoardManufacturer</key>
        <string>Apple Inc.</string>
        <key>BoardSerialNumber</key>
        <string>XXXXXXXXXXXXXXXXXX苹果电脑主板MLB序列号</string>
        <key>BoardType</key>
        <integer>10</integer>
        <key>ChassisAssetTag</key>
        <string>MacBook-Aluminum</string>
        <key>ChassisManufacturer</key>
        <string>Apple Inc.</string>
        <key>ChassisType</key>
        <string>08</string>
        <key>Family</key>
        <string>MacBook Pro</string>
        <key>Manufacturer</key>
        <string>Apple Inc.</string>
        <key>Mobile</key>
        <true/>
        <key>ProductName</key>
        <string>MacBookPro11,1</string>
        <key>SmUUID</key>
        <string>XXXXXXXXXXXXXXXXXXX硬件UUID码</string>
        <key>Trust</key>
        <false/>
        <key>Version</key>
        <string>1.0</string>
    </dict>
        <key>SystemParameters</key>//开启 inject System ID,如果不选的话,会导致custom uuid和System-ID数据颠倒
    <dict>
                 <key>CustomUUID</key>
            <string>XXXXXXXXXXXXXXXXXXXROM码</string>
        <key>InjectKexts</key>
            <string>Detect</string>
        </dict>

smbios中有电脑型号以及系统三码的描述(三码用来激活imessage和Facetime)
其中电脑型号对CPU变频有很大的作用,在选定型号之前,需要用Mactracker软件找到与自己CPU型号主频最接近的,为以后CPU变频提供条件。

四.屏蔽独显,集显开启QE/CI

所谓的QE/CI其实通俗的讲就是显卡的正常特效显示,比如苹果系统的水波纹特效,毛玻璃特效。很多朋友能显示但是画面效果不好,多是没有正常驱动集显显存,独显驱动后是不存在这个问题的,这一节就来说明这个问题。
对于无法使用独显的笔记本,需要屏蔽独显来保证集显正常工作以及睡眠功能的实现,同时解决独显满负荷导致能耗问题,其实也是为了保护独显。而那些可以驱动独显的,就简单了。

A卡要么免驱,要么加入对应kext就好了。在最新的驱动方法里想要单卡驱动A卡需要lilu.kext和 WhateverGreen.kext相互配合使用,。(注意:lilu与WhateverGreen的版本要兼容)

N卡老卡有不少免驱,不过自从苹果不再采用N卡后,N卡的驱动可谓是烂的一塌糊涂,现在主要方法是使用lilu.kext和nvidiagraphics.kext,在config中加入代码开启SIP,同时在代码中的Boot->Arguments中加入-lilubetaall,进入系统后安装webdriver

集显,这里的集显全部指intel的集显,AMD无解。集显大部分都比较简单,因为国外大神制作的lilu.kext与IntelGraphicsFixup.kext驱动,再加上集显代码注入和花屏补丁就差不多了。但是我的HD4600移动版很悲剧,需要仿冒HD4600桌面版,花屏还需要修改EDID。

下面着重介绍一下HD4600移动版驱动方法

BIOS调整
共享内存调整最大(部分主板调整最大进入clover黑屏,根据情况调节)
显卡选择可以先选择板载(IGFX),在独显屏蔽后恢复即可

基本的驱动
lilu1.1.7(HD4600移动版不兼容lilu1.2,使用后严重花屏)

IntelGraphicsFixup 1.1.2 (需要兼容lilu1.1.7)
以上两个驱动是更新10.13系统必备
FakePCIID.kext
FakePCIID_Intel_HD_Graphics.kext

然后config中注入仿冒代码

Boot->Arguments
<string> nv_disable=1  -lilubeta -igfxbeta</string>
//禁止驱动N卡(这个只是驱动层面,硬件无效)
//-lilibeta与-igfxbeta是与相关驱动配合使用
<key>Inject</key>
                <dict>
                        <key>Intel</key>
                        <true/>
                </dict>
                <key>ig-platform-id</key>                
                <string>0x0a260006</string>


<key>Devices</key>
        <dict>
                <key>FakeID</key>
                <dict>
                        <key>IntelGFX</key>
                        <string>0x04128086</string>
                </dict>
       </dict>

由于10.12系统与10.13系统花屏补丁不同,下面是10.13集显补丁,需要10.12集显补丁的回到第二节调整config

KernelAndKextPatches->KextsToPatch
<dict>//10.13集显补丁
                <key>Comment</key>
                <string>Enable 9MB cursor bytes, 0x0a260006</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                BgAmCgEDAwMAAAACAAAwAQAAYAA=
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                BgAmCgEDAwMAAAACAAAwAQAAkAA=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Enable 128MB DVMT-prealloc, 48MB framebuffer & cursor bytes, 0x0a260006</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                BgAmCgEDAwMAAAACAAAwAQAAYAA=
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                BgAmCgEDAwMAAAAIAAAAAwAAAAM=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Sierra Boot graphics glitch</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                AQAAdSU=
                </data>
                <key>Name</key>
                <string>IOGraphicsFamily</string>
                <key>Replace</key>
                <data>
                AQAA6yU=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Disable Port 0204</string>
                <key>Disabled</key>
                <true/>
                <key>Find</key>
                <data>
                AgQJAAAEAACHAAAA
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                /wAAAAEAAABAAAAA
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>Isolate IntelAccelerator HD4600 10.12.x</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                SImLqAAAAA==
                </data>
                <key>Name</key>
                <string>AppleIntelFramebufferAzul</string>
                <key>Replace</key>
                <data>
                kJCQkJCQkA==
                </data>
            </dict>
EDID修改

针对10.13的集显花屏问题,部分只需要打上补丁就好了,但是HD4600移动版在开机过程中还是会出现8个苹果的花屏现象。经过不断的测试,花屏问题应该是HD4600仿冒桌面版在第二阶段显卡重置时出现的,原因其实还是HD4600移动版不兼容的问题,但是如果在显卡重置时顺带刷新屏幕,则迫使显卡重新读取EDID输出画面,修改EDID目的就在此。这就需要修改EDID中水平同步宽度sync width,修改需要EDID工具,修改没有什么标准,只要跟之前不同即可,可以自行尝试。

DSDT+SSDT屏蔽独显

独显屏蔽基本策略

在电脑开机时(对应_INI method)和睡眠唤醒时(对应_WAK method)调用关闭Nvidia独显的Method。(对于刚提取的DSDT与SSDT,需要将代码中的GFX0全部替换为IGPU
方法:
一、使用 _DSM + _PS3
二、直接用_OFF(或者SGOF等等,有些机型是不同的,但是直接调用影响CPU变频)

但是我的电脑中DSDT与SSDT存在EC依赖,需要先去掉依赖才能正常屏蔽独显 ,然后
在INI和WAK中调用PINI(调用PS3的方法)

移除SGOF中EC依赖,在REG加入EC依赖(此为补丁,复制到MaciASL的patch中使用)

# DSDT.dsl
into method label _REG parent_hid PNP0C09 code_regex ([\s\S]*) replace_matched
begin
If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1)))\n
{\n
    Store (Zero, \\_SB.PCI0.LPCB.EC.FDAT)\n
    Store (0xBF, \\_SB.PCI0.LPCB.EC.FCMD)\n
}\n
%1
end;

在INI加上External声明。(此为补丁,复制到MaciASL的patch中使用)

into method label _INI insert
begin
External (\_SB_.PCI0.PEG0.PEGP._OFF, MethodObj)\n
_OFF()\n
end;
       
into method label SGOF code_regex .*EC.* removeall_matched;

创建PINI,在INI与WAK中调用(DSDT中修改)

Method (PINI, 0, NotSerialized)
    {
        \_SB.PCI0.PEG0.PEGP._PS3 ()
    }

——————————————————————————————————————————————————————————————————————————————

Method (_WAK, 1, Serialized)  // _WAK: Wake
    {
        PINI ()
        P8XH (One, 0xAB)
        WAK (Arg0)
        ADBG ("_WAK")
……

——————————————————————————————————————————————————————————————————————————————
Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            PINI ()
            OSYS = 0x07D0
            If (CondRefOf (\_OSI, Local0))
            {
                If (_OSI ("Linux"))
                {
                    OSYS = 0x03E8
                }

                If (_OSI ("Windows 2001"))
……

新手容易出现的问题:
提取的DSDT与SSDT是aml格式,需要转换为dsl格式进行修改,尽量不要单独转换,因为之间有关联,单独转换会大量报错,建议使用iasl转换。修改完后,需要重新转换为aml放入EFI/CLOVER/ACPI/patched/中

config->ACPI
<key>SortedOrder</key>
        <array>
            <string>SSDT.aml</string>
            <string>SSDT-1.aml</string>
            <string>SSDT-2.aml</string>
            <string>SSDT-3.aml</string>
            <string>SSDT-4.aml</string>
            <string>SSDT-5.aml</string>
            <string>SSDT-6.aml</string>
            <string>SSDT-7.aml</string>
            <string>SSDT-8.aml</string>
            <string>SSDT-9.aml</string>
            <string>SSDT-10.aml</string>
            <string>SSDT-11.aml</string>//ssdtPRGen.sh生成的SSDT变频放在最后,否则容易失效
        </array>

五.实现CPU变频

对于CPU变频,只要是苹果电脑采用过这一代CPU,找到CPU接近的机型再配合变频SSDT,基本都能实现变频,同时也会加载系统的X86,为以后睡眠打好基础。就变频本身来说,只要频率有高有低,支持睿频即可,无需追求很多档位,白苹果本身就没有那么多档位。而实现变频的目的也是为了降低CPU能耗,保护CPU,同时为睡眠做准备。

一、生成ssdt实现变频
ssdtPRGen.sh生成ssdt变频。(CPU-S中集成有,这里提供最高支持7代,更新的CPU查看ssdtPRGen.sh是否支持并直接使用ssdtPRGen.sh生成)
CPU-S(操作:变频测试—生成SSDT)
ssdtPRGen.sh—具体方法见readme

二、加载X86PlatformPlugin
使用ssdtPRGen.sh生成ssdt变频,基本上都可以实现加载X86PlatformPlugin。
对于部分需要修改X86PlatformPlugin,为部分iMac 机型开启 HWP 或为较新的笔记本机型修改最低频率等情况,只是所有生成的SSDT变频有一定局限。

口袋妖怪heart与vit9696编写的CPUFriend可以免去修改与安装X86PlatformPlugin。使用CPUFriend-master.zip中ResourceConverter.sh生成的ssdt_data、CPUFriendProvider.kext与 CPUFriend.kext配合实现修改与动态注入CPU电源管理数据,CPUFriend-master.zip中的Instructions.md文件说明到,可以将ssdtPRGen.sh生成的ssdt与ssdt_data合并,合并方法见Instructions.md。

(之前误认为这个教程可以实现变频,其实CPUFriend只是实现动态注入电源管理数据,实现X86PlatformPlugin加载,并不直接实现变频)
由于远景论坛不稳定,直接分享出CPUFriend的链接,需要注意的是CPUFriend也需要配合lilu才能驱动,生成的SSDT放入EFI/CLOVER/ACPI/patched/中
CPUFriend.kext
CPUFriend-master.zip
CPUFriend - 动态注入 CPU 电源管理数据 作者:口袋妖怪heart

六.定制USB驱动

放上RehanMan的最新USB驱动,基本上可以驱动时下大部分主板USB,但不一定完美。
RehabMan-USBInjectAll(配合readme中的补丁可以实现USB2.0内建与USB3.0 5G)

由于笔记本不同于台式机,USB接口千奇百怪,因此USB不完美的情况下要自制驱动。附上详细的定制USB驱动的方法

一、修改USB总线名称,躲避内部遮盖器
DSDT里,把EHC1、EHC2、XHC1两个USB2.0、一个USB3.0总线重命名成EH01、EH02、XHC就可以
自己定制遮盖器(即:USBInjectAll.kext)还是要配合dsdt,需要修改dsdt,如果在clover中加入补丁,则需要使用hotpatch的DSDT。

二、探明USB分布,根据分布定制遮盖器
这一步需要判断电脑上有几个USB2.0和USB3.0接口,其中包括蓝牙,触摸板等等,这些可以在windows下检测出来,之后就可以修改自制USB驱动中info,配合DSDT来识别USB接口。超出15个限制的把没用的可以直接删掉,dsdt要删,USBInjectAll.kext中port也要删。最后有没有成功IORegistryExplorer查看一下就知道,我的USB3.0比较特殊,兼容的2.0都在EH01中,因此我将HSP1到HSP15这些都删掉了。

DSDT中USB接口
USBInjectAll.kext中的info文件
EH01总线中各端口信息

info中EH01与EH02代表USB2.0,XHC代表3.0
UsbConnector代表接口类型,0为USB2.0,3为USB3.0,255为特殊(如蓝牙,触摸板,10.12系统后总线类型也为255如PR11)
port-cound为端口总数,port为USB接口所在位置的编号

修改完成后IORegistryExplorer查看USB2.0(左)USB3.0(右)

三、将定制好的USBInjectAll.kext放到S/L/E或者Clover/kests中,不要忘了放入必要的驱动(FakePCIID.kest和FakePCIID_XHCIMux.kext)以及config中添加USB3.0补丁

KernelAndKextPatches->KextsToPatch
<dict>//USB3.0补丁
    <key>Disabled</key>
    <false/>
    <key>Find</key>
    <data>
    g710////EA==
    </data>
    <key>Name</key>
    <string>AppleUSBXHCIPCI</string>
    <key>Replace</key>
    <data>
    g710////EA==
    </data>
</dict>

<dict>//10.13解除15限制补丁
    <key>Comment</key>
    <string>change 15 port limit to 26 in XHCI kext</string>
    <key>Disabled</key>
    <false/>
    <key>Find</key>
    <data>
    g32MEA==
    </data>
    <key>MatchOS</key>
    <string>10.13.x</string>
    <key>Name</key>
    <string>com.apple.driver.usb.AppleUSBXHCIPCI</string>
    <key>Replace</key>
    <data>
    g32MGw==
    </data>
</dict>

注意:
1.笔记本大多没有超过15个接口,因此15个限制补丁打不打意义不大。
2.最新USBinjectAll驱动也可以这样修改其中的info,但是需要配合lilu
3.偶尔一个总线失效的,可以在dsdt中打入IRQ补丁,影响到睡眠的可以打入0x0D(笔记本)或0x6D(台式机)补丁

七.实现蓝牙+WIFI

蓝牙与WIFI的实现主要是驱动+补丁,最新出现了hotpatch方法,加入SSDT-ARP。
博通BCM94352HMB的驱动方法:

基本驱动:
BrcmFirmwareRepo.kext
BrcmPatchRAM.kext
FakePCIID_BCM57XX_as_BCM57765.kext
FakePCIID_Broadcom_WiFi.kext
FakePCIID.kext

hotpatch方法基本驱动:
AirportBrcmFixup.kext
Lilu.kext
将SSDT-ARP.aml放入CLOVER/ACPI/patched,onfig.plist的SortedOrder加入SSDT-ARP.aml

蓝牙在USB驱动正常后,只需要添加补丁即可驱动

10.13补丁(10.12补丁见第二节调整config)

            <dict>//蓝牙补丁
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                SIX/dEdIiwc=
                </data>
                <key>Name</key>
                <string>IOBluetoothFamily</string>
                <key>Replace</key>
                <data>
                Qb4PAAAA60Q=
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>10.11-BCM94352-5GHz-US-FCC-dv</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                QYP8/3QsSA==
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                ZscGVVPrKw==
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>AirPort Extreme</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                axAAAHUN
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                axAAAJCQ
                </data>
            </dict>
            <dict>
                <key>Comment</key>
                <string>AirPortBrcm4360 - fcvo</string>
                <key>Disabled</key>
                <false/>
                <key>Find</key>
                <data>
                gflSqgAAdSk=
                </data>
                <key>Name</key>
                <string>AirPortBrcm4360</string>
                <key>Replace</key>
                <data>
                gflSqgAAZpA=
                </data>
            </dict>

八.定制声卡驱动

完全的自制声卡驱动相当的复杂,但是制作好以后,升级系统不容易失效,重新制作也很简单。这里不详细介绍,贴上我自己的帖子和我的文章,然后结合最新方法进行重新制作可以支持10.13.
远景帖:(适用于10.12和13)ALC892的经验之谈,简化大神教程帮助喜欢动手仿冒的朋友
简书文章:定制仿冒声卡驱动完整教程(ALC892为例)

完全自制声卡驱动,主要是要制作4个文件:
1.Platforms.xml.zlib(节点文件)
2.layout1.xml.zlib(layoutID)
3.Applealc-master—>resources—>alc892—>info.Plist
(描述声卡以及对layout和Platforms文件位置、id的说明)
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist

(包含codecID和layoutID相关值)

制作好这4个文件即可使用Applealc-master生成Applealc.kext,最新的方法只是需要在Applealc-master根目录添加版本对应的lilu.kext,驱动时也需要配合lilu.kext。
对于声卡没有高要求的,可以使用最新的Applealc-master直接生成Applealc.kext,现在集成度很高,大部分都可以正常使用

九.实现亮度驱动

在10.12.4以前,亮度需要驱动与ssdt配合使用。在此之后,驱动+ssdt+补丁才可以使用。附上我的帖子针对10.12.4、10.12.5、10.12.6系统。
完美解决10.12.4 HD4600亮度驱动失效(适用于10.13)
在10.13系统中,稍有改变(只针对HD4600)

1.利用Patches.xcodeproj,生成ssdt-pnlf.aml,位置到build目录下。
2.config.plist中SortedOrder中加入ssdt-pnlf.aml,将ssdt-pnlf.aml放入efi—>clover—>apci—>patch中
3.在10.12时需要将AppleBacklightInjector.kext安装到S/L/E中,重建缓存,efi的kext中无效。但是在10.13时直接放在efi—>clover—>kexts—>10.13中即可
4.需要DSDT、SSDT打GFX0改为IGPU补丁,在clover中使用GFX0改为IGPU补丁也可以
5.sortedorder中需要在DSDT、SSDT之后,在变频SSDT之前
(Patches.xcodeproj见帖子中RehabMan_backlight.zip)

亮度补丁

<dict>
<key>Comment</key>
<string>change F%uT%04x to F%uTxxxx for AppleBacklightInjector.kext (credit RehabMan)</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
RiV1VCUwNHgA
</data>
<key>Name</key>
<string>com.apple.driver.AppleBacklight</string>
<key>Replace</key>
<data>
RiV1VHh4eHgA
</data>
</dict>

十.实现睡眠

睡眠问题可以说是黑苹果里的终极问题,因为涉及问题包括方方面面,这里只聊聊我自己的心得。

1、USB不完善不行
很多睡眠问题都是USB的事情,比如一睡即醒,唤醒黑屏等等,这就需要完善USB驱动,USB所有接口必须内建,同时DSDT中有几个关于USB影响睡眠的补丁。这里自制USB驱动就很有优势。

2、亮度问题
Haswell以前的CPU不需要专门设置保存亮度,因此这些CPU唤醒黑屏的几率不高,之后的CPU需要专门设置亮度保存,所以,驱动亮度还是不够的。

3、CPU变频必不可少
CPU变频本身就为睡眠时CPU降频提供了前提,同时实现变频,则会加载X86PlatformPlugin、X86PlatformShim这两个驱动,这两个驱动也同样是实现睡眠的前提。

4、独显屏蔽
对于不能使用独显的笔记本,睡眠如果不能屏蔽独显,独显满载工作,即使睡眠正常也没有意义。屏蔽独显,让笔记本在睡眠状态下能够待机更久。

5、关机断电
关机断电是很普遍的问题,现在clover越来越完善了,只需要添加补丁
1、FixDarwin_0002(修复关机断电问题)
2、SlpSmiAtWake(帮助解决UEFI模式下睡眠和关机问题)
3、SuspendOverride(休眠覆写,影响Fixshutdown补丁)

6、睡眠模式
在10.12.6中我采用睡眠模式3就可睡眠
0—老式睡眠模式
睡眠期间内存加电,禁用安全睡眠,超快速唤醒
1—休眠模式
内存中的数据将写入到磁盘上,系统在所谓的“睡眠”时将完全关闭
因为需要读取先前保存在硬盘中的内存数据,所以唤醒较慢
3—睡眠模式
睡眠过程中,内存保持通电状态,同时内存数据在进入睡眠模式之前同样要写入到硬盘
万一没有外接电源并且电池也完全没电了的话,系统将自动进入休眠模式
还有其他的模式,可以自行尝试

7、相关驱动加载
笔记本睡眠主要4个驱动X86PlatformPlugin、X86PlatformShim、AppleLPC、AppleHPET
其中X86PlatformPlugin、X86PlatformShim通过实现变频来加载。AppleLPC通过修改DSDT或者使用SSDT-LPC或者直接修改fakesma中的info,方法很多,也很方便。AppleHPET这个大多都是原生驱动,貌似很少有驱动不了的。

结语

以上是进行了大量学习后的成果,从开始折腾黑苹果,到接近无语恨不得马上买个白苹果,再到把自己的笔记本完善的越来越好,这一路真的学到了很多的东西,也从来没有像现在这么了解一个操作系统的结构,同时自学swift,越来越喜欢macOS和IOS。而国外的高手也让黑苹果越来越容易,越来越方便,就比如hotpatch。要知道当初学习修改DSDT与SSDT时相当崩溃。总之,结果是好的,再也不会回到win中时不时手痒玩游戏了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容