如何降低黑苹果的温度.DSDT屏蔽独显,SSDT,AGPM正确加载很重要

如何降低黑苹果的温度.DSDT屏蔽独显,SSDT,AGPM正确加载很重要,第1张

很多同学都还在为mac系统的高温不降烦恼,高温其实没那么可怕,

首先需要知道为什么mac系统的温度会这么高,

电脑的主要温度来源于CPU和显卡。

CPU温度和显卡温度降下来了,电脑温度还会这么高吗?

这就要选择适合自己的DSDT,SSDT了,这两个东西很重要,

第一、CPU温度高主要就是频率引起的,如果CPU长期高频不降,温度肯定下不来,

为什么CPU会高频不降呢,主要就是不能变频的问题,

或者是AGPM不能正确加载导致CPU高频不降,温度居高不下。

AGPM的正确加载和SMBIOS文件的关系很大,

需要选择一个合适的机型才能加载AGPM,

比如我选择的就是macbook pro 9.2,之前试过macbookpro 8.1,

发现就没加载AGPM,没做其他修改,就只是改了机型文件就成功加载了,

至于改机型也不能加载的同学请自行远景搜索加载AGPM的修改方法

论坛里有介绍,因为我原生可以加载就没研究了。

第二、就是由于独立显卡长期的高功率引起的CPU高频不降了。

由于现在很多的独显切换技术的原因,大部分笔记本独立显卡都是不能工作的,

虽然正确识别,但是不能切换, 不仅如此,而且还一直处于满负荷工作状态,

不仅耗电量巨大,还导致CPU一直高频率为它提供处理。

这个时候需要的就是DSDT屏蔽独立显卡了,

第三、就是一个适合自己的SSDT了,以前在网上下载过几个相同CPU的I5-3210M的SSDT文件,

虽然也能正确变频,频率还很多,但是总觉得不适合自己的电脑,

开机时会有PS,CS错误,也就是变频的错误。使用ssdtPRGen生成的原版SSDT呢档位太少,达不到满意。

忘了说了,当然做这些的前提是能加载原生的CPU电源管理和LPC,至于加载LPC,只需要在DSDT中搜索0x001F0000在搜索到的

Name (_ADR, 0x001F0000)正下方添加 如下代码,

Method (_DSM, 4, NotSerialized)

{

Store (Package (0x02)

{

"device-id",

Buffer (0x04)

{

0x18, 0x3A, 0x00, 0x00

}

}, Local0)

DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))

Return (Local0)

}

因为此代码会调用DTGP,所以还需要在DSDT中添加DTGP的函数。

DTGP的函数代码为,添加到DSDT的最后一个 } 之前就可以了。

Method (DTGP, 5, NotSerialized)

{

If (LEqual (Arg0, Buffer (0x10)

{

/* 0000 */0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,

/* 0008 */0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B

}))

{

If (LEqual (Arg1, One))

{

If (LEqual (Arg2, Zero))

{

Store (Buffer (One)

{

0x03

}, Arg4)

Return (One)

}

If (LEqual (Arg2, One))

{

Return (One)

}

}

}

Store (Buffer (One)

{

0x00

}, Arg4)

Return (Zero)

}

AppleIntelCPUPowerManagement.kext

AppleIntelCPUPowerManagementClient.kext

虽然很多人在DSDT修改了LPC可以加载原生电源管理,但是更大一部分人还是需要使用破解的

AppleIntelCPUPowerManagement.kext

才能不五国,才可以顺利进入系统。分享一份修改过的CPU电源管理,

10.9.4原版修改的,10.10上也在用,没发现什么问题。

基本原理

在电脑开机时(对应_INI method)和睡眠唤醒时(对应_WAK method)调用关闭Nvidia独显的Method。

这个网站http://hybrid-graphics-linux.tuxfamily.org/index.php?title=ACPI_calls总结了关闭Nvidia显卡的常见methods,还列举了一些机型的具体情况,大家可以去看看,弄清楚自己电脑关闭显卡的method究竟是哪个,然后结合这个帖子来修改DSDT.

正如上面那个网站所示,关闭Nvidia独显一般有两种方法:一、使用 _DSM + _PS3;二、直接用_OFF(或者DOFF,SGOF等等,有些机型是不同的);

虽然上面那个网站一般都是直接调用OFF()函数来关闭独显的,但个人觉得如果有_DSM和_PS3的话,先使用方法一比较好,因为方法二可能会有一些影响,比如CPU变频的问题。(具体请看参考帖子[教程] 解决Optimus 和CPU Turbo 变频冲突)。

具体方法

很多人喜欢把SSDT的显卡部分移到DSDT中然后添加关闭独显的代码,并且开机DropOEMSSDT只用DSDT。但是我个人觉得这样子很麻烦,首先在移动过程中可能会产生错误,而且Drop掉SSDT后,DSDT中的那些External variables,methods就无法access了,因此DSDT中用到这些Objects,Methods的地方就会产生问题。如果Drop SSDT的目的是为了使用clover和变色龙的Generate P-States和C-States的话,clover可以只Drop掉有CPU信息的SSDT,变色龙可以把除有CPU信息的其他SSDT放在Extra目录下再DropSSDT,所以我认为完全没有必要花时间来移动显卡部分或者其他东西。如果DSDT和SSDT要相互调用对方的函数,那就在definition block那里加上External就好了。(如果新人看不懂这一段就跳过吧)说了那么多废话,终于开始了。

注意,在修改DSDT和SSDT之前,可以用这个帖子介绍的方法先生成dsl文件,可以减少错误,还有其他错误自己爬帖解决。不过如果你某个DSDT或SSDT有错误不能解决但你不需要再把它编译成AML文件的话,可以不用管它。

方法一:搜索函数

首先在DSDT和SSDT中搜索找到要用的函数_WAK,_INI,_PS3,_DSM。_WAK一般只有一个。_INI可能有很多个,最好用\_SB.PCI0下或\_SB.PCI0.PEG0.PEGP的。_PS3只有一个,如果没有的话看方法二。_DSM会有很多个,一定要用\_SB.PCI0.PEG0.PEGP下的,如果\_SB.PCI0.PEG0.PEGP下没有,搜索看看Device(GFX0)下有没有,如果都没有就看方法二.(注意,以下步骤是默认你DSDT的相关methods为一般情况,若有不同需根据你自己的DSDT做相应更改)

方法一:在_WAK之前新建一个Method PINI()

Method (PINI, 0, NotSerialized)

{

\_SB.PCI0.PEG0.PEGP._DSM (Buffer (0x10)

{

/* 0000 */    0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,

/* 0008 */    0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0

}, 0x0100, 0x1A, Buffer (0x04)

{

0x01, 0x00, 0x00, 0x03

})

\_SB.PCI0.PEG0.PEGP._PS3 ()

}

方法一:在_WAK和适当的_INI中调用PINI()

_WAK和_INI可能不在同一个DSDT或SSDT中,没有关系

Method (_WAK, 1, Serialized)

{

PINI ()

......

[。。。省略。。。]

Method (_INI, 0, NotSerialized)

{

PINI ()

.......

}

方法一:编译错误

如果有类似以下的错误

Error Object does not exist (PINI)

在DefinitionBlock(在DSDT和SSDT的最上面)加上以下代码

External(PINI, MethodObj)

方法一:错误修正示范:

DefinitionBlock ("acpi_dsdt.aml", "DSDT", 1, "LENOVO", "CB-01   ", 0x00000001)

{

External (_SB_.PCI0.PAUD.PUAM, MethodObj)    // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above)

External (_SB_.PCI0.XHC_.DUAM, MethodObj)    // Warning: Unresolved Method, guessing 0 arguments (may be incorrect, see warning above)

External (_SB_.TPM_.PTS_, MethodObj)    // Warning: Unresolved Method, guessing 1 arguments (may be incorrect, see warning above)

External (_PR_.CFGD, FieldUnitObj)

External (_PR_.CPU0._PPC, IntObj)

External (_PR_.CPU0._PSS, PkgObj)

External (PINI, MethodObj)

如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._PS3)

在DefinitionBlock加上

External(_SB_.PCI0.PEG0.PEGP._PS3, MethodObj)

如果错误提示Object does not exist (\_SB.PCI0.PEG0.PEGP._DSM)

在DefinitionBlock加上

External(_SB_.PCI0.PEG0.PEGP._DSM, MethodObj)

方法一:保存编译

没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。

方法二:没有_PS3函数

如果没有_PS3函数,或者使用上面的方法没效果,那就试试这个方法吧。

在_WAK和适当的_INI里面加入\_SB.PCI0.PEG0.PEGP._OFF()

Method (_WAK, 1, Serialized)

{

\_SB.PCI0.PEG0.PEGP._OFF()

......

[。。。省略。。。]

Method (_INI, 0, NotSerialized)

{

\_SB.PCI0.PEG0.PEGP._OFF()

.......

}

方法二:编译错误

如果编译时有错误,像方法一的4中那样解决错误即可。

方法二:编译保存

没有错误了,编译,save AML,把修改了的DSDT.aml, SSDT.aml和其他所以没有修改的SSDT*.aml放在Extra目录(变色龙),或patched文件夹(Clover),这样的话要DropSSDT。开机,幸运的话,Nvidia显卡应该被屏蔽了。

查看是否生效

如何查看是否成功屏蔽Nvidia独显:打开“系统信息”→“图形卡/显示器”,若只有Intel显卡的信息就证明屏蔽成功。若成功了就支持一下吧!

1、在Windows的 设备管理器 中,找到 网络适配器,再找到自己的有线网卡(不同的电脑,名称不同)。

2、右键 有线网卡 名称,点击 属性。

3、在d出窗口,选择 “详细信息” 选项卡。

4、在界面中间的 属性 那里,选择 “BIOS 设备名称” 。

以上步骤,是 在 Windows 下确认 有线网卡 在 DSDT 中定义在什么位置,知道了位置,以便于我们在那里添加代码。 还可以在 Mac 下,用 IORegistryExplorer 软件,确认 有线网卡 在 DSDT 中定义在什么位置:

在已经驱动有线网卡的情况下,搜索 “eth” ,即可定位 有线网卡 在 DSDT 中的位在 EXP1 下 的 Device (PXSX6、确认位置后,就可以添加代码了。使用 MaciASL 软件,在定位到的地方,添加有线网卡内建代码:无线网卡 内建 的方法 类似。定位无线网卡在DSDT中的位置,再添加内建代码。在 Windows 的设备管理器,还可以查看到 各个 USB 接口的 id ,对于 内建USB接口会有帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11377548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存