什么是SSDT和DSDT

可以简单的理解成,SSDT和DSDT是为了黑苹果系统能够更好使用硬件所需要的补丁,可以让黑苹果更像白苹果。

SSDT 主要是针对 电源,显卡,以及CPU的变频,比如可以让CPU实现自动变频,降频降功耗,达到节能之类的。

DSDT 也可以看成是补丁,DSDT主要的针对的是主板上其他的芯片或者硬件的补丁,比如声卡,网卡,USB接口之类的。

DSDT的大概作用就是告诉苹果系统,这台电脑上在什么什么位置有什么什么样的硬件,你驱动的时候看着办。

DSDT还有个作用就是可以给驱动不了的硬件打补丁,比如笔记本的屏蔽独显。

所以看到这你也应该差不多明白了,这两个补丁,台式机的话理论上也需要用得到,但是如果懒得管,不打这两个补丁也不是不能用。

但是笔记本肯定需要精心调教了。

 

主板的BIOS设置中,有个选项叫ACPI,英文全名是 Advanced Configuration and Power Management Interface

中文名称是高级配置和电源管理接口,你可以大概这样理解,安装Windows系统后,Windows会自动生成一个叫ACPI的表格,然后主板BIOS读取这个表格,根据这个表格的设置,给主板的各种硬件提供不同的设置,比如给CPU降压降频,给显卡停止供电,只是用核显等等。

ssdt和dsdt其实是这个ACPI表格中的两个表。

黑苹果系统的SSDT和DSDT补丁就是去Windows系统中,提取ACPI这个表格中的SSDT和DSTD着两个选项,然后根据自己需要是否需要修改数据。

最后再去黑苹果系统中,打上两个补丁文件。

 

这是Windows 10系统下,使用AIDA64这个软件,截图的ACPI的表,可以看到SSDT和DSDT的表内容

 

SSDT 和 DSDT 的使用步骤

提取ACPI原始文件

反编译

分析和过滤原始文件

使用补丁修改

编译和保存,并放到引导文件的指定目录

 

获取ACPI的原始文件方法很多,比如macOS系统可以使用patchmatic提取,四叶草Clover引导的开机选择界面按F4也可以提取。

patchmatic下载:https://www.mfpud.com/topics/2813/

四叶草Clover开机选择界面按F4,原始文件会提取到:EFI/Clover/ACPI/origin

Linux系统提取命令:

sudo cp -R /sys/firmware/acpi/tables 你的U盘路径

Windows 系统可以借助AIDA64 Business版这个软件来提取

AIDA64 Business 下载:https://www.mfpud.com/topics/2814/

打开 AIDA64 Business版 的 aida64.exe

点击工具 - ACPI浏览器 - Save DSDT—选择保存位置保存,把保存好的acpi_dsdt.bin命名为DSDT.aml

工具—ACPI浏览器—Save Table—前面是SSDT开头的都要保存。

保存时候文件名为SSDT.aml/SSDT-1.aml/SSDT-2.aml/SSDT-3.aml/依次类推,保存类型为ALL files(*.*)。

比如我下面的这个视频中,需要一直保存12个,每一个都要保存出来。

视频小教程

 

 

把所有提取出来的这些原始文件放到一个文件夹中,把文件夹重命名acpi,把这个文件夹复制到到macOS系统桌面。

接下来到了反编译的阶段

下载这个,MaciASL:https://www.mfpud.com/topics/2716/

解压出来,一个app,

再下载这个编译工具:https://www.mfpud.com/topics/2818/

仔细看一下编译工具的安装说明。

安装完app和编译工具后,现在到了反编译的步骤

 

将准备好的SSDT和DSTD原始文件,.aml格式的编译为.dsl格式

Windows 平台编译器:https://www.mfpud.com/topics/2811/

苹果系统的用上面下载好的MaciASL

 

把在Windows平台,或者四叶草引导界面,提取出来的SSDT和DSDT的.aml格式的文件,放到同一个文件夹中,并把文件夹重命名ACPI,把这个文件夹复制到macOS系统的桌面。

打开终端,运行

cd Desktop/ACPI

把.aml格式的文件编译成.dsl格式

iasl -da -dl *.aml

上面的命令输入确定后,你的桌面的ACPI文件夹中会多出.dsl格式的文件,如果没有就检查上面的命令哪条出错了。

正常情况下如图

现在到了筛选和排错的阶段了

打开刚才安装的 MaciASL

最上面的文件栏,点击 文件 - 打开

需要依次打开每个编译好的.dsl文件

可以按住Windows徽标键多选

接下来的部分就比较难了,需要自行排查每个.dsl文件中的错误内容和不必要的内容,然后需要修改和删减

这个环节就很难了,需要太多的专业知识

我直接复制粘贴一个别人写的内容

筛选ACPI文件
生成的SSDT和原始的SSDT会产生冲突。大部分关于电源管理的贴子,会让删除所有原始的SSDT。但删除所有SSDT并不好,特别是对于一些新的电脑来说,很多代码都从DSDT移到了SSDT里,最好不要一棒子把所有SSDT都打掉。只需要 把和CPU相关的SSDT删除就可以了,因为这样的SSDT对黑苹果没有效果(也许它们还会造成其它问题),留下其它有用的SSDT,用于打补丁或者就保留着不做修改。

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

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

以下是 常见的SSDT的特点和功能 :
- 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文件的代码原本就存在缺陷或者某些代码本来就是无效的(很难说得清楚)。

好了,在确认哪些文件是你需要的之后,就需要开始对它们进行修改了(修复错误、添加功能性代码),直到编译没有错误。现在有很多补丁源可以提供使用。

Rehabman的综合补丁源: https://github.com/RehabMan/Laptop-DSDT-Patch

注意:以上补丁源里的 补丁 , 没有在DSDT Editor软件里测试过 。DSDT Editor软件存在着很多bug,内置的编译器也很老了。

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

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

学习一下ACPI规范 和 具有一些编程经验,有助于处理DSDT和SSDT。

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


常用补丁
一般,你需要 先弄清自己的需求 , 再根据需求选择要用的补丁 。但也有一些补丁是通用的,并且这些补丁一般不会造成什么问题。例如,Rehabman的补丁源里的:

"Fix _WAK Arg0 v2"
"HPET Fix"
"SMBUS Fix"
"IRQ Fix"
"RTC Fix"
"OS Check Fix"
"Fix Mutex with non-zero SyncLevel"
"Fix PNOT/PPNT"
"Add IMEI”

USB补丁 ,用于解决 睡眠自动唤醒 的问题。

根据自己电脑的硬件配置选择USB补丁:
"6-series USB"
"7-series/8-series USB”

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

如果你的电脑是Haswell架构、8系列芯片组的,并且还没有加载AppleLPC.kext(电源管理的一种),你可以使用这个补丁,注入一个兼容ID,以加载AppleLPC:
"Haswell LPC”

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

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


关于一些特别的需求的修改
电池状态显示 :
原贴:http://www.tonymacx86.com/mavericks-laptop-support/116102-how-patch-dsdt-working-battery-status.html

屏幕亮度调节 :
原贴: http://www.tonymacx86.com/yosemite-laptop-support/152659-guide-patching-dsdt-ssdt-laptop-backlight-control.html

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

如果你对制作补丁有兴趣,可以去看这里的MaciASL补丁语法说明: http://sourceforge.net/p/maciasl/wiki/Patching%20Syntax%20Grammar/

注意:在许多情况下,DSDT的补丁是和某个第三方kext、打过补丁的kext、Clover实时打补丁的kext相结合使用的(通过DSDT代码加载kext)。


仿冒声卡驱动相关的补丁
有两个和仿冒声卡驱动相关的补丁,需要和仿冒的声卡kext一起使用:
"Audio Layout 12" (根据实际情况,自己修改 layout-id,例如把 12 改成 28 等)
"IRQ Fix”(解决需要-f才能加载声卡驱动的问题)

注意,你需要有适合你的声卡的AppleHDA,还要知道这个仿冒声卡驱动用的是哪个layout-id。layout-id的值,是由修改驱动的人决定的。

要查看别人修改的AppleHDA用的layout-id是哪个值,首先,你需要知道自己声卡的codec id的十进制形式(例如,0x10ec0269 = 283902569)。然后,去查看 AppleHDA.kext/Contents/PlugIns/AppleHDAHardwareConfigDriver.kext/Contents/Info.plist,查看HDAConfigDefault节点下面的codec id(这个节点下,可能有一组或多组数据,所以,刚才的283902569就用上了)。和你的codec id匹配的那组里,LayoutID的值,就是你需要的layout-id值。有的驱动修改者,同一个codec id可能会对应多个layout-id,选择一个你需要的layout-id注入。


 

Floating regions

根据ACPI规范,OperationRegion可以被具体定义为 MMIO region, SystemMemory region, EmbeddedControl region 等。这些region通常包含了 修正过的 地址值,这些地址值 由 硬件构成、BIOS版本、BIOS设置 决定。这些region随时可能 随机地、不可预计地 发生改变。也就是所谓的"floating regions”(动态域)。

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

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

 

最后修改错误完成后,使用MaciASL的 另存为,并选择 文件格式 "ACPI Machine Language Binary” ,再在文件名那里加上 .aml扩展名,保存。

编译保存为aml之后,把它们放到引导程序规定的加载目录,比如四叶草的是 Clover /EFI/Clover/ACPI/patched

保存好dsl文件,以后修改还要用dsl文件。