使用补丁修改DSDTSSDT [DSDTSSDT综合教程

虽然你可以用其它型号的电脑的DSDT,但这样的后果是会造成更多问题。你不能用别的型号电脑的DSDT是没问题的。如果你用了别的电脑的ACPI文件,即便是硬件配置非常相,也可能会造成 系统不稳定 和 一些奇葩的问题。

所有BIOS都实现了把ACPI文件提交给操作系统的功能。所以,基于任何操作系统,你都可以通过操作系统提取出原始ACPI文件,之后再进行修改。Linux、OS X、Windows、Clover都可以用来提取原始ACPI文件。这些方式提取的文件是完全相同的,只是由于使用的提取工具不同,文件名会不同。

在Clover启动界面,你可以按 “F4”键,Clover会把原始ACPI文件提取到 EFI/Clover/ACPI/origin 目录。再进入系统,就可以在那个目录看到提取到的原始文件了。之后,就可以开始反编译、修改了。注意,有的BIOS可能按F4键没用,而需要FnF4,所以,如果不确定的话,F4 和 FnF4 都按一次。提取的时候,你不会看到任何是否完成的提示,只是会因为正在写文件而出现一点延迟现象。如果是用Clover的USB设备(U盘、硬盘)启动的,文件会被提取到USB设备,这样会感到比较明显的延迟。

有时候,Clover提取的SSDT可能会重复。重复的文件,会影响到反编译。如果你反编译的时候看到了这样的提示信息(duplicate definitions),就需要仔细检查重复的是哪个了(例如,看大小)。由于存在这样的问题,所以在Linux提取比较好。因为我还没有见过在Linux提取的出现重复的情况。

你的U盘或硬盘需要是FAT32式的。FAT32式可以避免出现文件权限问题,因为FAT32式在Linux系统里没有文件权限的问题。用于替换DEST的 自动挂载的USB设备的名字,取决于你的Linux版本和它的启动方式。你可以在终端输入命令,来查看当前的挂载点。或者,在图形界面,把鼠标移到文件管理器上相应的USB设备名上。

虽然提取到的aml文件可以用MaciASL直接打开,但不这样做。用MaciASL直接打开aml文件,是软件在做对打开的这个文件的单独反编译。然而,ACPI文件之间有着紧密的联系,只对一个文件单独反编译,得到的文件会包含许多难于修复的错误。

所以,最好的方法是,使用iasl编译器,同时反编译所有文件。要做的准备工作有,新建一个文件夹用于存放所有DSDT和SSDT文件,并重命名所有文件,例如加上 .aml 扩展名。下载最新的iasl编译器来进行反编译。这里是Rehabman的修改版编译器:。把iasl编译器拷贝到/usr/bin目录,会让调用iasl更方便。

在反编译成功后,一个一个地打开检查dsl文件,以确认每一个具有的功能。如果是和CPU有关的,就把它拖到其它地方(也可以直接删除),最后放到加载目录的,不需要这些提取的CPU相关的SSDT。一般,和CPU相关的SSDT包含了 Scope _PR.CPIx 这样的声明,可以通过这样的名字排除文件。

额外说明:对于Rehabman的联想U430,他试验了使用这些提取的CPU相关的SSDT(当然,是修复了错误的)。不确定这是不是有什么好处,但使用了提取的CPU相关SSDT,使得他的DSDT不再需要打Fix PNOT/PPNT”这样的补丁了,好像电脑工作得很完美。

-:通常包含了 Device GFX0 的SSDT,是和 集成显卡 相关的。亮度补丁就是针对这样的文件的。老的笔记本(Haswell以前的),GFX0一般是定义在DSDT里。Haswell的笔记本,它被定义在SSDT里(虽然也可以移到DSDT里)。

即使同时反编译所有文件(使用iasl的-da参数),还是难免存在错误。反编译后的文件之所以还会有错误,是因为一直以来iasl编译器的版本都在更新、iasl的实现细节变化了、不同的电脑与系统。存在这些错误的原因可能是(Rehabman认为),里面调用到的一些方法,实际上是Windows内部实现的(例如 MMTB方法和MDBG方法)。实际也有这样的情况,ACPI文件的代码原本就存在缺陷或者某些代码本来就是无效的(很难说得清楚)。

在看别人的项目页面的时候,都请仔细阅读作者提供的README,到正确的地址下载软件,学习配置MaciASL。修复语法错误的补丁的名字,以[syn]开头。例如,对于一些比较老的电脑,提供了Fix _PLD Buffer/Package Error, Fix TNOT Error, 和 Fix FPED Parse Error”补丁。为了确定你需要用哪个补丁,需要看 编译结果 窗口给出的 提示信息,再定位到提示的行,查看错误行前后都有什么样的代码。你也可以尝试,只要Changes不为0或者预览框里有显示(说明可以打)的补丁,都可以打。如果你不熟悉编译结果的错误提示,可以一个一个试验看看能不能打。

对于一些错误,你可以简单地删除造成错误的那行代码来解决。当然,这要取决于这一行代码对于功能的实现,是否是必需的。例如,对于由External语句造成的错误,一般可以删除那行代码以修复错误。如果需要,你自己可以做一个删除这样的错误行代码的补丁。

我们的最终目的,是得到 编译没有错误的dsl文件(warnings/remarks/optimizations都不用管)。一旦你修复了所有错误,就可以开始为了你的黑苹果 添加功能、解决某些问题,而修改dsl文件了(使用现有补丁或手工修改)。

USB3 Mutliplex补丁,有助于加载AppleUSBXHCI.kext(原生USB3.0驱动),于是就不需要安装第三方的GenericUSBXCHI.kext了。这个补丁是基于Mieze的发现而制作的。大部分DSDT需要对它做一些修改,才能使用(不然可能会提示有错误)。例如,对于惠普的Probook,Rehabman制作了这个补丁的修改版本。联想u310/u410可以直接使用这个补丁:

还需要考虑对一些设备名进行改名,并且,改名还要改得彻底。可以把一些设备名改成符合苹果规范的名字。(例如,使用Rename GFX0 to IGPU”补丁,可以加载集成显卡的电源管理)。对于这一情况,DSDT/SSDT里,包含的所有GFX0,都需要改成IGPU(对所有含有GFX0的文件,都应用这个补丁)。

关于重复的标识符定义:你必须确保,你修改后的文件,不包含重复的标识符。典型的例子有,在需要添加一个_DSM方法的时候,在同一个范围里,原本已经存在_DSM方法了。编译器就会提示标识符重复。为了避免这样的问题,你可以一开始就对DSDT/SSDT用”Remove _DSM methods”补丁,删除原本存在的所有_DSM方法。

当你在看某个特定型号的安装教程的时候,作者都会介绍用了哪些补丁,或者直接提供下载。你能容易的看出来,他们的补丁和Rehabman的补丁,在语法上是相的。(例如这样的语法:into_all method label FOO code_regex xxyy removeall_matched;’)。这些补丁语句需要粘贴到MaciASL的补丁窗口,再应用。

为了使用你修改、编译好的DSDT/SSDT,你需要把它们放到引导能加载它们的目录。每种引导的加载目录是唯一的,且对文件的命名要求也不同。如果用MaciASL保存,另存为的时候,文件式一定要选择ACPI Machine Language Binary”(文件-另存为-文件式),再自己加上 .aml 后缀。如果不选择文件式,就相当于,硬是把dsl文本文件,存成了aml字节码文件(没有经过编译器转换),这会造成无法预知的问题。

最后,如果不先屏蔽原始的OEM SSDT,就不能放自己修改的SSDT。最简单的方法,是设置DropSSDT=Yes(变色龙) 或者 ACPI/SSDT/DropOem=true(Clover),从而在系统启动的时候,先屏蔽原始的SSDT,之后再把目录里的SSDT(没有修改或修改过)提交给系统。

我们提取的DSDT/SSDT里的Regin,只是某一个时间点的状态,当BIOS发出命令,需要变动地址时,我们提取的文件是做不到这样的变动的。在这样的情况下,你也许能注意到,某一个特定的功能变得断断续续,或者可能随机地出现一些稳定性问题。

综上而论,使用Clover的FixRegions功能,将是很好的解决办法。你可以在Clover的Wiki找到关于这个功能的说明。(国外的)论坛里的安装教程提供的config.plist都配置了这个参数。注意:只有在DSDT里的floating region,才能用这个参数修复。要修复SSDT里的floating region常困难的,目前,除了不处理SSDT里随机变动的floating region以外,还没有什么好的解决方案。研究floating region的处理,超出了本教程讨论的范围。

本教程的方法,是基本的方法,不要全部照搬到你自己的电脑,只需要理解原理。如果你对自己的笔记本的黑苹果有什么问题,不要在这里问,请自己发一个求助贴。如果你发现贴子存在错误,或者想帮助完善贴子,请在本贴回复。(针对于Rehabman的原贴)

对DSDT/SSDT的修改,首先,提取这一步也很关键,虽然提取的方法很多,但最推荐的是用Linux提取。对提取好的文件,同时反编译所有文件,可以得到错误少的dsl文件。修改就用这些dsl文件修改,根据教程,筛选出要留下来的文件。再用很多现有的补丁源(有修复的,也有添加某些功能的)修改。修改好后,编译成aml文件使用(不要用软件打开aml文件)。还要注意SSDT的命名,最好名字连续。最后,放到相应的加载目录。

如图,前面一个径都是一样的,我们需要从这个获取文件。中间空隔开。后面一个径,是你第一步看好的挂载点。(还可以 在空 后把自己的目标目录拖至此处。也就是先输好前面的命令和径,再输一个空,再在图形界面把U盘拖到终端。)