如果你的系统有电源管理方面的问题,比如关机、挂起,笔记本电池等等, 或者是硬件传感器方面的问题,如CPU温度检测,风扇状态控制等,你可以考虑一下 是否是你的ACPI(Advanced Configuration and Power Interface)出了问题。
我们需要一个软件来处理dsdt,Intel提供了一个工具叫做 iasl(下载的是较小的 Unix Build Environment):
生成的可执行文件iasl,可以拷贝出来单独使用。
得到系统当前使用的dsdt,生成asl文件dsdt.dsl:
编译dsdt.dsl文件:
iasl -sa dsdt.dsl根据输出的Error,Warning信息修改dsdt.dsl文件,再次编译,直到
使用新的dsdt.aml代替BIOS中的版本:
cp /boot/initrd.img-2.6.20-16-generic /boot/initrd.img-2.6.20-16-generic-bak在实例讲解怎样出错之前,我们先来了解一下DSDT文件的语法
One对象有了个新名字SWIT
将0x02存储到Local0标示的一段内存中。
Method (INCS, 1, NotSerialized)
定义一个函数INCS,INCS带1个参数等等。函数名也可以是规范中定义的一个对象名。
Multiply (Local0, 0x04, Local1)
Local0中的数据乘以0x04,结果保存在Local1
CreateDWordField (BUF1, Local2, CAPB)
为标示为BUF1的一段内存中第Local2个字节开始的4个字节(Dword:Double word)命名为CAPB
将CAPB中的值和0xFFFFFFFC按位与后,保存在CAPB中
这是一件令人头痛的事,我所能做的,只是依据编译时的错误(警告)信息,参考 《ACPI规范》 , 做一些语法上的修正。
错误信息:
dsdt.dsl 323: Method (_CST, 0, NotSerialized)查看323行开始的一段代码:
Method (_CST, 0, NotSerialized)我把Else分句去掉了,但保留分句中的内容不变。这样整个语意不变,而相应的Warning去掉了。
错误信息:
dsdt.dsl 1177: Method (_OSC, 5, NotSerialized)很清楚,_OSC的参数是4个,把Method中的5改作4即可。
错误信息:
dsdt.dsl 1193: And (CAPB, 0xFFFFFFFC)查阅规范,And还可有第3个参数,用以存放比较后的值,我直接改为:
And (CAPB, 0xFFFFFFFC, CAPB)我完全没把握这个改动是否恰当,因为它改变了内存中CAPB标示的一段内容
错误信息:
dsdt.dsl 1935: Method (INCS, 1, NotSerialized)查看相应的代码:
Method (INCS, 1, NotSerialized)这里的错误是,如果所有If都不满足,Method将没有返回值。因为我不知道前面的If中为什么是那些值,我在最后添加了个Return(Zero),随便返回了个Zero对象,也不知是否会被正确处理。但至少,编译又少了个Warning
许多Error或Warning是相关连的,解决1个往往连带消除好几个。 比如1个Not all control paths return a value类警告的修正, 会连带消除相关的Reserved method must return a value 和Called method may not always return a value警告
而Ubuntu的 HowTo 则参考了上面的教程。
我在 这里 还发现了一个和我一模一样的dsdt。去它的论坛上 问 了一下。回说论坛刚被黑过,所有附件都丢失了,估计原始帖除了这个附件,也没有什么实质性内容。
BenQ S73U似乎也有类似问题,而且 它的dsdt 和我的很相像。
当然ACPI还有个操作系统的支持问题。事实上,因为我的神舟L205T总是死不瞑目,关机时不能关闭电源,我开始找寻ACPI问题的解决办法,到现在,编译了自己的dsdt,问题依旧,我看Ubuntu的这个 bug报告 ,难兄难弟还真是不少。现在看来,内核的ACPI支持部分出了问题,可能性更大一点,毕竟MS Windows下关机正常。
评论