ACPI 高级电源管理
ACPI 中定义了 G、D、S、C、P 这 5 个大的电力状态。
G 状态 Global system state
G 状态表示的是用户看到的整个系统的电力状态。
-
G0 运行模式。向硬件提供电源,软件可以运行的状态。
-
G1 停止模式。所谓的待机或休眠状态。
-
G2 软件为关闭状态,应将消耗若干电力状态。
-
G3 系统完全关闭,电源关闭的状态。
S 状态
-
S0 运行模式,与 G0 相同。
-
S1 到恢复为止的延迟时间较少的停止模式。 CPU 的上下文不会丢失。
-
S2 丢失 CPU 和系统缓存上下文。这些上下文需要在系统唤醒时进行恢复。在 Linux 中与 S3 相同。
-
S3 丢失除软件以外的系统上下文。这些上下文需要在操作系统唤醒时进行恢复。
-
S4 最省电。到恢复为止花费时间最多的停止模式。停止向所有设备提供电源
-
S5 除了不保存上下文以外,其它与 S4 相同。 S5 在恢复时进行的处理与普通的操作系统相同。与 G2 含义相同。
D 状态
Device Power State 定义的是各个设备的电力状态,设备的状态有如下内容:
- 耗电量
- 保存设备内寄存器上下文的状态
- 直到设备驱动程序可使用为止必须进行的操作量
- 直到设备可使用为止需要的时间
不同的子状态描述如下:
-
D0 设备可以完全运行的状态。所有上下文全部有效,最耗电。
-
D1 对于每个设备的意义不同。一般来说,耗电量比 D0 少,丢失的上下文比 D2 更少
-
D2 对于每个设备类型的意义也不同。一般来说,耗电量比 D1 更少,丢失的上下文比 D1 更多。
-
D3hot 对于每个设备类型的意义不同。D3hot 状态的设备主电源开启,可以从软件访问设备。但上下文是否能保留取决于实际安装的设备。D3 设备电源完全断开的状态。设备的上下文全部丢失,到恢复为止花的时间最长。在 PCI 用语中称为 D3cold。PCI 中常常将 D3hot 与 D3cold 统称为 D3
C 状态
Processor Power State 是 G0 中 CPU 空闲时进行的省电模式。
-
C0 运行中的状态。通常的运行模式。
-
C1 CPU 停止状态。使用 hlt 命令停止 CPU 的时钟,到恢复为止几乎没有延迟时间,软件不需进行特殊处理。
-
C2 总线的时钟也停止。恢复所花费的最长延时时间传递给 ACPI 的固件,操作系统基于这个延时时间判断使用 C1 还是 C2。
-
C3 将花费时间最长的延迟传递给 ACPI 固件,操作系统使用这个延迟时间判断使用 C2 还是 C3。操作系统需要考虑缓存的同步。
使用 C 状态时要注意,C 状态的程度越深,恢复到 C0 状态所需的时间越长。
P 状态
全称为 Device and Processor Performance State
P 状态是以控制电量消耗来降低设备或 CPU 的性能,对 D0 状态的设备、C0 状态的 CPU 进行了更细致的划分。
-
P0 通常的模式。以最高性能、最大耗电量运行。
-
P1 运行在低于最高性能、最大耗电量的模式 Pn n 的值越大,性能和耗电量越低。
ACPI 的结构
- ACPI 系统描述表
- ACPI 寄存器
- ACPI BIOS
ACPI 描述表在 ACPI 的接口中是核心的组件,提供 ACPI 寄存器等信息。ACPI BIOS 可以 提供 ACPI 系统描述表以及启动、停止、唤醒等功能。
两个编程模型
ACPI 的硬件模型有下面两种:
固定硬件编程模型
通用硬件编程模型
AML 是二进制码,通过编译 ACPI Source language 来生成。操作系统分析 AML 将 AML中 所写的内容按照解释器来执行。
ACPI 系统描述表
可以通过 pmtools 与 iasl 相关的命令来查看。执行如下命令安装这两个程序:
运行示例如下:
使用 ACPI 的 S 状态
查看支持的 S 状态:
切换状态:
执行示例:
按下电源键就可以恢复。
S3 状态的结构
使用 S3 状态时,不同系统的反应不同,大致操作如下:
- 停止进程
- 停止设备运行
- 将唤醒时的开始地址作为 Wakeup vector 登录到 BIOS
- 停止 BSP (Boot Strap Processor) 以外的 CPU 运行
- 停止系统设备运行
- 保存内核和 CPU 的状态
- 将获取到的 ACPI 的 _S3 对象得到的值写入 FADT 的 PM1 寄存器,进入待机模式。
- 系统恢复时,从登录到 wakeup vector 的地址启动,按下列方式恢复到待机前的状态
- 启用 ACPI
- 恢复系统设备
- 启用 CPU
- 清除 wakeup vector
- 恢复停止的设备
- 恢复进程
S4 状态的使用方法
linux 中 S4 称为 swap 待机,有内核的 S4 处理通过将内存上的所有数据保存在交换区磁盘来停止电源,恢复时由 bootloader 启动内核,在内核初始化时,把之前保存到交换区磁盘的数据读入内存来快速回复到原来的状态。
使用方法如下:
休眠要使用交换区磁盘,一般需要准备内存的 1.5 ~ 2 倍的磁盘容量。这应该就是 swap 要设置为 2 倍内存大小的原因。
在我的系统中,默认保存在交换区磁盘的内存大小如下:
执行如下命令来取消限制。
执行一次休眠后按电源键重新启动系统后查看 dmesg 信息,有如下相关信息:
PM: hibernation entry 与 PM: hibernation exit 之间就是休眠过程的处理。
有的 PC 上可能出现 BIOS 无法顺利运行,休眠失败的情况,这时可以尝试如下方法:
-
执行如下敏玲将休眠设置为 shutdown 模式
- 进行休眠
如果恢复系统后系统运行状态有所不同,有时会通过将交换区的数据强制读入内存来改善性能,这可以通过执行如下命令来完成:
如果休眠失败,可以查看 /var/log/messages 文件来寻找原因。
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux24893 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!