(2015.1.13 更新)联合DSDT和SSDT进行反编译——减少DSDT和SSDT错误的尝试
本帖最后由 daxuexinsheng 于 2015-1-13 14:23 编辑2015.1.13 更新
把命令换成了最精简的形式。
很多同学看到标题可能会感到困惑,什么是关于减少DSDT和SSDT错误的尝试呢?
是这样的,一般,我们在Window下或者在Mac下提取到的DSDT都是从BIOS里直接读取的、已经编译好的字节码文件,可以理解为,我们只能提取到aml文件,这样,问题就随之产生了,即aml是编译好的文件,我们不能直接查看其中的内容,我们使用软件打开aml文件,其实是在做一个反编译的操作,把字节码文件反编译回到源代码,展现在软件里。而反编译的操作常常会很难避免地产生许多错误。就像是中文和英文之间不能进行无缝转换一样。
我最近有一些机会,帮助景友修复DSDT,就在这个过程中,我找到了一种能使反编译产生的错误尽可能减少的方法,这是从国外的黑苹果高手Rehabman那里学到的。(当然我肯定不是论坛里第一个知道这个方法的,只是好像还没有帖子介绍这个方法,这才发贴。如果已经有了相关的帖子,还请版主删贴。)
本方法需要使用原始的DSDT.aml和SSDT.aml(一般会有很多个)。
(建议用Linux提取,方法见这个贴子的3楼:https://bbs.pcbeta.com/viewthread-1571455-1-1.html)
下面就是这个方法:
其实就是使用命令,联合DSDT、SSDT进行反编译(即aml->dsl),使用命令,就有一些可选的操作了。
一、首先,就是下载编译器(可以看成是把中文翻译成英文的翻译机,只是它的工作是把编程语言翻译成机器可以听懂的语言。)
DSDT的编程语言的名字叫ASL(ACPI Source Language)。可以到这里下载:https://www.acpica.org 。这里提供了Unix、Windows、Linux版本的编译器,其中Windows提供了可直接运行的编译器,Unix还需要下载下来自己构建,但我的机器上构建不成功,就搜索了网友构建好的了,帖子会提供下载。
二、下载好编译器后,我们需要把它放到系统盘下的usr/local/bin目录,这样才能使用。
这个目录是隐藏的,你可以在顶部Finder的菜单栏选择“前往”菜单下最下面的“前往文件夹”,在弹出的对话框中输入 /usr/local/bin 或者 /usr/bin,就可以打开这个目录了,把编译器程序放到里面就行了。
三、接下来,介绍要用到的命令。
1、cd :这是很多操作系统都支持的命令,其含义是“change directory”,就是改变路径。
使用方法: cd 路径名比如 cd Desktop/ACPI ,就是定位到桌面上的ACPI文件夹。
2、iasl :这是编译命令 使用: iasl 文件名 比如 iasl DSDT.dsl,就是编译DSDT.dsl文件。
2.1 参数1: -e ,这里的e是external的首字母,意思是在操作时要包括外部的一些信息,比如把SSDT的信息,加入到DSDT的反编译过程里,对于DSDT,SSDT就是外部信息。
2.2 参数2:-d ,这里的d是disassemble的首字母,字面意思是拆卸,可以说是反编译。
四、最后是正题,我们要用到的命令的例子:
1、 打开Launchpad,找到“其它”->“终端”,输入以下命令。
2、cd Desktop/ACPI 指定到存放DSDT.aml、SSDT.aml文件的目录。(你的文件路径不一定一定要是这个。)
3、iasl –e SSDT*.aml –d DSDT.aml (已经有比这个命令,效果更好的命令了。具体请看贴子的最后。)
这句命令的操作:使用SSDT.aml里的相关信息,协助反编译DSDT.aml。SSDT后面的星号表示的是任意字符,比如,你的文件夹里有SSDT1.aml、SSDT2.aml、SSDT3.aml、SSDT4.aml ……。很多的SSDT,这样写,程序就会自动找这个文件夹下的所有SSDT,而不需要把所有SSDT的文件名写到命令里。
执行这句命令后,一般,就会在这个文件夹下生成一个dsl文件,它的错误大大减少了,甚至已经没有错误了。以后要修改DSDT,就可以用这个文件修改了,修改好就可以编译成aml使用了。(不建议用软件打开aml文件,编译好后,可以直接测试有没有效果了。)
3.1 这句命令还可以反过来用,即
iasl -e DSDT.aml -d SSDT*.aml (已经有比这个命令,效果更好的命令了。具体请看贴子的最后。)
与前一句命令相比,操作反了过来,这句命令是使用DSDT.aml里的相关信息,协助反编译SSDT.aml,这样生成的SSDT.dsl,也能减少很多错误,甚至已经都没有错误了。
以下是我使用这个方法的情况。
以上是在OS X的终端进行的操作,Windows下需要把编译器和DSDT.aml、SSDT.aml放在同一个文件夹,再用cd命令到文件夹,就可以执行命令了。
另外,在OS X下,楼主推荐使用MaciASL编辑、修改DSDT。楼主使用的是MaciASL的Rehabman的修改版。会提供下载。
结束语:本贴介绍的方法是一种尝试,并不适合所有的电脑的DSDT。如果你发现这种方法对你的DSDT没有减少错误的效果,那就还是按照一般的方法修改DSDT吧。
声明:在尝试此方法的过程中,发生的一切后果,由读者自行承担,读者有选择是否使用此方法的自由。
毕竟楼主不是什么高手,不能保证会不会有什么问题。
文件下载地址:(iasl是编译器,是ACPI 5.0的编译器,DSDT Editor等软件用的是ACPI 4.0的编译器。MaciASL是编辑DSDT的软件,在软件的设置里,可以选择编译器的版本。)(楼主在下载地址也更新了Windows版的编译器。ACPI 5.0 编译器 版本 更新到 20141107 版本。)
特别注意:
新版本编译器,反编译后,用MaciASL打开,左边的树状目录会显示不全(实际的代码没有少,但树状目录不能显示完整)。
已经更新为 国外大神 Rehabman 的修改版。
http://pan.baidu.com/s/1pJ7DKGb
在帖子的第三页的43F、44F、59F有精彩回复,大家可以看一下。
1、贴子发出后的 第一个进展:iasl -e *.aml -d *.aml
(感谢 chenkj918 ,这是本贴的第一个进展。)
2、第二个进展: iasl -da *.aml
(感谢 zmman 告诉楼主他的新发现。这是目前减少错误最有效的命令之一。)
3、20140926版本及以前版本: iasl -da *.aml
4、20141107 版开始: iasl -da -dl *.aml
(从这个版本开始,iasl编译器开始支持 算数运算符 和 逻辑运算符,同时,增加了 -dl 命令 以使新编译器得到的代码和旧编译器兼容)
http://cdn.pcbeta.attachment.inimc.com/data/attachment/album/201501/13/142025hmyjyvvyyl1jqzib.png重要补充,在之前的贴子,楼主忘了介绍 使用命令 编译DSDT/SSDT文件的方法了(即 dsl -> aml ),特此补充:
iasl 文件名
示例: iasl DSDT.dsl 或者
iasl SSDT*.dsl 或者
iasl *.dsl
即可由 dsl源文件,生成 aml目标文件。(不建议用软件打开aml文件)
或者,在用 MaciASL 保存的时候,这样选择:(保存类型选择:“ACPI Machine Language Binary”(简称aml),这样就可以把 dsl 编译保存为 aml 了)http://cdn.pcbeta.attachment.inimc.com/data/attachment/album/201403/22/202838gyx55h1htzup57u4.png
{:5_285:}对于反复编译出错的 dsdt,我们基本已经可以肯定是由于反编译过程的 bug 产生。理由如下:
一、dsl 在编写的过程一些特别明显的错误是不可能犯的,更不可能好多厂商的程序员同时犯相同的错误,所以 dsl 在编写过程中出现那么离奇的错误基本是不可能的。
二、编译后的二进制文件是没有错的,不然也无法通过机器执行,所以编译过程是不会产生这么严重的错误的。
三、在一和二成立的前提下,我们再次看到源码是在反编译过程后,那么错误是在反编译过程中产生的。
我没看过反编译器的源码,但我猜测(也有别的可能),在反编译时,反编译器会对于 dsdt(或者是 ssdt) 内的各类变量进行检测,对于函数所使用的参数的个数也会确定,这时对于 dsdt 里写了的,基本不会出现检测错误,但是对于 dsdt 前面声明的External 里的各类变量(如:External (PDC5),下面以此为例),因为反编译器不知道PDC5是什么变量(可能是整数变量,也可能是函数等等),反编译器就会猜测其类型,如果反编译器把原本是整数的 PDC5猜成了函数,那下面必然会给 PDC5使用调用程式(PDC5()),那下面就有可能会产生接二连三的符号错误……符号错误最明显的影响是导致一大堆的参数找不到。其它的各种错就不一一列举了……(实为本人能力有限)
四、楼主指明的方法正好可以帮助反编译器解决上面说的这个问题(好多 External 里声明的就是 ssdt 里的变量 ),所以按楼主的方法反编译出的 dsl 文件基本没有错误,这也可以反过来证明三中猜想的正确性。
贴上一段我使用楼主所给方法反编译微星 ge60的 dsdt 时 dsl 给出的提示/*
* iASL Warning: There were 8 external control methods found during
* disassembly, but only 7 were resolved (1 unresolved). Additional
* ACPI tables are required to properly disassemble the code. This
* resulting disassembler output file may not compile because the
* disassembler did not know how many arguments to assign to the
* unresolved methods.
*/
External (_SB_.TPM_.PTS_, MethodObj) // Warning: Unresolved Method, guessing 1 arguments (may be incorrect, see warning above)
解决办法:
如果三中猜想正确,那么,问题的产生过程也就明确了,解决方法就有两个(欢迎提供更好的解决办法):
1.修复反编译器的 bug……;
2.把会识别错的变量写到 dsdt 里去。
显然2比较实际一点。我实际测试也是2可以基本解决这个问题。这个解决方法也可以用来证明三中猜想正确。
深夜写天书,逻辑比较混乱……但愿有人能看懂……
……声明……
本人日语专业,未学过编程,所以有些专业术语不会使用,也有可能有些地方说的不对,还请各位看客多多包涵,如果能帮助小弟改正,更是感激不尽。 本帖最后由 kavenliang 于 2014-10-8 08:45 编辑
我之前的问题是因为iasl版本太老 记得换新版本, 还有一个万能命令 ./iasl -e *.aml -d *.aml 会把所有的aml都dissemble一遍 非常方便 {:5_597:}在im上看到rehabman推荐的另一个命令 :iasl -da *.aml
实践证明比iasl -d *.aml -e *.aml来的更高效。。后者常常不起作用 贴子补充(iasl更新日志):
----------------------------------------
07 November 2014. Summary of changes for version 20141107:
This release is available at https://acpica.org/downloads
This release introduces and implements language extensions to ASL that
provide support for symbolic ("C-style") operators and expressions. These
language extensions are known collectively as ASL+.
1) iASL Compiler/Disassembler and Tools:
Disassembler: Fixed a problem with disassembly of the UartSerialBus
macro. Changed "StopBitsNone" to the correct "StopBitsZero". David E.
Box.
Disassembler: Fixed the Unicode macro support to add escape sequences.
All non-printable ASCII values are emitted as escape sequences, as well
as the standard escapes for quote and backslash. Ensures that the
disassembled macro can be correctly recompiled.
iASL: Added Printf/Fprintf macros for formatted output. These macros are
translated to existing AML Concatenate and Store operations. Printf
writes to the ASL Debug object. Fprintf allows the specification of an
ASL name as the target. Only a single format specifier is required, %o,
since the AML interpreter dynamically converts objects to the required
type. David E. Box.
(old) Store (Concatenate (Concatenate (Concatenate (Concatenate
(Concatenate (Concatenate (Concatenate ("", Arg0),
": Unexpected value for "), Arg1), ", "), Arg2),
" at line "), Arg3), Debug)
(new) Printf ("%o: Unexpected value for %o, %o at line %o",
Arg0, Arg1, Arg2, Arg3)
(old) Store (Concatenate (Concatenate (Concatenate (Concatenate
("", Arg1), ": "), Arg0), " Successful"), STR1)
(new) Fprintf (STR1, "%o: %o Successful", Arg1, Arg0)
iASL: Added debug options (-bp, -bt) to dynamically prune levels of the
ASL parse tree before the AML code is generated. This allows blocks of
ASL code to be removed in order to help locate and identify problem
devices and/or code. David E. Box.
AcpiExec: Added support (-fi) for an optional namespace object
initialization file. This file specifies initial values for namespace
objects as necessary for debugging and testing different ASL code paths
that may be taken as a result of BIOS options.
2) Overview of symbolic operator support for ASL (ASL+)
-------------------------------------------------------
As an extension to the ASL language, iASL implements support for symbolic
(C-style) operators for math and logical expressions. This can greatly
simplify ASL code as well as improve both readability and
maintainability. These language extensions can exist concurrently with
all legacy ASL code and expressions.
The symbolic extensions are 100% compatible with existing AML
interpreters, since no new AML opcodes are created. To implement the
extensions, the iASL compiler transforms the symbolic expressions into
the legacy ASL/AML equivalents at compile time.
Full symbolic expressions are supported, along with the standard C
precedence and associativity rules.
Full disassembler support for the symbolic expressions is provided, and
creates an automatic migration path for existing ASL code to ASL+ code
via the disassembly process. By default, the disassembler now emits ASL+
code with symbolic expressions. An option (-dl) is provided to force the
disassembler to emit legacy ASL code if desired.
Below is the complete list of the currently supported symbolic operators
with examples. See the iASL User Guide for additional information.
ASL+ Syntax Legacy ASL Equivalent
----------- ---------------------
// Math operators
Z = X + Y Add (X, Y, Z)
Z = X - Y Subtract (X, Y, Z)
Z = X * Y Multiply (X, Y, Z)
Z = X / Y Divide (X, Y, , Z)
Z = X % Y Mod (X, Y, Z)
Z = X << Y ShiftLeft (X, Y, Z)
Z = X >> Y ShiftRight (X, Y, Z)
Z = X & Y And (X, Y, Z)
Z = X | Y Or (X, Y, Z)
Z = X ^ Y Xor (X, Y, Z)
Z = ~X Not (X, Z)
X++ Increment (X)
X-- Decrement (X)
// Logical operators
(X == Y) LEqual (X, Y)
(X != Y) LNotEqual (X, Y)
(X < Y) LLess (X, Y)
(X > Y) LGreater (X, Y)
(X <= Y) LLessEqual (X, Y)
(X >= Y) LGreaterEqual (X, Y)
(X && Y) LAnd (X, Y)
(X || Y) LOr (X, Y)
(!X) LNot (X)
// Assignment and compound assignment operations
X = Y Store (Y, X)
X += Y Add (X, Y, X)
X -= Y Subtract (X, Y, X)
X *= Y Multiply (X, Y, X)
X /= Y Divide (X, Y, , X)
X %= Y Mod (X, Y, X)
X <<= Y ShiftLeft (X, Y, X)
X >>= Y ShiftRight (X, Y, X)
X &= Y And (X, Y, X)
X |= Y Or (X, Y, X)
X ^= Y Xor (X, Y, X)
3) ASL+ Examples:
-----------------
Legacy ASL:
If (LOr (LOr (LEqual (And (R510, 0x03FB), 0x02E0), LEqual (
And (R520, 0x03FB), 0x02E0)), LOr (LEqual (And (R530,
0x03FB),
0x02E0), LEqual (And (R540, 0x03FB), 0x02E0))))
{
And (MEMB, 0xFFFFFFF0, SRMB)
Store (MEMB, Local2)
Store (PDBM, Local1)
And (PDBM, 0xFFFFFFFFFFFFFFF9, PDBM)
Store (SRMB, MEMB)
Or (PDBM, 0x02, PDBM)
}
ASL+ version:
If (((R510 & 0x03FB) == 0x02E0) ||
((R520 & 0x03FB) == 0x02E0) ||
((R530 & 0x03FB) == 0x02E0) ||
((R540 & 0x03FB) == 0x02E0))
{
SRMB = (MEMB & 0xFFFFFFF0)
Local2 = MEMB
Local1 = PDBM
PDBM &= 0xFFFFFFFFFFFFFFF9
MEMB = SRMB
PDBM |= 0x02
}
Legacy ASL:
Store (0x1234, Local1)
Multiply (Add (Add (Local1, TEST), 0x20), Local2, Local3)
Multiply (Local2, Add (Add (Local1, TEST), 0x20), Local3)
Add (Local1, Add (TEST, Multiply (0x20, Local2)), Local3)
Store (Index (PKG1, 0x03), Local6)
Store (Add (Local3, Local2), Debug)
Add (Local1, 0x0F, Local2)
Add (Local1, Multiply (Local2, Local3), Local2)
Multiply (Add (Add (Local1, TEST), 0x20), ToBCD (Local1), Local3)
ASL+ version:
Local1 = 0x1234
Local3 = (((Local1 + TEST) + 0x20) * Local2)
Local3 = (Local2 * ((Local1 + TEST) + 0x20))
Local3 = (Local1 + (TEST + (0x20 * Local2)))
Local6 = Index (PKG1, 0x03)
Debug = (Local3 + Local2)
Local2 = (Local1 + 0x0F)
Local2 = (Local1 + (Local2 * Local3))
Local3 = (((Local1 + TEST) + 0x20) * ToBCD (Local1))
---------------------------------------- {:9_421:}楼主的dsdt解决了? xiao201261 发表于 2014-2-7 21:41 static/image/common/back.gif
楼主的dsdt解决了?
是论坛里的zmmwan修改好的,你改的那个应该也可以,之所以说应该,是因为你给的是aml文件,用软件打开后,还是会显示201错误。zmmwan提供的是dsl的文件。
另外,经过我的尝试,使用本帖的方法,对于那个DSDT,也可以反编译得到一个没有错误的dsl文件。
最后,还是很感谢你呢,辛苦啦。皮卡皮卡。 daxuexinsheng 发表于 2014-2-7 21:52 static/image/common/back.gif
是论坛里的zmmwan修改好的,你改的那个应该也可以,之所以说应该,是因为你给的是aml文件,用软件打 ...
{:9_417:} 哦 xiao201261 发表于 2014-2-7 22:19 static/image/common/back.gif
哦
不要泄气呀,相信你修改的如果保存成dsl也肯定没有错误了,其实,他修改的编译成aml后也还是有一样的问题呢。剩下的分都给你了呢。皮卡皮卡。
{:5_293:} 很久没改dsdt了- -原来还有这个方法。。。感谢lz分享 xuxulll 发表于 2014-2-7 23:41 static/image/common/back.gif
很久没改dsdt了- -原来还有这个方法。。。感谢lz分享
你的等级和技术都很高呢,一定是位高手呢。
{:5_293:} 技术贴顶起来 楼主最近很多好文章呢,支持!{:9_607:} 楼主正在向高手靠拢,我正在向楼主靠近,哈哈 很好的方法备用,现在有c?lover不用那么麻烦了 我每次求助rehabman大神的时候 他都会叫我这么做... 虽然我不是很理解为什么 当时我理解为dsdt和ssdt去重复... 本帖最后由 chenkj918 于 2014-10-8 10:58 编辑
还有 推荐大家用dsl修改dsdt, 我用dsl没有错误 但是编译成aml后再编译会提示有俩错误 我不知道是不是dsl和aml编译器稍微有点不一样 但是目前为止我都以dsl为准 chenkj918 发表于 2014-2-8 08:34 static/image/common/back.gif
我每次求助rehabman大神的时候 他都会叫我这么做... 虽然我不是很理解为什么 当时我理解为dsdt和ssdt去重复 ...
嗯,是的,我也是从Rehabman那里学到的,另外我还想请教你一个问题。
就是,你在打亮度补丁的时候DSDT有没有出现错误,我写了一个hd4400亮度补丁的帖子,不知道里面出现的错误的修改方法对不对,请帮忙看一下,谢谢。
https://bbs.pcbeta.com/viewthread-1475339-1-1.html 啊啊啊啊啊啊~~~~~~~~~~~~~~~~,刚想写就被楼主抢先了。。。桑心。。。。。windows 下我测试过了,跟mac下是一样效果。另附上windows版iasl(楼主提供的网站https://www.acpica.org上也有)
楼主 有个问题困惑我很久 -d dsdt没问题, 要是-d ssdt呢 用什么作为外部扩展-e呢? chenkj918 发表于 2014-2-8 15:08 static/image/common/back.gif
楼主 有个问题困惑我很久 -d dsdt没问题, 要是-d ssdt呢 用什么作为外部扩展-e呢?
帖子更新了呢,DSDT和SSDT可以互相作为外部扩展呢。
甚至所有有联系的ACPI表都可以互做扩展,当然,要建立在他们之间要有联系才行,比如DSDT和SSDT是联系很紧密的。 好奇怪啊 我刚才测试的时候 -e SSDT*.aml -d DSDT.aml, 最后出来所有SSDT的dsl... 但是只用一个 -e SSDT.aml -d DSDT.aml 出来则是DSDT.dsl
不知道什么原因 技术强帖,感谢分享! daxuexinsheng 发表于 2014-2-7 21:52
是论坛里的zmmwan修改好的,你改的那个应该也可以,之所以说应该,是因为你给的是aml文件,用软件打 ...
Z大威武。
不错的帖子,支持一个!不过来说,虽然这样提取的很好,但是修改dsdt时还是会需要编辑器反编译啊。。比如说注入显卡时