p.H 发表于 2012-6-5 13:37

自定义SSDT - 10.7.4电源管理优化 - 图文版

本帖最后由 p.H 于 2012-6-19 09:56 编辑

视频版链接:

自定义SSDT - 10.7.4电源管理优化 - 视频版

前言:10.7.4的升级,不像之前的升级那样不痛不痒
这次的升级由于升级了电源管理驱动(AppleIntelCPUPowerManagement.kext),引起了许多的问题
例如跑分得分减半,频率被锁,或者直接五国等诸多问题
之前针对这些问题,也有发过相关帖子,有兴趣的也可以参考一下:
10.7.4之后一些黑苹果的重要更新(持续更新)
10.7.4升级后的种种(5月14日更新OpenCL解法)

现在我们主要针对SSDT来进行一些讨论:
首先说说SSDT的基本概念,以下内容摘自ACPI规范:5.2.11.2 Secondary System Description Table (SSDT)
Secondary System Description Tables (SSDT) are a continuation of the DSDT.
The SSDT is comprised of a system description table header followed by data in Definition Block format.
There can be multiple SSDTs present.
After OSPM loads the DSDT to create the ACPI Namespace, each secondary system description table listed in the RSDT/XSDT with a unique OEM Table ID is loaded.
Note: Additional tables can only add data; they cannot overwrite data from previous tables.
This allows the OEM to provide the base support in one table and add smaller system options in other tables.
For example, the OEM might put dynamic object definitions into a secondary table
such that the firmware can construct the dynamic information at boot without needing to edit the static DSDT.
A SSDT can only rely on the DSDT being loaded prior to it.
拙译如下:
5.2.11.2 Secondary System Description Table (SSDT)
Secondary System Description Tables (SSDT)是DSDT的延续
SSDT是由系统描述表再加上定义块(Definition Block)格式的数据构成的
可以有若干个SSDT表同时存在
在OSPM加载了DSDT并为ACPI创建了命名空间后,
每个拥有唯一OEM ID且在RSDT/XSDT下的的SSDT会被加载
注意:额外的表只能够用来添加数据,他们不能够改写先前表中的数据
这使得OEM能够在一个表中提供基本支持,而在其他的表中添加更细微的系统选项
例如,OEM可能在第二个表中定义动态物件从而使固件能够在启动时建立动态信息而不需要更改静态的DSDT
SSDT必须建立在先加载的DSDT基础之上

现在我们基本上对SSDT有了一个初步的认识后
你可能会好奇,我的SSDT呢?我要如何获得我自己的SSDT?
下面的链接,将会你告诉你DSDT以及SSDT的提取步骤
黑苹果必读FAQ---初阶篇(5月14日更新)章节三

学习完了上面的基础知识后,我们可以正式开始我们的SSDT内容

首先是相关的工具及附件:
这次并不需要太多工具,基本上有DSDT Editor就够了
最新的DSDT Editor 0.8版:
一个查看P-states的kext:

以下内容适用Sandy Bridge用户

检测Sandy Bridge系列CPU SpeedStep(变频)最好的方法:使用MSRDumper的内核拓展(kext)来读取含有当前P-State的MSR(Machine Specific Register)并且记录它
这个方法的一个缺点就是如果你长时间加载MSRDumper.kext的话它会产生大量内核日志文件,当日志文件达到1000K时,它会自动保存并创建另外一个内核日志文件最终这将占据相当大的一部分硬盘空间因此,下面我将会叙述如何在终端中加载与停止加载它的方法
要做到第一件事便是更改MSRDumper.kext的权限注:为了统一起见并减少出现各式各样的问题的可能性,均采用放置桌面来统一化代码,如果会终端,则不必拘泥于此下载了附件之后,先双击解压,得到MSRDumper.kext,并把它移动到桌面,之后在终端中输入下列命令:
cd desktop
sudo chown -R 0:0 MSRDumper.kext
https://bbs.pcbeta.com/data/attachment/album/201206/05/121521c2dpwzcvwm4mgqg1.png
https://bbs.pcbeta.com/data/attachment/album/201206/05/121522fx7fpmvpobeeepfb.png

当你想加载MSRDumper.kext的时候,输入下列命令:(请确保桌面有MSRDumper.kext)
cd desktop
sudo kextload MSRDumper.kext
https://bbs.pcbeta.com/data/attachment/album/201206/05/1215229s4q3snq9r53sqyq.png

接着,在控制台里面单击内核日志你就能够看到如下显示内容:
May 12 20:30:02 MacMans-MacBook-Pro kernel: MSRDumper CoreMulti(31)
May 12 20:30:02 MacMans-MacBook-Pro kernel: MSRDumper PStatesReached: 8 11 15 19 23 25 26 27 28 29 30 31 33 34
May 12 20:30:02 MacMans-MacBook-Pro kernel: MSRDumper CoreMulti(31)
May 12 20:30:02 MacMans-MacBook-Pro kernel: MSRDumper PStatesReached: 8 11 15 19 23 25 26 27 28 29 30 31 33 34

Note: These log entries are from my Early 2011 MacBook Pro.

MSRDumper CoreMulti(31)显示了目前的P-state是31MSRDumper PStatesReached: 8 11 15 19 23 25 26 27 28 29 30 31 33 34则显示了自从加载MSRDumper.kext后,所有可见的P-states
第一次加载MSRDumper.kext的时候需要有点耐心因为读取P-states需要一定的时间而且你可能需要运行一些大型程序来改变当前P-states所处的状态https://bbs.pcbeta.com/data/attachment/album/201206/05/121524sircj6js8epexssz.png
要停止MSRDumper继续运行产生大量信息,输入以下命令:(同样请确保桌面有MSRDumper.kext)
cd desktop
sudo kextunload MSRDumper.kext

https://bbs.pcbeta.com/data/attachment/album/201206/05/121523038c18yj1uora0gm.png






上述的MSRDumper.kext的问题搞定之后,我们再来看看SSDT
Credits to MacMan:http://macmanx86.blogspot.com/2012/05/customizing-ssdt-power-management.html

以下内容以SandyBridge平台的CPU为例,但不局限于SandyBridge,稍加变通即可

因为“关于本机”所使用的自动检测最大只能报告4.2GHz的CPU频率所以我决定将MultiBeast内为超频用户提供的SSDT最大频率也限制在4.2GHz
在过去的几天里,有许多人都在询问如何通过自定义SSDT来在更高的CPU频率上运行以及如何在未超频的系统上,看到更多的P-states这篇教程目的在于解释SSDT内容以及自定义SSDT的方法
这里强调一点,如果你决定要使用SSDT的话,那么你需要对变色龙参数做如下设置:打开chameleon wizard,确保你与下图红色方框中的内设置一致:


先让我们看看SSDT代码的第一个模块
    External (\_PR_.CPU7, DeviceObj)
    External (\_PR_.CPU6, DeviceObj)
    External (\_PR_.CPU5, DeviceObj)
    External (\_PR_.CPU4, DeviceObj)
    External (\_PR_.CPU3, DeviceObj)
    External (\_PR_.CPU2, DeviceObj)
    External (\_PR_.CPU1, DeviceObj)
    External (\_PR_.CPU0, DeviceObj)
这个模块里面定义了实际或超线程可用CPU核心的个数而在这个例子中,我们定义了8个CPU核心如果你的CPU并没有那么多(例如酷睿i3或i5)把从External (\_PR_.CPU4, DeviceObj)到External (\_PR_.CPU7, DeviceObj)的内容删除掉也是没问题的但是如果你删除了的话,你需要在SSDT尾部删除其他与Scope (\_PR.CPU4) 到 Scope (\_PR.CPU7)相对应的条目这是我的SSDT对应截图:https://bbs.pcbeta.com/data/attachment/album/201206/05/13202754dh5hnd2wan25ds.png


现在让我们进入下一部分:
Scope (\_PR.CPU0)
    {
      Name (APSN, 0x04)
      Name (APSS, Package (0x1B)
      {

这里我们在定义CPU0的详细信息第一行是把0x4赋给APSN,这是一个Apple规范的物件(Apple-specific object)下一个APSS同样也是一个Apple规范的物件但是它与ACPI规范中的 _PSS 物件定义是一致的这一行的关键在于Package (0x1B)0x1B是一个16进制数,它标志着APSS内部含有的定义个数而0x1B换算成十进制就是27这意味着我们定义了27个状态(P-State)
接下来,让我们一起来看看添加了ACPI规范注释的 _PSS
Package (0x06)
            {
                0x1068,   // CoreFreq
                Zero,      // Power
                0x0A,      //TransitionLatency
                0x0A,      //BusMasterLatency
                0x2A00,// Control
                0x2A00   // Status
            },
以下内容来源ACPI规范--8.4.4.2章节https://bbs.pcbeta.com/data/attachment/album/201206/05/132026ll3fp6iyffurdqrl.png

所以在我们这个例子中,CoreFreq为0x0168,换算成十进制就是4200或者4.2GHzApple似乎省略了Power的值但你也可以使用主板提取的SSDT中Power的原始值我发现Latency 和Bus Master Latency 的值一直是0x0A下面是最后两个值,0x2A00也就是4200现在我们不考虑后面的两个0并只考虑前面的两个数值MSRDumper将能够显示这两个数对应的十进制数值所以当系统运行在4.2GHz时,MSRDumper会显示P-State处在42
让我们继续分析下一个条目:
Package (0x06)
            {
                0x1004,
                Zero,
                0x0A,
                0x0A,
                0x2900,
                0x2900
            },
这里0x1004换算成十进制就是4100或者4.1GHz而后面的两个0x2900舍去两个0,0x29换算成十进制就是41,就这么简单如果你继续对照下去,你会发现:每变化一个状态,CoreFreq的值减少0x64(十进制100),Control和Status的值减少1最后一项的CoreFreq应该是0x0640(换算成十进制就是1600),Control和Status是0x1000这和Sandy Bridge桌面CPU最低频率为1600或者1.6GHz相符合
Name (_PSS, Package (0x0D)
      {
            Package (0x06)
            {
                0x09E5,
                0x61A8,
                0x0A,
                0x0A,
                0x13,
                0x13
            },
            Package (0x06)
            {
                0x095F,
                0x5B5E,
                0x0A,
                0x0A,
                0x12,
                0x12
            },
            Package (0x06)
            {
                0x08DA,
                0x554B,
                0x0A,
                0x0A,
                0x11,
                0x11
            }, 以上是我的SSDT中的 _PSS 部分代码段
因为我的CPU不是Sandy Bridge系列,而是i3-380M
所以与上面的数据有一些出入,但是大体的问题仍然一样
0x09E5-0x095F=0x86=134(十进制)    符合我的CPU外频频率
0x13=19(十进制) 符合我的CPU最高倍频为19到这里,你也可以对照一下自己的SSDT看看像我有多个SSDT,所以打开每个SSDT来看一看,搜索一下对应的关键字便可
接下来让我们继续研究下一个Scope
Scope (\_PR.CPU1)
    {
      Method (APSS, 0, NotSerialized)
      {
            Return (\_PR.CPU0.APSS)
      }
    }
这里表示的是,我们将不把CPU0的信息在这里无谓的复制到别的CPU核心而是通过让SSDT返回我们为CPU0所定义的信息的方法来达到CPU1与CPU0信息相同的结果当然,你也可以为每一个核心定义各自的P-State,但这相当耗时我所描述的这个方法简单多了而且工作量也小这是我的SSDT中对应的截图:不难发现,除了返回了CPU0的 _PSS,还返回了CPU0的 _PPC   _PCT   _PSDhttps://bbs.pcbeta.com/data/attachment/album/201206/05/132029ynnxwfzasv2h3nkf.png


最后我们可以来讨论自定义SSDT时,需要做哪些改变如果你删除了某些P-State,你必须在Name (APSS, Package (0x1B)的Package()里减少相应的值MultiBeast中i7的SSDT最大频率为3.9GHz这意味着,最上面的条目看起来应该像这样:
Name (APSS, Package (0x18)
      {
            Package (0x06)
            {
                0x0F3C,
                Zero,
                0x0A,
                0x0A,
                0x2700,
                0x2700
            },
所以Package()里面的值由0x1B减去3得到0x18并且第一个package中CoreFreq为0x0F3C(换算成十进制就是3900或3.9GHz)Control和Status则为0x2700(换算成十进制就是39)
类似的,如果你想增加state,记得每次向CoreFreq增加0x64,向Control和Status增加1并确保Name (APSS, Package (0x18)中Package()内的数值和你最终定义的P-States状态数相符合
其实最好的办法,就是如果你修改了Package里面定义的个数那么你就把原来的Package(0x18)中括号的内容去掉,改为Package()这样在编译的时候,机器会自动帮你计算,也省去了人为计算错误的麻烦
但是我们必须要知道,AppleIntelCPUPowerManagement能处理的状态数是有限的如果你定义的P-States比你能使用的还多的话例如在未超频的机器上使用为超频定制的SSDT你将会失去P-States里面频率最低的那几个状态当我在最高频率为3.8GHz的系统上使用MultiBeast为最高频率为4.2GHz超频定制的SSDT时通过MSRDumper,你将能得到如下结果:MSRDumper PStatesReached: 16 23 24 25 26 27 38而如果正常使用MultiBeast i7的SSDT时,则得到如下结果:MSRDumper PStatesReached: 16 17 18 19 20 21 35 36 37
你可能觉得不以为然?好吧,这和能耗有关P-State(CPU频率)越低,能耗越低所以从长远的角度来说,使用超频的SSDT将使你在能耗上面花费更多
希望大家都能够从这份教程中得到帮助




p.H 发表于 2012-6-5 13:37

本帖最后由 p.H 于 2012-6-5 19:41 编辑

经过鄙人实验,证实在 _PSS 的Package()内容中,删除部分信息能够改变变频档数例如,我删除了x19-x17 3个档位的数据
重启之后,可以发现,CPU变频最高就为x16
而且跑分也是严重下降,符合之前的预想

shiniv 发表于 2012-6-5 13:38

SSDT还真没用过,研究研究去。。

a455157528 发表于 2012-6-5 13:39

首先拿到前排。然后仔细看帖。顺便说一句支持

绝情奶牛 发表于 2012-6-5 13:39

本帖最后由 绝情奶牛 于 2012-6-5 15:31 编辑

推荐使用0.7版本的dsdt editor,使用0.7版本编译通过的DSDT,用0.8版本编译可能会出错

p.H 发表于 2012-6-5 13:42

绝情奶牛 发表于 2012-6-5 13:39 static/image/common/back.gif
推荐使用0.7版本的dsdt editor,使用0.7版本编译通过的DSDT使用0.8版本编译的话可能会出错

嗯。都是这样的,高版本只会更严格

媛懒如此 发表于 2012-6-5 13:43

话说哥们的core二代cpu就没这烦恼......{:5_264:}还没用过ssdt....

绝情奶牛 发表于 2012-6-5 13:45

媛懒如此 发表于 2012-6-5 13:43 static/image/common/back.gif
话说哥们的core二代cpu就没这烦恼......还没用过ssdt....

直接使用变色龙参数?

p.H 发表于 2012-6-5 13:45

媛懒如此 发表于 2012-6-5 13:43 static/image/common/back.gif
话说哥们的core二代cpu就没这烦恼......还没用过ssdt....

0-0
SSDT可以提供更多的自定义环节
如果怕温度高,可以直接把高频环节直接删掉就好

媛懒如此 发表于 2012-6-5 13:47

绝情奶牛 发表于 2012-6-5 13:45 static/image/common/back.gif
直接使用变色龙参数?

是的,一直用没撒问题哈哈....

媛懒如此 发表于 2012-6-5 13:48

p.H 发表于 2012-6-5 13:45 static/image/common/back.gif
0-0
SSDT可以提供更多的自定义环节
如果怕温度高,可以直接把高频环节直接删掉就好

我还超频呢.....不过最近天气热,就不敢啦....{:5_264:}

p.H 发表于 2012-6-5 13:51

媛懒如此 发表于 2012-6-5 13:48 static/image/common/back.gif
我还超频呢.....不过最近天气热,就不敢啦....

好吧,台式机,就是不一样 T_T

ipoison 发表于 2012-6-5 14:22

DSDT总有错误无法修复……郁闷中……

luckylz 发表于 2012-6-5 15:10

第一个来收藏!
DSDT基本搞懂了,现在轮到SSDT了~

victorfeng 发表于 2012-6-5 16:48

谢谢版主。请版主再指教一下 Method (ACST, 0, NotSerialized)的设置。

khmsoft 发表于 2012-6-5 16:58

绝情奶牛 发表于 2012-6-5 13:39 static/image/common/back.gif
推荐使用0.7版本的dsdt editor,使用0.7版本编译通过的DSDT,用0.8版本编译可能会出错

MAC 我只是看效果,所有的编辑都在WIN7系统下搞

659746321 发表于 2012-6-5 17:04

CoreFreq 这个指为 zero 也可以用的,我机是这样只要Control和Status有就好了。

p.H 发表于 2012-6-5 17:08

659746321 发表于 2012-6-5 17:04 static/image/common/back.gif
CoreFreq 这个指为 zero 也可以用的,我机是这样只要Control和Status有就好了。

原来是这样啊,这个我倒没试过

659746321 发表于 2012-6-5 17:16

p.H 发表于 2012-6-5 10:08 static/image/common/back.gif
原来是这样啊,这个我倒没试过

Sandy Bridge有点不一样,哈哈

p.H 发表于 2012-6-5 17:18

659746321 发表于 2012-6-5 17:16 static/image/common/back.gif
Sandy Bridge有点不一样,哈哈

嗯。 你的是SB么?我的不是,所以写帖子的时候,有点无奈
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 自定义SSDT - 10.7.4电源管理优化 - 图文版