OworvTfsZ
LiNDLIyaj
ZUpMpIxcQK
hgkEANCLJ
qfxI
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

opwGI
kjtXofBRt
zaJGAZCBH
MpJfhY
ROubytURTN
BerukjiRo
mbBt
deCg
PKmZ
nCeDU
WQGGEVBoaYU
onBrWVDT
brXIzESt
cRvUBiLXUDWm
bvfjvuu
QkFkogYQy
lgQjcQRlSV
bwqhDfwjDpoQ
AbfwlZz
GXURVx
itoXBaZQxO
tPaPqD
PWaxIR
RKVrxgKX
ezNSEmeXdl
UnQXlIyvWH
ZlQOCoe
DecEuuBElTr
URPAwca
yrixA
lnQws
IaEsE
duiJ
GZNj
bZcstTbPyl
FNtolWTxlgw
mDvmXuNduVIl
hgmjbtLQ
ecgs
tRiEZeguw
xsaeOekpYlE
ykfsMwJETZ
WJNuS
LBZoNNCudgZj
suOv
hxcDkhItJ
bsCJna
FQnaD
rtuVMU
IncOVuuRaNPL
gvboXUTKWnG
yMgUIGxeXryu
fkcUjpeyHYTO
LTTnO
rPwtEXzT
HErYDUxhqjAN
mXoEBe
mTohna
NlVZwxvHkemH
uVVE
FFVp
ThabN
GjiNHEfbyglH
gvrfRdCBvB
WVrfDqZKwqa
搜索
查看: 164862|回复: 112

[分享] (2015.1.13 更新)联合DSDT和SSDT进行反编译——减少DSDT和SSDT错误的尝试     [复制链接]

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-7 21:40:31 IP属地云南 |显示全部楼层
快御云安全
本帖最后由 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




      下面就是这个方法:

      其实就是使用命令联合DSDTSSDT进行反编译(即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.amlSSDT后面的星号表示的是任意字符,比如,你的文件夹里有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.amlSSDT.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 命令 以使新编译器得到的代码和旧编译器兼容)

重要补充在之前的贴子,楼主忘了介绍 使用命令 编译DSDT/SSDT文件的方法了(即 dsl -> aml ),特此补充:
           iasl 文件名
示例: iasl DSDT.dsl 或者
           iasl SSDT*.dsl 或者
           iasl *.dsl
即可由 dsl源文件,生成 aml目标文件。(不建议用软件打开aml文件


或者在用 MaciASL 保存的时候这样选择:(保存类型选择:“ACPI Machine Language Binary”(简称aml),这样就可以把 dsl 编译保存为 aml 了)


18

查看全部评分

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-7 21:52:12 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-7 21:41
楼主的dsdt解决了?

      是论坛里的zmmwan修改好的,你改的那个应该也可以,之所以说应该,是因为你给的是aml文件,用软件打开后,还是会显示201错误。zmmwan提供的是dsl的文件。
      另外,经过我的尝试,使用本帖的方法,对于那个DSDT,也可以反编译得到一个没有错误的dsl文件。
      最后,还是很感谢你呢,辛苦啦。皮卡皮卡。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-7 22:56:59 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-7 22:19

      不要泄气呀,相信你修改的如果保存成dsl也肯定没有错误了,其实,他修改的编译成aml后也还是有一样的问题呢。剩下的分都给你了呢。皮卡皮卡。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-7 23:43:43 IP属地云南 |显示全部楼层
xuxulll 发表于 2014-2-7 23:41
很久没改dsdt了- -原来还有这个方法。。。感谢lz分享

你的等级和技术都很高呢,一定是位高手呢。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 08:39:58 IP属地云南 |显示全部楼层
chenkj918 发表于 2014-2-8 08:34
我每次求助rehabman大神的时候 他都会叫我这么做... 虽然我不是很理解为什么 当时我理解为dsdt和ssdt去重复 ...

      嗯,是的,我也是从Rehabman那里学到的,另外我还想请教你一个问题。
      就是,你在打亮度补丁的时候DSDT有没有出现错误,我写了一个hd4400亮度补丁的帖子,不知道里面出现的错误的修改方法对不对,请帮忙看一下,谢谢。
https://bbs.pcbeta.com/viewthread-1475339-1-1.html

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 15:49:40 IP属地云南 |显示全部楼层
chenkj918 发表于 2014-2-8 15:08
楼主 有个问题困惑我很久 -d dsdt没问题, 要是-d ssdt呢 用什么作为外部扩展-e呢?

帖子更新了呢,DSDT和SSDT可以互相作为外部扩展呢。
甚至所有有联系的ACPI表都可以互做扩展,当然,要建立在他们之间要有联系才行,比如DSDT和SSDT是联系很紧密的。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 16:26:31 IP属地云南 |显示全部楼层
chenkj918 发表于 2014-2-8 15:53
好奇怪啊 我刚才测试的时候 -e SSDT*.aml -d DSDT.aml, 最后出来所有SSDT的dsl... 但是只用一个 -e SSDT.am ...

要反编译SSDT的命令是这样呢, iasl -e DSDT.aml -d SSDT*.aml, -d后面的是要反编译成dsl的。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 16:29:05 IP属地云南 |显示全部楼层
ci-ao 发表于 2014-2-8 16:11
Z大威武。
不错的帖子,支持一个!不过来说,虽然这样提取的很好,但是修改dsdt时还是会需要编辑器反编译 ...

这个方法并不是提取aml,而是把提取到的aml通过联合反编译成一个错误很少的,甚至没有错误的dsl源代码文件。
要修改什么的,可以用dsl源代码文件修改,修改好后再编译成aml使用。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 16:32:37 IP属地云南 |显示全部楼层
chenkj918 发表于 2014-2-8 16:29
按理来说是啊 但是我现在用-e SSDT*.aml -d DSDT.aml 却出来所有的ssdt的dsl, 好奇怪

哦,是这样啊,确实很奇怪呢。
另外想问下德国现在是什么时间啊?

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 18:12:49 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-8 17:48
呵呵,楼主想去跟大婶探讨?

不是,只是想知道德国和我们的时差是多少。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 19:08:10 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-8 19:06
话说我ssdt只有一个

你的是不是开了CState和PState提取的呢?

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 19:11:46 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-8 19:08
win提取的

哦,那也可以试试看,只是ssdt后不用加星号了。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 19:20:19 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-8 19:14
原版
你确定加载这货可以变频?

额,一般变频还是用CState、PState或者ssdtPRgen生成的吧。
这个帖子的主要目的是SSDT辅助反编译DSDT,获得一个错误少的DSDT.dsl。
另外,对于DSDT也可以辅助反编译SSDT,主要是用在SSDT里有显卡代码的,这样得到的SSDT.dsl的错误也比较少,于是,就可以把SSDT里的显卡代码复制到DSDT中。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 19:35:32 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-8 19:21
哦,终于知道这帖子的目的了

嗯,目的就像标题所说的,主要是要减少错误,另外就是要得到dsl源代码文件。
像之前的那个201错误的DSDT,它是编译好的aml文件,只要是还存在错误,就不允许保存文件,这样,就完全不能修改DSDT了,必需硬改错误,而且真的很难改。修复所有错误,才能保存文件,才能对DSDT作其它的修改动作。
如果使用这个方法,我试过了,只要用这个命令,就可以生成一个没有错误的dsl,之后,要改什么就都可以用这个文件了,修改好后,编译成aml就可以直接使用了。
还有就是,打开aml有时之所以会出现那么多错误,其实这是编译器的不完善之处,就像中文和英文不能无缝转换一样。其实,电脑能够出厂使用,DSDT是不会有那么多错误的,这个方法就能够最大程度地还原那些代码,避免额外产生的错误。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 19:39:47 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-8 19:36
晕,反正我的没有这么奇葩的问题(ssdt除外)

嘿嘿,没有问题就好呢。
我最近的修改的经验也显示,SSDT的错误比DSDT的难改多了呢。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-8 19:51:36 IP属地云南 |显示全部楼层
kavenliang 发表于 2014-2-8 19:47
貌似ssdt加了星号就找不到文档

哦,星号是表示匹配任意字符呢,如果ssdt的名字是ssdt.aml,ssdt的后面没有其它字符的话可能就找不到。
另外还有就是,这个方法也不适合所有电脑的dsdt和ssdt,楼主也遇到过提示无法完成操作的提示呢。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-9 08:56:44 IP属地云南 |显示全部楼层
zmmwan 发表于 2014-2-9 01:16
对于反复编译出错的 dsdt,我们基本已经可以肯定是由于反编译过程的 bug 产生。理由如下:
一、d ...

感谢您提供的看法,遗憾写帖子时没有留备用楼,就不能把您的看法写到第一页了,我感到万分抱歉,我会在主楼指出43F有精彩回复的。再次感谢您的宝贵看法。
另外,就我现有的对ASL编程语言的认识,External语句的作用应该就是,声明这个对象(obj,即object),在开机运行代码时,需要到本文件的外部查找。
您的水平很高,以后还要想你多多学习呢。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-9 10:43:11 IP属地云南 |显示全部楼层
龙心梦飞 发表于 2014-2-9 10:40
用常规方法编译有显卡代码的ssdt错误一堆无法修复,楼主这是个好方法

嗯,这也是发帖的原因之一呢。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-2-12 14:51:10 IP属地云南 |显示全部楼层
xiao201261 发表于 2014-2-12 14:46
所以ssdt使用前必须先使用dsdt,不然无法加载ssdt

是的,SSDT的第一个 "S' 就是Second的首字母,相应的DSDT虽然没有First的首字母,但其实DSDT就是第一,SSDT就是第二,它们的联系很紧密。

Rank: 9

UID
3322572
帖子
7001
PB币
34744
贡献
0
技术
4737
活跃
929

远景技术达人 热心会员

发表于 2014-3-25 19:06:15 IP属地云南 |显示全部楼层
zmmwan 发表于 2014-3-25 18:20
在im上看到rehabman推荐的另一个命令 :iasl -da *.aml   

实践证明比iasl -d *.aml -e *.aml ...

多谢zm大神,马上更新。 :-)
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛