1, 系统实验 Debug Ubuntu 16 的ACPI
1.1 安装工具
sudo apt-get install acpidump
sudo apt-get install iasl
sudo apt-get install pmtools
在较新的 ubuntu 发行版中,可能有所变化,根绝提示即可成功安装上述工具。
1.2 查看 ACPI Table
$ ls /sys/firmware/acpi/tables/
这些信息的源头是 计算机的BIOS中存放的;在Linux 启动时 从BIOS中拷贝进来编译生成。
赋值DSDT到本地文件夹:
$ sudo cp /sys/firmware/acpi/tables/DSDT ./dsdt.dat
粗略看一下其中的内容为二进制格式:
1.3 对 DSDT 做反汇编
$ sudo iasl -d dsdt.da
可以发现得到了一个新的文件 dsdt.dsl
内容已经变成文本格式,比较长,有万行级,大体如下:
可知,dsdt反汇编后得到的文件是 ASL 源代码,这个ASL 语言在ACPI spec中定义。
1.4 修改 ASL 源文件 并编译
1.4.1 验证编译器正常工作
先不修改,只重新编译,验证一下是否能够编译通过,结果成功:
其中 dsdt.aml 文件 内容如下:
vim dsdt.aml
而 vim dsdt.hex 可以看到如下内容:
1.4.2 修改按钮的代码
在 dsdt.dsl 中查找 PWRB
未完待续。。。没想好改成什么样子
1.4.3 编译替换
$ iasl -tc dsdt.dsl
生成 dsdt.aml 和 dsdt.hex文件
1.5 使用新的 ASL
2,从一个具体问题开始发现 ACPI
首先我们做一个实验:
2.1 实验一:按电源按钮
当电脑正常运行的状态时,按一下电源键后电脑进入休眠;
当电脑进入休眠的状态时,按一下电源按键后电脑被唤醒进入正常运行的状态;
当电脑在休眠或运行状态时,按下电源按钮4s多后,电脑掉电关闭。
这是怎么做到的呢?
这是由计算机的 ACPI 软硬件系统实现的简单功能。
2.2 合上笔记本显示器
当电脑正常运行状态时,合上笔记本显示屏,笔记本进入休眠状态。(跟配置有关)
2.3 延伸思考
如果电脑中存在 gpu,一个pcie设备,那么当计算机从正常运行状态,变为休眠,那么pcie设备的状态怎么变化?与driver有什么关联?
2.4 计算机的四种 G_x 状态,及其下对应的 S_y 状态
G0: (Normal) 含:
S0
G1: (Sleep) 含:
S1:
S2:
S3:
S4:
G2: (Soft Off) 含:
S5: 只有ICH的部分数字逻辑和 Wake-up-LAN 数字逻辑供电
G3: (Mechanical Off):关机
3,ICH9 datasheet
第一个链接为下载地址:
https://www.intel.com/content/dam/doc/datasheet/io-controller-hub-9-datasheet.pdf
https://www.intel.com/content/dam/www/public/us/en/documents/specification-updates/io-controller-hub-9-family-specification-update.pdf
4,ICH9 中与 ACPI 相关的内容
ACPI 在系统中的位置如下:
进一步细化为如下结构:
根据 ACPI specification, 我们知道 ACPI的三大软硬件组成部分:
<1> ACPI Register
<2> ACPI BIOS
<3> ACPI Tables
而其中的 ACPI Register 包含如下必选和可选构成:
ACPI Register 详细信息在ACPI specification 6.5中罗列如下:
而其中,在ICH9中,充当PM1a_xxx的寄存器,和GPE寄存器组 的具体寄存器如下图所示:
下图内容来源于 ICH9 datasheet: