🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] **** # 【指南】 给笔记本的 DSDT/SSDTs 打补丁 英文原文:[Patching LAPTOP DSDT/SSDTs](https://www.tonymacx86.com/threads/guide-patching-laptop-dsdt-ssdts.152573/) # 开始学习SSDT/DSDT 常见论坛上的大神们谈论 DSDT、SSDT、AML、DSL 不明觉厉,曾遍寻论坛求解释未果。 我更喜欢通过 DSDT 进行设备注入的**SSDT**,因为**更新 BIOS,移动 PCI 卡或添加/移除 PCI卡可能需要您提取和编辑新的DSDT**。 很多人都知道使用 DSDT 补丁可以开双核,但 DSDT 的功能不仅仅如此,除了开双核,还可以可以修复 ACPI 缺陷(不需要 Disabler.kext ,原版cpupowermanagement 正常使用),RTC,HPET 缺陷(原版 kext 正常工作),显卡(代替 efistring),声卡(只是代替了 HDAEnabler.kext ),网卡(包括 TimeMachine 问题),此外还可以解决其他很多奇奇怪怪的问题,因此建议尽可能使用 DSDT 补丁。 # ACPI ACPI 是 Hewlett-Packard, Intel, Microsoft, Phoenix 和 Toshiba 共同制定的一个开放的行业规范。是 The Advanced Configuration and Power Interface 的缩写,也就是“电源管理模式和配置管理的接口规范”。从名字可以看出主要是“电源管理”和“配置管理”。是 BIOS 的一个高级功能模块。 它帮助操作系统合理控制和分配计算机硬件设备的电量,有 了ACPI,操作系统可以根据设备实际情况,根据需要把不同的硬件设备关闭。如Win7或者Win8系统,系统睡眠时,系统把当前信息储存在内存中,只保留内存等几个关键部件硬件的通电,使计算机处在高度节电状态。当然这只是它功能中的很少一部分。 它主要涵盖的功能包括: 1. System power management(系统电源管理) 2. Device power management(设备电源管理) 3. Processor power management(处理器电源管理) 4. Device and processor performance management(设备及处理器性能管理) 5. Configuration / Plug and Play(配置/即插即用) 6. System Events(系统事件) 7. Battery management(电池管理) 8. Thermal management(温度管理) 9. Embedded Controller(嵌入式控制器) 10. SMBus Controller(SMBus控制器) 在计算机应用平台,ACPI 越来越重要。ACPI由很多表组成,包括:RSDP,SDTH,RSDT,FADT,FACS,**DSDT**,**SSDT**,MADT,SBST,XSDT,ECDT,SLIT,SRAT。其中**DSDT**就是它的一个重要的描述表。 DSDT 包含了所有和基本系统(basesystem)不同的设备的信息,basesystem 每台机器都是一样的,这个是在 acpispec 里指定的,但是每台机器都是不相同的,所以不相同的设备大都是由 DSDT 表来描述。它包含了很多AML代码。大多数 BIOS 是针对 windows 开发的,而 windows 自己也不完全遵循 acpi 规范,所以因为 BIOS 的 bug,这些代码本身可能有错,导致其他的系统,如 linux,mac os 出错。 **Mac OS X不完整支持ACPI规范,仅支持它的子集DSDT**。 [[指南] Intel IGPU HDMI/DP audio (Sandy/Ivy/Haswell/Broadwell/Skylake)](%5B%E6%8C%87%E5%8D%97%5DIntelIGPUHDMI-DPaudioSandy-Ivy-Haswell-Broadwell-Skylake.md)我们可以手动修复这些bug**使之兼容MAC系统**。 DSDT在bios里是以编译后的`aml`文件存在,需要把它解出来,反编译成`aml`代码形式(dsl文件,文本文件),代码修改完毕再重新编译,替换掉bios里原来的dsdt表。 **对于非苹果电脑,要使用上尽可能完美的OS X系统,可以说修改DSDT是最有效的方法。** # DSDT DSDT 是 The Differentiated System Description Table 的简写。字面上就可以知道它是一个描述系统不同信息的表。它包含了所有除基本系统以外所有不同设备的信息,也就是**每台计算机设备的基本系统是相同的,而不相同的设备用 DSDT 来描述**。 DSDT 表代码为 ACPI Machine Language (AML)。 用户通过修改DSDT可以得到更好的硬件支持,最简单的理解就是DSDT是描述硬件的。 修改 DSDT 的主要目的就是让 mac系统识别存在这个硬件并告诉 mac 系统你的硬件位置,以便让 mac 系统内置的驱动来驱动硬件工作。 修改 DSDT 的基本过程: 提取 bios 的 AML 文件,反编译为 dsl text 文件,修改完毕后,编译到 Aml,然后替换 BIOS 中的 DSDT。 # 基本步骤 如果下面选项会对原始ACPI产生显著的改变(尤其是系统内存区域),你需要重新提取,重新打补丁: - 更新 BIOS - 更改 BIOS 选项 - 更改硬件和内存设置。 使用补丁修改 DSDT/SSDT 包含了以下步骤: - 提取原始ACPI文件 - 反编译原始文件 - 分析并筛选这些原始文件 - 使用补丁修改 - 编译并保存,再放到启动引导的特定目录 ## 提取原始ACPI文件(推荐) 使用 Clover 的 `F4`进行提取,因为易于提取,并且易于比较 `ACPI/origin` 和 `ACPI/patch`(用于故障排除)。 所有BIOS实现都向操作系统提供 ACPI 文件。 因此,在任何操作系统上,您都可以提取它们以便以后进行修补。 因此,可以在 Linux,OS X,Windows甚至 Clover 引导加载程序中进行提取。 在Clover主引导程序屏幕上,您可以按**F4**,Clover 会将本地ACPI文件转储到`EFI/Clover/ACPI/origin`。 进入系统后对它们以进行反汇编和修补。 注意,有的 BIOS 可能按`F4` 键没用,而需要 `Fn+F4`,所以,如果不确定的话,`F4` 和 `Fn+F4` 都按一次。提取的时候,你不会看到任何是否完成的提示,只是会因为正在写文件而出现一点延迟现象,你可以等待5s。如果是用Clover的USB设备(U盘、硬盘)启动的,文件会被提取到USB设备,这样会感到比较明显的延迟。 有时候,Clover 提取的 SSDT 可能会重复。重复的文件,会影响到反编译。如果你反编译的时候看到了这样的提示信息(duplicate definitions),则需要分析所有 SSDT 以消除重复的文件。通过查看文件大小很容易看出哪些是重复的。大小相同的文件可能是重复的。 您可以在终端中查看所有SSDT的文件大小(以字节为单位): ``` ls -l SSDT*.aml ``` ## 在Linux提取(可以顺便提取声卡codec) 在Linux系统里,可以直接在系统分区里找到原始ACPI文件。你可以在 `/sys/firmware/acpi/tables` 和 `/sys/firmware/acpi/tables/dynamic` 看到。可以简单地用命令进行拷贝。 Linux系统不需要安装,做一个启动U盘(推荐 Ubuntu Desktop 版本)就可以了:http://www.ubuntu.com/download/desktop/create-a-usb-stick-on-windows 打开Linux的终端输入: ~~~ sudo cp -R /sys/firmware/acpi/tables DEST ~~~ **注意: 用FAT32格式的USB设备(U盘、硬盘)的挂载点的路径,替换命令里的 `DEST`** (Xee:出现文件权限问题,可以先拷到桌面,在从桌面复制到U盘) 你的U盘或硬盘需要是FAT32格式的。FAT32格式可以避免出现文件权限问题,因为FAT32格式在Linux系统里没有文件权限的问题。用于替换DEST的 自动挂载的USB设备的名字,取决于你的Linux版本和它的启动方式。你可以在终端输入`mount`命令,来查看当前的挂载点。或者,在图形界面,把鼠标移到文件管理器上相应的USB设备名上。 Mac下提取也是非常容易的。比如使用:`DSDT Editor` 等工具。 ## 准备反汇编工具 > [Compiling and decompiling ACPI Tables](https://khronokernel.github.io/Getting-Started-With-ACPI/Manual/compile.html) > [https://github.com/acidanthera/MaciASL/releases](https://github.com/acidanthera/MaciASL/releases) 要正确反汇编解压缩的文件,您需要从终端运行的 iasl 编译器。 您将需要最近的 `iasl` 版本才能正确反汇编它们。这里有一个[适当的版本](https://bitbucket.org/RehabMan/acpica/downloads/)。将 iasl 二进制文件复制到你的路径(例如`/usr/bin`)是一个好主意,所以很容易从终端访问。 例如,如果您将其下载到 `~/Downloads/iasl.zip`,则可以在终端中提取并复制它: ``` cd ~/Downloads unzip iasl.zip sudo cp iasl /usr/bin ``` ### 从github上构建最新的`iasl` 你也可以从我的github构建我的 iasl 的最新版本。iasl 的最新版本最终将在 bitbucket 链接上提供,但对于那些想要处于“作死边缘”的用户,您可以自己构建。最新的版本总是倾向于有实验性的和没有经过良好测试的代码。 假设你已经安装了 Xcode: ``` mkdir ~/Projects && cd ~/Projects git clone https://github.com/RehabMan/Intel-iasl.git iasl.git cd iasl.git ``` 然后build它: ``` make ``` 在这一点上,你可以安装它: ``` sudo make install ``` 假设您已将 `MaciASL.app` 安装到 `/Applications`,那么您可以在 `MaciASL`中使用新版本(您刚刚构建并安装到 `/usr/bin`): 代码(文本): ``` sudo cp /usr/bin/iasl /Applications/MaciASL.app/Contents/MacOS/iasl62 ``` ## 反编译ACPI文件 虽然提取到的 aml 文件可以用 MaciASL 直接打开,但不建议这样做。用MaciASL直接打开aml文件,是软件在做对打开的这个文件的单独反编译。然而,ACPI文件之间有着紧密的联系,只对一个文件单独反编译,得到的文件会包含许多难于修复的错误。 所以,最好的方法是,**使用iasl编译器,同时反编译所有文件**。要做的准备工作有,新建一个文件夹用于存放所有DSDT和SSDT文件,并重命名所有文件,例如加上`.aml`扩展名。 然后在OS X Terminal中反汇编: ``` cd "to directory where you placed all SSDT/DSDT" iasl -da -dl DSDT.aml SSDT*.aml ``` 对于较新的ACPI集(通常\[但不总是\]与Skylake和以后),不需要 `-da`,因为它们已经嵌入了外部操作码: ``` cd "to directory where you placed all SSDT/DSDT" iasl -dl DSDT.aml SSDT*.aml ``` **注意**:**不要用`-da`命令去反编译 DSDT和 SSDT 以外的 ACPI文件,那将是无效的(Xee:所以还是把多余的文件先清掉!)**。 **注意**:请阅读下面有关`refs.txt`的部分。使用`refs.txt`需要更多的努力,但可以消除许多常见的错误。 反编译成功后,你将得到 所有文件的 dsl 形式,修改就是使用 dsl 文件进行。修改好 dsl 文件后,使用 MaciASL 的另存为,并选择 文件格式 "ACPI Machine Language Binary” ,再在文件名那里加上 .aml 扩展名,保存。编译保存为aml之后,把它们放到引导程序规定的加载目录(变色龙 `/Extra`,`Clover /EFI/Clover/ACPI/patched`)。保存好 dsl 文件,以防将来需要应用更多的修补程序。 **让我再次陈述它(因为很多人会出现这样问题):如果您直接在MaciASL 中打开一个AML文件,然后单击Compile,你做错了。你们要记住,不要左耳朵进右耳朵出!!!!** 该规则的唯一例外是使用最新的iasl编译的AML文件,该文件中嵌入了外部操作码。这包括您自己用当前的iasl和原始设备制造商(通常是Skylake或更高版本)编译的本地ACPI编译的文件。 注意:使用 ACPI 6.1 的新工具在处理使用新版iasl编译的AML文件时更加健壮。ACPI 6.1为编译器添加了一个功能,将外部引用的操作码添加到AML二进制文件中。ACPI 解释器会忽略这些数据,但这些数据对于反汇编程序(也只有 iasl 的 ACPI 6.1 版本)非常有用,可以从独立的AML中创建更好的反汇编。因此,您可能会发现使用最新工具重新编译的 AML 文件可能会更可靠地直接打开。当然,现在的 OEM ACPI DSDT和 SSDT 目前还没有未使用新工具,所以如本指南中所述,您仍然必须首先使用选项 `-da`将所有 DSDT / SSDT 反编译。 留意一下 苹果的Snow Leopard 系统的相关实现:不幸的是,10.6.8的`ACPI`太过时了,以至于它用外部操作码(the external opcode)会阻塞AMLs。如果您计划在 Snow Leopard 上使用您的`ACPI`文件,那么您就可以在编译您的AML文件时需要对 `iasl` 使用无证的 `-oe` 选项。当您从MaciASL编译(另存为)时,这个选项是不设置的,所以您需要在终端中编译您的文件。“`-oe`”选项会禁止在输出AML文件中生成外部的操作码。 # 使用 `refs.txt` 反汇编 有时还有其他未解决的外部因素(任何文件中都未定义的符号)。 iasl 反汇编程序将尝试猜测参数的数量,但通常猜测不正确。 您可以通过在文本文件中提供外部声明来更正它。 SGPO,ECRD,ECWT 和 MMTB 是一些常见的未解析符号。 下面的 `refs.txt` 内容有一些常见的(但不太常见)缺少的符号(正如该贴中有些用户所报告的),反汇编程序容易使它们混淆。 首先在您的 `DSDT/SSDT` 文件所在的目录中创建 `refs.txt`: ``` External(MDBG, MethodObj, 1) External(_GPE.MMTB, MethodObj, 0) External(_SB.PCI0.LPCB.H_EC.ECWT, MethodObj, 2) External(_SB.PCI0.LPCB.H_EC.ECRD, MethodObj, 1) External(_SB.PCI0.LPCB.H_EC.ECMD, MethodObj, 1) External(_SB.PCI0.PEG0.PEGP.SGPO, MethodObj, 2) External(_SB.PCI0.GFX0.DD02._BCM, MethodObj, 1) External(_SB.PCI0.SAT0.SDSM, MethodObj, 4) External(_GPE.VHOV, MethodObj, 3) External(_SB.PCI0.XHC.RHUB.TPLD, MethodObj, 2) ``` 注意:创建 `refs.txt` 的一个方便的方法是在终端中使用 `pbpaste` 命令。复制上面的文本到剪贴板(我假设你知道如何做到这一点),然后: 代码(文本): ``` pbpaste>refs.txt /* 利用了mac上的两个命令行工具,pbcopy 可以把管道输入复制到剪贴板,pbpaste 可以把剪贴板内容导出 */ ``` 这将在您当前的目录中创建 `refs.txt`。 然后在反汇编过程中使用它: 代码(文本): ``` iasl -da -dl -fe refs.txt DSDT.aml SSDT*.aml ``` ~~较早版本的`iasl`反汇编程序会将这些外部声明*放在所有其他外部声明之前*。这也是一个糟糕的选择。大多数情况下,您需要移动它们,以便它们遵循其他外部声明而不是前面的声明。这将是显而易见的,因为你会从外部声明,从 `refs.txt` 插入后面的错误。在目前支持ACPI 6.1的`iasl`中,这个bug已经修复了。~~ # 分析原生的ACPI 在反编译之后,您可能想要查看每个 `dsl` 文件的内容。使用来熟悉每个内容。某些修补取决于内容。 例如,如果要修补以禁用离散图形设备,则可能正在寻找与该设备相关的 `_OFF` 方法(此过程在单独的指南中介绍,在本指南的后面部分进行了介绍)。 除了给独显打禁用补丁之外,没有必要对所有的 SSDTs 进行打补丁,因为在[Clover笔记本指南](https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/)中已经完成了常见的重命名操作。重命名最好通过 `config.plist/ACPI/DSDT/Patches` 进行,因为它和手动进行操作相比,可以避免很多的错误。 在大多数情况下,您应该只关注 `DSDT.aml`。 # 筛选ACPI文件 对于较旧的计算机(Sandy Bridge和之前),与 CPU 相关的 SSDT 可能会导致问题。如果是这种情况(您已经不得不使用备用的DropTables,`DropOem = true`或`DropSSDT = Yes`),那么您不应该在 `ACPI/patch` 中包含这样的 SSDT。 我喜欢把所有的 SSDT 按原来的顺序包括在内,除非已知会导致问题。请记住,SSDT 不需要任何补丁,不需要重新编译。您可以直接使用未经修改的原始 AML 文件。 注意:使用当前的[ Clover 笔记本指南](https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/),您需要应用于SSDT的大多数修补程序已经在 `config.plist/ACPI/DSDT/Patches`(IGPU重命名,IMEI重命名,HDAS重命名,EH0x重命名等)中完成。因此,您不大可能需要修补 SSDT。相反,您可以从`ACPI/patched`中省略所有这些元素,并使 `DropOem=false`。在大多数情况下,您只需要修补`DSDT.aml`。 注:从Clover 转储的“x” SSDTs文件并同样地 从 Linux 转储的动态子目录地 SSDTs 动态加载和永远不会包含在 `ACPI/patched`(这些 SSDTs 和来自SystemMemory 的 ACPI 按需加载)。 所以...假设你认为你可能需要做一些过滤... 在你成功的反汇编你的文件后,看看每一个试图确定SSDT的目的。如果它与 CPU 相关并且已知会引起问题,就把它拖到其它地方(也可以直接删除)并且不要通过引导加载程序注入含有它的设置。在大多数情况下,和 CPU 相关的 SSDT 包含了 `Scope _PR.CPUx` 这样的声明。 以下是常见的SSDT的特点和功能: - CPU相关:上面已经讨论过。包括除非知道会导致问题的。 - SATA:可以留,也可以不留,自己决定就好。 - PTID:一般对苹果系统来说,是没用的。也许这个文件还会有很多错误。一种比较少的应用情况是,在这个文件里,可以找到 读取风扇转速,温度,或者其它系统状态 的线索。 - IAOE:如果存在这个文件,通常来讲,它会在DSDT里的 `_PTS` 和 `_WAK` 方法被调用。如果删除这个文件,就会影响到睡眠。 - GFX0:通常包含了 Device GFX0 的SSDT,是和 集成显卡 相关的。亮度补丁就是针对这样的文件的。老的笔记本(Haswell以前的),GFX0一般是定义在DSDT里。对于较新的Haswell笔记本电脑,通常在SSDT中定义(尽管它也可以在DSDT中)。 - PEGP:包含PEGP的文件,一般是和 独显 和 双显卡切换 有关。有时候不只有一个这样的SSDT,为了实现 屏蔽独显 等功能,你需要保留所有包含PEGP的SSDT,并对它们做一些修改。 我们需要弄清楚,每个SSDT的大概是做什么的,哪些需要删除,哪些需要不做修改地保留,哪些需要修改。 # 修复错误 即使同时反编译所有文件(使用 `iasl` 的 `-da` 参数),还是难免存在错误。反编译后的文件之所以还会有错误,是因为一直以来`iasl` 编译器的版本都在更新、iasl 的实现细节变化了、不同的电脑与系统环境。存在这些错误的原因可能是(Rehabman认为),里面调用到的一些方法,实际上是Windows内部实现的(例如 `MMTB`方法和`MDBG`方法)。实际也有这样的情况,ACPI 文件的代码原本就存在缺陷或者某些代码本来就是无效的(有时候很难区分)。 所以..在确定你需要哪些文件之后,你必须对它们进行补丁,以便它们无错地编译。在我的记本 MaciASL 补丁存储库中有许多这种错误的常见补丁。 * MaciASL:https://github.com/RehabMan/OS-X-MaciASL-patchmatic * 笔记本电脑补丁:https://github.com/RehabMan/Laptop-DSDT-Patch 注意:以上补丁源里的补丁,没有在 DSDT Editor 软件里测试过。DSDT Editor 软件存在着很多bug,内置的 `iasl` 编译器也很老了。这个就不要问我了。 在看别人的项目页面的时候,都请仔细阅读作者提供的README,到正确的地址下载软件,学习配置 MaciASL。修复语法错误的补丁的名字,以`[syn]`开头。例如,对于一些比较老的电脑,提供了"`Fix _PLD Buffer/Package Error`", "`Fix TNOT Error`", 和 "`Fix FPED Parse Error`”补丁。为了确定你需要用哪个补丁,需要看 编译结果 窗口给出的 提示信息,再定位到提示的行,查看错误行前后都有什么样的代码。您也可以尝试应用修补程序,以查看它是否进行了更改,如 MaciASL 的“Preview 预览”窗口中所示。 如果您不熟悉每种错误类型,则可能需要进行一些试验和尝试/错误。 对于一些错误,你可以简单地删除造成错误的那行代码来解决。当然,这要取决于这一行代码对于功能的实现,是否是必需的。例如,对于由External语句造成的错误,一般可以删除那行代码以修复错误。如果需要,你自己可以做一个删除这样的错误行代码的补丁。 学习一下 ACPI 规范 和 具有一些编程经验,有助于处理 DSDT 和 SSDT。 你的目标是让每个 `.dsl` 文件无误地编译( warnings/remarks/optimizations 都不用管)。一旦你有没有错误编译的文件,你可以继续打补丁,以解决你的 OS X 安装问题。 具有多余/不必要的外部声明是很常见的。 例如,我查看的最近的 DSDT 有很多 `Name already exists in scope` 错误​​。 对于DTSE,DTS1,DTS2,DTS4,BNUM,PDTS,PKGA,SPST。 解决方法是简单地注释掉相关的外部声明。 例如: ``` // External (DTS1, FieldUnitObj) // (from opcode) // External (DTS2, FieldUnitObj) // (from opcode) // External (DTS3, FieldUnitObj) // (from opcode) // External (DTS4, FieldUnitObj) // (from opcode) // External (DTSE, FieldUnitObj) // (from opcode) ... and so on ... ``` 注意:最近 DSDT 中的一个常见错误是 `ECRW`(在 `_CRS` 方法中)。这是 `iasl` 错误导致的一个非常常见的错误。我不打算为它添加一个 MaciASL 补丁,因为它最终将由 Intel 修复(这是一种复原)。 容易修复。 替换下面的: ``` If (LEqual (PM6H, One)) { CreateBitField (BUF0, \_SB.PCI0._Y0C._RW, ECRW) // _RW_: Read-Write Status Store (Zero, ECRW (If (PM0H) { CreateDWordField (BUF0, \_SB.PCI0._Y0D._LEN, F0LN) // _LEN: Length Store (Zero, F0LN) })) } ``` 使用下面的: ``` If (LEqual (PM6H, One)) { CreateBitField (BUF0, \_SB.PCI0._Y0C._RW, ECRW) // _RW_: Read-Write Status Store (Zero, ECRW) } If (PM0H) { CreateDWordField (BUF0, \_SB.PCI0._Y0D._LEN, F0LN) // _LEN: Length Store (Zero, F0LN) } ``` # 常见的补丁 一般,你需要先弄清自己的需求,再根据需求选择要用的补丁。但也有一些补丁是通用的,并且这些补丁一般不会造成什么问题。它们在Rehabman的[补丁源 repo ](https://github.com/RehabMan/Laptop-DSDT-Patch/blob/master/.maciasl)里,这里列出: ~~~ "Fix _WAK Arg0 v2" "HPET Fix" "SMBUS Fix" "IRQ Fix" "RTC Fix" "OS Check Fix" "Fix Mutex with non-zero SyncLevel" "Fix PNOT/PPNT"(只在丢弃与CPU相关的SSDT时使用) "Add IMEI" (如果DSDT或SSDT已经有 IMEI/HECI/MEI 设备,请勿使用) ~~~ 注意:您使用的 `OS Check Fix` 补丁与笔记本电脑随附的 Window s版本或当前使用的 Windows 版本无关。 注意:如果包含了所有 OEM SSDTs,请不要使用 `Fix PNOT/PPNT` 补丁。它仅适用于您省略与OEM CPU相关的 SSDTs 的情况。 USB 补丁可以用来修复“睡眠自动唤醒”,即在睡眠开始之后几秒钟内没有唤醒的情况下,笔记本电脑将不会睡眠。 这些补丁可用于注入 USB 的电源属性: `6-series USB` `7-series/8-series USB` 使用`AppleUSBXHCI.kext`的“睡眠自动唤醒”的替代解决方案是使用“`USB _PRW 0x6D`(即时唤醒)”。您应该检查您的DSDT,以确定相关的`_PRW`方法返回什么,以确定补丁适合您的DSDT。在repo中也提供了“`USB _PRW 0x0D`(即时唤醒”)(0x0D和0x6D都是`XHC/EHC/HDEF`从`_PRW`返回的常见值)。 `_PRW` 修补程序可用于修复"即时唤醒(instant wake)",在这种情况下,笔记本电脑将在睡眠开始后的几秒钟内,笔记本电脑无法入睡。只使用“`USB _PRW 0x6D (instant wake)`”或者“`USB _PRW 0x0D (instant wake)`”,因为它与DSDT中的现有代码相关(也请注意适用于Skylake和更高版本的这些补丁的特定版本)。 您应该检查您的DSDT,以确定相关的 `_PRW`方法返回什么,以确保该补丁适合您的DSDT。“`USB _PRW 0x0D (instant wake)`”(`0x0D` 和 `0x6D`是`XHC/EHC/HDEF`从`_PRW`返回的常见值) USB3 Mutliplex补丁,有助于加载`AppleUSBXHCI.kext`(原生USB3.0驱动),于是就不需要安装第三方的`GenericUSBXCHI.kext`了。这个补丁是基于Mieze的发现而制作的。大部分DSDT需要对它做一些修改,才能使用(不然可能会提示有错误)。例如,对于惠普的Probook,Rehabman制作了这个补丁的修改版本。联想u310/u410可以直接使用这个补丁:"`7-series USB3 Multiplex`” 如果您具有Haswell CPU / 8系列芯片组,并且 `AppleLPC.kext` (电源管理的一种)未加载,则应使用此修补程序注入兼容的ID,以允许其加载: “`Haswell LPC`” 如果您具有Skylake CPU / 100系列芯片组,并且 `AppleLPC.kext` 未加载,则应使用此修补程序注入兼容的ID,以允许其加载: “`Skylake LPC`” 注意:Skylake及更高版本可能不需要AppleLPC。 关于重命名的注意事项:重命名必须是“平衡的”。 重命名对象以更好地匹配OS X的期望是很常见的(例如,将“将`GFX0`重命名为`IGPU`”以进行正确的IGPU电源管理)。 在这种情况下,所有引用该名称的DSDT / SSDT也必须重命名。 这就是为什么最好使用 `config.plist / ACPI / DSDT / Patches` 完成重命名的原因。 注意重复标识符:您必须确保您的补丁文件不包含重复标识符。一个常见的例子是在一个SSDT中添加一个`_DSM`方法到指定的路径,在那里,OEM已经在另一个SSDT的路径上定义了一个`_DSM`。为了避免这个问题,您可以使用“`Remove _DSM methods`”补丁作为您对所有 DSDT/SSDT 的第一个补丁。也可以使用“`Rename _DSM methods to XDSM`”也是可以的(有时“`Remove _DSM methods`”在`MaciASL`中暴露一个缺陷)。 # 问题具体修补 电池状态:http://www.tonymacx86.com/yosemite-laptop-support/116102-guide-how-patch-dsdt-working-battery-status.html 中文翻译:http://bbs.pcbeta.com/viewthread-1521462-1-1.html 背光控制:http://www.tonymacx86.com/yosemite-laptop-support/152659-patching-dsdt-ssdt-laptop-backlight-control.html 中文翻译:http://bbs.pcbeta.com/viewthread-1571456-1-1.html 禁用 NVidia / Radeon 独立显卡 :http://www.tonymacx86.com/yosemite-laptop-support/163772-guide-disabling-discrete-graphics-dual-gpu-laptops.html 当你在看针对某个特定型号的笔记本教程的时候,作者都会介绍用了哪些补丁,或者直接提供下载。你能容易的看出来,他们的补丁和Rehabman的补丁,在语法上是相似的。(例如这样的语法:'into_all method label FOO code_regex xxyy removeall_matched;')。这些补丁语句需要粘贴到MaciASL的补丁窗口,再应用。 如果你对制作补丁有兴趣,可以去看有关MaciASL修补程序语法的文档:http://sourceforge.net/p/maciasl/wiki/Patching%20Syntax%20Grammar/ 注意:在许多情况下,DSDT补丁与其他kexts,已打补丁的kexts或 Clover `config.plist`补丁一起结合使用,在系统的kext被加载时,这些补丁会对这些系统的kext进行打补丁。 # 打过补丁的AppleHDA 的相关补丁(仿冒声卡驱动相关的补丁) 有两个和仿冒声卡驱动相关的补丁,需要和仿冒的声卡kext一起使用: `Audio Layout 12` (根据实际情况,自己修改 layout-id,例如把 12 改成 28 等) `IRQ Fix`(解决需要`-f`才能加载声卡驱动的问题) 注意,您必须有一个与您的编解码器匹配的AppleHDA,并且必须确定选择了哪个layouid-id。对于已修补的AppleHDA的创建者来说,layout-id是一个任意的选择。 要查看别人修改的AppleHDA用的`layout-id`是哪个值,首先,你需要知道自己声卡的`codec id`的十进制形式(例如,`0x10ec0269 = 283902569`)。 再去查看 `AppleHDA.kext/Contents/PlugIns/AppleHDAHardwareConfigDriver.kext/Contents/Info.plist`,查看HDAConfigDefault 节点下面的`codec id`(可能有许多条目在一个草率修补的AppleHDA或只有一个)。 和你的`codec id`匹配的那组里,LayoutID的值,就是你需要的 layout id 值。 有的驱动修改者,同一个`codec id`可能会对应多个`layout-id`,选择一个你需要的 id 注入。 # 保存由引导装载程序装载的文件 为了使用你修改、编译好的DSDT/SSDT,你需要把它们放到Clover引导能加载它们的目录。每种引导的加载目录是唯一的,且对文件的命名要求也不同。 如果用 **MaciASL** 保存,另存为的时候,文件格式一定要选择"ACPI Machine Language Binary”(文件-另存为-文件格式)`.aml` 后缀。如果不选择文件格式,就相当于,硬是把`dsl`文本文件,存成了`aml`字节码文件(没有经过编译器转换),这会造成无法预知稀奇古怪的问题。 Clover(推荐):aml 文件应该放到 Clover 所在的分区(通常是EFI分区),如果存在 `EFI/Clover/ACPI/patched`。 DSDT.aml(如果存在)将自动替换OEM DSDT。 本指南(以及与本指南链接的其他指南)假定您使用的是`config.plist / ACPI / AutoMerge = true`,`config.plist / ACPI / SSDT / DropOem = false`。 使用 `AutoMerge = true` 时,可以将打好补丁的 SSDTs 按照原来的名称( `ACPI/origin` 中的名称)放置在 `ACPI/patched`中进行修补,会自动将其插入,以免影响SSDT的原始顺序。 不需要(或建议)将 `SortedOrder` 与`AutoMerge = true`一起使用。 其他配置在下面的“推荐配置”中会介绍。 Clover 3062版本以前,SSDT的命名必须是这样的:SSDT-x 或 SSDT-xx,x是一个整数(一直支持到SSDT-19)。Clover允许SSDT的名字不连续(例如,SSDT-1.aml, SSDT-5.aml, SSDT-6.aml是可以的)。Clover 3062以后的版本,会加载所有在ACPI/patched里的aml文件,对名字没有严格限制了。一定要注意,SSDT的加载顺序非常重要,你留下来的SSDT,要保持提取的时候的顺序。 Clover 3062版本以后的注意事项:`ACPI/patched` 里SSDT的加载方式的改变,造成了加载顺序的不确定性。你应该要使用 `config.plist/ACPI/SortedOrder` 功能,指定SSDT的加载顺序。Clover 3088 版本以后,实现了`SortedOrder`参数。从我的 Clover 指南链接的config.plist 文件对SortedOrder有一个很好的默认值:http://www.tonymacx86.com/yosemite-laptop-support/148093-guide-booting-os-x-installer-laptops-clover.html 注意:SSDTs必须由引导加载器按其原始顺序加载。原始的顺序是由名称后面的数字指定的。例如,如果您使用Clover `F4`来提取您可能会有类似的东西:SSDT-0.aml, SSDT-1.aml, SSDT-2.aml, SSDT-3.aml,表示SSDTs必须以该顺序加载(0/1/2/3)。 ~~变色龙(或Chimera 不推荐):修改、编译好的DSDT/SSDT,应该放到 系统盘的 /Extra(或者你的引导程序所在的其它地方的 `/Extra`)。如果/Extra里存在DSDT.aml,引导程序就会用这里的DSDT,替代掉原始的DSDT,提交给系统。变色龙要求,SSDT的名字是连续的。这样的情况,文件都会被加载:SSDT.aml, SSDT-1.aml, SSDT-2.aml, SSDT-3.aml,直到引导找不到接下来的名字的文件。另外,这样的情况:SSDT.aml, SSDT-1.aml, SSDT-4.aml, SSDT-5.aml,只会加载SSDT.aml 和 SSDT-1.aml。SSDT-4.aml 和 SSDT-5.aml不会被加载(变色龙会忽略这些文件)。~~ ~~最后,如果不先屏蔽原始的OEM SSDT,就不能放自己修改的SSDT。最简单的方法,是设置`DropSSDT=Yes`(变色龙) 或者 `ACPI/SSDT/DropOem=true`(Clover),从而在系统启动的时候,先屏蔽原始的SSDT,之后再把目录里的SSDT(没有修改或修改过)提交给系统。~~ 如上所述,Clover的RehabMan分支中的一项新功能允许您在不使用 `DropOem = true`且不使用 `SortedOrder` 的情况下替换 OEM SSDT,同时始终保持四叶草注入的未打补丁和打补丁的SSDT的原始顺序。通过设置 `config.plist/ACPI/AutoMerge=true`,启用此功能。 当放置在 `ACPI/patched` 中时,SSDT必须保留其原始编号方案。 从2017年12月15日起,此功能已在 RehabMan bitbucket 网站上的Clover_v2.4k_r4359.RM-4506.c5fc0346.zip 中全面运行。 自 r4334 起,所需的更改已在官方Clover (在 sourceforge 上)中实现(但您可能会遇到一些错误,请使用 RehabMan fork 的版本 )。笔记本电脑主指南中链接的每个 plists 默认情况使用 `AutoMerge = true`。 RehabMan fork 的 Clover::https://github.com/RehabMan/Clover 笔记本电脑主指南:https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/ # 推荐的配置 以下是有效的配置,其他任何配置都可能是错误的(有些情况我不希望涉足,因此使用了‘可能” likely’)。首先列出的配置更可取。 全部 hotpatch: - 所有的补丁都是通过`config.plist`完成的 - 在 `ACPI/patched` 中只有附加的 SSDTs(例如,没有打补丁的 `DSDT`, 没有打补丁的`SSDTs`) - `SortedOrder` 可以不指定 - `DropOem=false` 部分 hotpatch: - 打补丁的`DSDT.aml`放置在 `ACPI/patched` - 在 `ACPI/patched` 中只有附加的 SSDTs (例如,没有打补丁的 `SSDTs`) - 通过`config.plist`来进行重命名(会对原生的 SSDTs 和 `ACPI/patched` 下的 `DSDT.aml` 应用) - 不指定 `SortedOrder` - `DropOem=false` 部分 hotpatchh 和打补丁的SSDTs: - 需要 RehabMan 构建的Clover - 打补丁的`DSDT.aml`放置在 `ACPI/patched` - 在 `ACPI/patched` 中选择打了补丁的的 SSDTs (必须以提取到 `ACPI/origin` 的名称来命名) - 附加的 `SSDTs` 也放置在 `ACPI/patched` 中 - 仍然可以使用`config.plist` 来完成重命名 - 不指定`SortedOrder` - `config.plist/ACPI/AutoMerge=true` - `DropOem=false` 全部打补丁的 DSDT + SSDTs: - 打补丁的`DSDT.aml`放置在 `ACPI/patched` - 完整的一组打了静态补丁的 OEM SSDTs 放置在 `ACPI/patched`(还是以原本 `ACPI/origin` 下的原始名称) - 附加的`SSDTs` 也放置在 `ACPI/patched` 中 - `config.plist`中的重命名是不推荐的(它们只适用于 `DSDT.aml`) - `SortedOrder`需要设置 `SSDT` 加载顺序 - `DropOem=true` # Floating regions 在ACPI中,OperationRegion可以定义MMIO 区域(region),SystemMemory区域,EmbeddedControl区域等。这些区域通常具有固定的地址,这些地址仅取决于计算机配置,BIOS版本或BIOS选项。 有时,这些区域可能会随机或意外更改。 这被称为“浮动区域”。 由于通过修补DSDT和/或SSDT,我们在给定的时间点提供了这些地址的快照,当BIOS发出命令,需要变动地址值时,我们提取的文件是做不到这样的变动的。在这样的情况下,你也许能注意到,某一个特定的功能变得断断续续,或者可能随机地出现一些稳定性问题。 如果您具有随机浮动的区域,则**可以尝试** Clover 的 FixRegions 功能(`config.plist / ACPI / DSDT / Fixes / FixRegions = true`)。 您可以在Clover Wiki中找到详细信息。 注意:FixRegions 只能固定 DSDT 中的浮动区域。 SSDT中的浮动区域存在问题,除了为受随机浮动区域影响的SSDT 不提供修补的SSDT之外,没有其他好的解决方案。 解决修补的SSDT中的浮动区域超出了本指南的范围。 请注意,FixRegions 是相对有问题的。 它无法修复所有区域,有时可能会错误地“修复”区域。 # 资源 MaciASL(RehabMan fork):https://github.com/RehabMan/OS-X-MaciASL-patchmatic patchmatic:https://github.com/RehabMan/OS-X-MaciASL-patchmatic iasl(RehabMan fork):https://bitbucket.org/RehabMan/acpica/downloads ACPI spec: 5.0a:[http://acpi.info/spec.htm](http://acpi.info/spec.htm) Latest:[http://www.uefi.org/specifications](http://www.uefi.org/specifications) RehabMan github:https://github.com/RehabMan?tab=repositories Clove r笔记本电脑指南:http://www.tonymacx86.com/yosemite-laptop-support/148093-guide-booting-os-x-installer-laptops-clover-uefi.html 笔记本电脑的 Clover `config.plist`文件:https://github.com/RehabMan/OS-X-Clover-Laptop-Config Clover 跟帖:http://www.insanelymac.com/forum/topic/284656-clover-general-discussion/ Clover 变化:http://www.insanelymac.com/forum/topic/304530-clover-change-explanations/ # 提供反馈 请勿将此线程视为您的专用疑难解答线程。 如果您的特定笔记本电脑有特定问题,请打开单独的线程。 如果您发现此处有错误或希望做出贡献,请回复此主题。 # 问题报告 请阅读上面的“提供反馈”。最好打开一个单独的帖子。 在那个单独的帖子中,清楚地描述你的问题。并提供相关数据... 阅读常见问题,“Problem Reporting” https://www.tonymacx86.com/threads/faq-read-first-laptop-frequent-questions.164990/ **** # 使用Clover Fix 也许有的同学会说,有的电脑不用 DSDT 也可以完美,其实,这样的说法不太严谨。因为,虽然没有在相关文件夹放自己修改过的 DSDT 文件,但是,系统启动时,其实是会自动从BIOS 读取出厂时的原始 DSDT的。 由于 **Clover 的强大功能**,使得不需要手工修改原始的 DSDT: 比如`Fix ****`参数,就是在启动读取原始 DSDT 文件时,由 Clover 程序根据相应的`Fix参数`,向 DSDT 里添加对应的通用性代码,再把修改后的DSDT,提交给系统。这样,修改 DSDT 的动作,是发生在系统启动时。也就给大家一个似乎不需要自己修改的DSDT的印象。 # 参考 相关:[SSDT GPU (Graphics Card) Injection](https://www.tonymacx86.com/threads/ssdt-gpu-graphics-card-injection.183354/) 其他翻译: [DSDT 有什么?如何提取黑苹果系统里的 DSDT 文件](http://www.xp988.com/tech/6028.html) [[教程]](http://bbs.pcbeta.com/forum.php?mod=forumdisplay&fid=546&filter=typeid&typeid=1199)[\[授权翻译\] 使用补丁修改 DSDT/SSDT \[DSDT/SSDT 综合教程\]](http://bbs.pcbeta.com/viewthread-1571455-1-1.html) [对笔记本的 DSDT/SSDT 打补丁](http://blog.csdn.net/wr132/article/details/54798754) [教程 运用MaciASL软件的补丁源-帮你完善DSDT](http://www.memacx.com/thread-5726-1-1.html) [关于DSDT修改-提取软件以及使用方法【详解】](http://www.memacx.com/thread-718-1-1.html) http://www.sdifen.com/getdsdt.html http://bbs.pcbeta.com/viewthread-1571455-1-1.html https://www.maoshu.cc/1168.html DSDT SE链接: http://pan.baidu.com/s/1gfbthlD 密码: r6c4DSDTeditor链接: http://pan.baidu.com/s/1bpcNhTl 密码: hag8IDSDT链接: http://pan.baidu.com/s/1qYAS4XY 密码: qwvwMACIASL链接: http://pan.baidu.com/s/1c1I2ucC 密码: 99x9