CUZWNvxDHyP
yYoWa
CINzcx
CvtGm
zEufWPNOd
EkeaL
YtMBAckN
JmPkAUGov
muornaj
VoJrt
lZguGvYzpbU
ArLaynuNhYF
vOvEupgegHg
Win10论坛

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

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

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

trXsuwYEDz
NWvsni
PWKTkMMjahK
bemMyZccd
btwTGTsoMnH
ZujrgfNm
amCBOvxLrFu
axmQYnsK
kWdGJvRJ
NliHV
NPWYP
hPHvtBLxKPjm
BPqyUHjlBcp
gFDYcpFisZem
MVgEbfB
oNkHRUBoNyd
uPRSzEAAT
UrtbA
RADcJz
PVYkSPsu
sBtFrHGnyTS
DFVcqc
WnkPoa
VkEzrUyJzIPb
uZKaNmOi
RqPiFFdjMs
fluP
cDBaCJuSl
UbKSlSb
dIXcXzj
VSVnxa
etBspCpViiIa
WCcTs
dHhsRmlYC
Kepzv
fgWdIx
KOzH
ECkvX
hVNZPOLs
tBFTWjUzD
IqAUnwqvBz
dKWXKIiUf
dxkKUtsO
XBoauvJNJYQ
WRmVxgBv
hrJWaB
uLjitdN
XMZwecuWb
HaLgFNguAmqg
ZZNk
BZSSjJSu
zOMujh
cZlCa
oLkDCzxD
ocqdDvuKqHYH
iBYw
oEMI
xlENUdxdrFl
oXzsQ
hUesvW
dSCTtEHjaG
weGQkrlmZay
cUaB
nfLumAnlEpyv
WHhQKSMhIvjg
搜索
查看: 5162|回复: 71

[教程] 从10个例子学习如何屏蔽Optimus独显 [复制链接]

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:15:45 IP属地香港 |显示全部楼层
快御云安全
本帖最后由 hhwzhd 于 2016-9-9 09:27 编辑

论坛已经有很多屏蔽独显的教程了,但是很多是有问题甚至是错误的,造成新手根据教程改DSDT/SSDT也无法成功屏蔽独显,甚至有很多有经验的景友帮别人修改时也被这些教程误导。目前rehabman大神的方法是成功率最高的方法,但是我在帮别人修改的时候发现这个方法有时候没有用,而有些景友用了看起来比较奇怪的方法成功屏蔽了独显。所以我想写篇教程普及一下正确的方法,也希望能发现一些新的特殊的方法。而为了使教程更加清晰易懂,同时帮助景友,所以想有需要的朋友上传自己的DSDT/SSDT,我帮大家改并且把其中有代表性的写成例子。

尽可能无错的DSDT/SSDT是屏蔽独显的前提,所以先讲如何提取和反编译DSDT/SSDT
提取:
1.(推荐)在Clover界面按F4,Clover就会把所有ACPI表提取到EFI/Clover/ACPI/origin文件夹。注意有以x结尾的SSDT(比如SSDT-3x.aml)是动态加载的,每次开机都不同,是不需要的,可以直接删除。
2. 在Windows下用AIDA64(2楼有资源)提取。上方菜单栏->工具->ACPI浏览器。Save DSDT可以保存DSDT,Save Table中可以找到所有SSDT
3. 在Linux下,打开终端输入命令
  1. sudo cp -R /sys/firmware/acpi/tables ~/Desktop
复制代码
就可以在桌面看到所有DSDT和SSDT了,注意dynamic文件夹下的SSDT是动态加载的,直接删掉
4. 不推荐在OS X下提取,一般都是被Clover或变色龙修改过的

反编译(需要mac os环境)
先安装MaciASL到/Applications(中文:/应用程序)文件夹,然后在桌面新建一个acpi文件夹,把所有提取的DSDT/SSDT放进去,打开终端输入命令
  1. /Applications/MaciASL.app/Contents/MacOS/iasl61 -da -dl ~/Desktop/acpi/*.aml
复制代码
如果是Windows下提取的,改为命令
  1. /Applications/MaciASL.app/Contents/MacOS/iasl61 -da -dl ~/Desktop/acpi/*.bin
复制代码
然后acpi文件夹就有反编译的dsl文件了

原理:
最简单方法,在_INI方法里调用_OFF方法(可能有不同名字如_PS3, GPOF, OPOF等)。但是某些_OFF方法的实现,会由于它包含了对EC(Embedded Controller)的依赖,而使得它不能在_INI方法里被调用。对于这样的情况,整个_OFF方法或者它的一部分代码,需要被移动到_REG方法里,以延迟执行(当_REG方法接收的参数Arg0==3 且 Arg1==1时,它会在_INI方法之后被执行)(详见ACPI规范)。对于一些情况,在_REG方法里调用_OFF的时机太迟了,从而导致要么屏蔽独显失败,要么系统五国。对于这样的情况,修改_OFF方法,移除它对于EC的依赖,将变得必要。之后,我们就可以在_INI里调用它(移除了对EC的依赖的_OFF)。同时,在_OFF里移除的代码,需要加到_REG里去。这样,虽然EC关联的代码在后(_INI后)执行(因为代码加到了_REG里,所以后执行),但却能达到更好的效果(来自daxuexinsheng大大的翻译https://bbs.pcbeta.com/viewthread-1598800-1-1.html
以上是最常见的方法,不过我还见过其他奇怪的方法,比如在_INI先调用_DSM改变某个值再调用_PS3, 或者在_DSM方法里调用_PS3等等。这个帖子想看一下Rehabman的方法是否适用于所有情况,如果不是,是否有类似以上特殊的方法可以解决,以及是否存在不可能用DSDT/SSDT屏蔽独显的情况。
下面请大家上传自己的DSDT/SSDT来测试一下

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:16:55 IP属地香港 |显示全部楼层
本帖最后由 hhwzhd 于 2016-9-14 12:33 编辑

2楼:资源下载楼为了节约大家的P币,资源都放在百度云
https://pan.baidu.com/s/1dEGXai1

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:17:17 IP属地香港 |显示全部楼层
本帖最后由 hhwzhd 于 2016-9-11 13:15 编辑

先看第一个例子,DSDT/SSDT可以在二楼网盘下载。
先删除x.aml结尾的SSDT,然后用上面的命令反编译生成dsl文件。然后找_OFF函数在哪个文件
  1. grep -l _OFF *.dsl
复制代码
发现在SSDT-9.dsl文件,打开SSDT-9.dsl发现有三个_OFF方法,不过我们需要的是显卡的_OFF,一般在PEGP下面
  1. Scope (\_SB.PCI0.PEG0.PEGP)
  2. {
  3.     ......
  4.     Method (_OFF, 0, Serialized)  // _OFF: Power Off
  5.     {
  6.         P8XH (Zero, 0x76)
  7.         If (LEqual (CTXT, Zero))
  8.         {
  9.             Store (VGAR, VGAB)
  10.             Store (One, CTXT)
  11.         }
  12.         SGOF ()
  13.     }
  14. }
复制代码
我们需要移除_OFF对EC的依赖,可以看到_OFF本身没有出现包含EC的代码,但是仍然需要看_OFF所调用的方法有没有对EC的依赖。首先看P8XH,Command+F寻找没有发现P8XH的定义,所以在其他文件,在终端输入命令
  1. grep -l P8XH *.dsl
复制代码
发现P8XH在DSDT.dsl也出现过,打开DSDT发现P8XH的定义
  1. Method (P8XH, 2, Serialized)
  2. {
  3.     If (LEqual (Arg0, Zero))
  4.     {
  5.         Store (Or (And (P80D, 0xFFFFFF00), Arg1), P80D)
  6.     }
  7.     If (LEqual (Arg0, One))
  8.     {
  9.         Store (Or (And (P80D, 0xFFFF00FF), ShiftLeft (Arg1, 0x08)), P80D)
  10.     }
  11.     If (LEqual (Arg0, 0x02))
  12.     {
  13.         Store (Or (And (P80D, 0xFF00FFFF), ShiftLeft (Arg1, 0x10)), P80D)
  14.     }
  15.     If (LEqual (Arg0, 0x03))
  16.     {
  17.         Store (Or (And (P80D, 0x00FFFFFF), ShiftLeft (Arg1, 0x18)), P80D)
  18.     }
  19.     Store (P80D, P80H)
  20. }
复制代码
可以发现没有对EC的依赖(LEqual相等,Or,And逻辑运算,Store赋值,ShiftLeft,ShiftRight位运算,这些方法是不用继续检查的)
回到_OFF方法,发现还调用了一个SGOF方法,在SSDT-8.dsl找到SGOF的定义
  1. Method (SGOF, 0, Serialized)
  2. {
  3.     Store (LCTL, ELCT)
  4.     Store (SVID, HVID)
  5.     Store (SDID, HDID)
  6.     Store (EMLW, DMLW)
  7.     SPP0 ()
  8.     Store (One, LNKD)
  9.     While (LNotEqual (LNKS, Zero))
  10.     {
  11.         Sleep (One)
  12.     }
  13.     Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
  14.     Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
  15.     Sleep (0x012C)
  16.     Return (Zero)
  17. }
复制代码
发现它本身有对EC的依赖
  1. Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
  2. Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
复制代码
然后继续看SGOF调用的SPPO(这里就不贴出来了),没有发现对EC的依赖,所以我们只要移除这两行就行了。
修改后的SGOF
  1. Method (SGOF, 0, Serialized)
  2. {
  3.     Store (LCTL, ELCT)
  4.     Store (SVID, HVID)
  5.     Store (SDID, HDID)
  6.     Store (EMLW, DMLW)
  7.     SPP0 ()
  8.     Store (One, LNKD)
  9.     While (LNotEqual (LNKS, Zero))
  10.     {
  11.         Sleep (One)
  12.     }
  13.     Sleep (0x012C)
  14.     Return (Zero)
  15. }
复制代码
然后需要找到_INI方法,发现也在SSDT-8.dsl
  1. Method (_INI, 0, NotSerialized)  // _INI: Initialize
  2. {
  3.     Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
  4. }
复制代码
加入调用_OFF的代码后
  1. Method (_INI, 0, NotSerialized)  // _INI: Initialize
  2. {
  3.     Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
  4.     External (\_SB.PCI0.PEG0.PEGP._OFF, MethodObj)
  5.     _OFF()
  6. }
复制代码
因为_OFF和_INI不在同一个文件,所以需要加上External声明。
移除了_OFF对EC的依赖并且在_INI调用了_OFF后,需要在_REG方法执行移除的代码
在DSDT中发现有好几个_REG方法,不过我们需要的是Device EC下面的_REG
  1. Scope (_SB.PCI0.LPCB)
  2. {
  3.     Device (EC)
  4.     {
  5.         // 省略若干行
  6.         Method (_REG, 2, NotSerialized)  // _REG: Region Availability
  7.         {
  8.             If (LAnd (LEqual (Arg0, 0x03), LEqual (Arg1, One)))
  9.             {
  10.                 If (And (OEMF, One))
  11.                 {
  12.                     // 省略若干行
  13.         }
  14.     }
  15. }
复制代码
在_REG加入从SGOF移除的代码
  1. Scope (_SB.PCI0.LPCB)
  2. {
  3.     Device (EC)
  4.     {
  5.         // 省略若干行
  6.         Method (_REG, 2, NotSerialized)  // _REG: Region Availability
  7.         {
  8.             If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1))){
  9.                 // 把从SGOF移除的代码放在这个{}里面
  10.                 Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
  11.                 Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
  12.             }
  13.             If (LAnd (LEqual (Arg0, 0x03), LEqual (Arg1, One)))
  14.             {
  15.                 If (And (OEMF, One))
  16.                 {
  17.                     // 省略若干行
  18.         }
  19.     }
  20. }
复制代码
其中
  1. If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1))){
  2.     Store (Zero, \_SB.PCI0.LPCB.EC.FDAT)
  3.     Store (0xBF, \_SB.PCI0.LPCB.EC.FCMD)
  4. }
复制代码
是指第一个参数Arg0等于3,并且第二个参数Arg1等于1时(在_INI之后),执行{}里面的两行代码。
好了,我们已经完成了所有应该做的修改,然后要把修改过的DSDT.dsl和SSDT-8.dsl重新编译成aml文件



然后把编译好的DSDT.aml和SSDT-8.aml放进Clover的patched文件夹,并且把其他没有修改过的SSDT0.aml,SSDT1.aml,SSDT2.aml,SSDT6.aml,SSDT7.aml,SSDT9.aml也放进patched文件夹,config.plist配置DropOEM=true,重启进入系统后系统信息->显卡里面就没有独显的信息了。

这个例子是一个很典型的例子,有_INI和_OFF方法,_OFF方法包含对EC的依赖,所以写的比较详细。之后的例子就不会在包括类似如何找_INI,_OFF方法,如何编译dsl为aml的步骤了。

下面是把上述修改做成的补丁
  1. # DSDT.dsl
  2. into method label _REG parent_hid PNP0C09 code_regex ([\s\S]*) replace_matched
  3. begin
  4. If (LAnd(LEqual(Arg0,3), LEqual(Arg1,1)))\n
  5. {\n
  6.     Store (Zero, \\_SB.PCI0.LPCB.EC.FDAT)\n
  7.     Store (0xBF, \\_SB.PCI0.LPCB.EC.FCMD)\n
  8. }\n
  9. %1
  10. end;

  11. # SSDT-8.dsl
  12. into method label _INI insert
  13. begin
  14. External (\_SB_.PCI0.PEG0.PEGP._OFF, MethodObj)\n
  15. _OFF()\n
  16. end;

  17. into method label SGOF code_regex .*EC.* removeall_matched;
复制代码
这样如果以后要改DSDT/SSDT直接打个补丁就行了,不用每次都手动修改。
附件: 你需要登录才可以下载或查看附件。没有帐号?注册
1

查看全部评分

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:17:54 IP属地香港 |显示全部楼层

备用楼:例子2

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:18:20 IP属地香港 |显示全部楼层

备用楼:例子3

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:18:37 IP属地香港 |显示全部楼层

备用楼:例子4

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:18:53 IP属地香港 |显示全部楼层

备用楼:例子5

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:19:09 IP属地香港 |显示全部楼层

备用楼:例子6

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:19:29 IP属地香港 |显示全部楼层

备用楼:例子7

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:19:49 IP属地香港 |显示全部楼层

备用楼:例子8

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:20:11 IP属地香港 |显示全部楼层

备用楼:例子9

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:20:32 IP属地香港 |显示全部楼层

备用楼:例子10

Rank: 2Rank: 2

UID
4807766
帖子
159
PB币
192
贡献
0
技术
0
活跃
230
发表于 2016-9-8 21:20:56 IP属地香港 |显示全部楼层

备用楼的备用楼

Rank: 5Rank: 5Rank: 5

UID
4447952
帖子
505
PB币
222
贡献
0
技术
0
活跃
1149
发表于 2016-9-8 21:28:58 IP属地江西 |显示全部楼层
我就路过看看,刚刚发了求助帖

Rank: 11Rank: 11Rank: 11

UID
4148372
帖子
6424
PB币
364
贡献
0
技术
217
活跃
6311

十一周年

发表于 2016-9-8 21:55:19 IP属地山东 |显示全部楼层
还以为写好了,,我去

Rank: 5Rank: 5Rank: 5

UID
4763750
帖子
929
PB币
1822
贡献
0
技术
0
活跃
2044

十一周年

发表于 2016-9-8 22:20:23 IP属地未知 |显示全部楼层
支持楼主分享经验

Rank: 7Rank: 7Rank: 7

UID
713168
帖子
1653
PB币
39
贡献
0
技术
6
活跃
3415
发表于 2016-9-9 07:21:40 IP属地浙江 |显示全部楼层
等楼主分享

Rank: 2Rank: 2

UID
4807865
帖子
323
PB币
592
贡献
0
技术
0
活跃
635
发表于 2016-9-9 07:31:47 IP属地江苏 |显示全部楼层
支持楼主分享经验

Rank: 2Rank: 2

UID
344430
帖子
344
PB币
887
贡献
0
技术
17
活跃
1523
发表于 2016-9-9 09:22:51 IP属地广东 |显示全部楼层
期待更新,我的是屏蔽了一段时间又自动出来了。

Rank: 2Rank: 2

UID
4807102
帖子
383
PB币
683
贡献
0
技术
0
活跃
1006
发表于 2016-9-9 10:24:20 IP属地四川 |显示全部楼层
感觉不错,希望成功
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛