16. 唤醒与睡眠
ACPI 定义了一种机制,用于使系统在工作状态 (G0) 与睡眠状态 (G1) 或软关机 (G2) 状态之间转换。在工作状态与睡眠状态之间转换期间,用户操作环境的上下文会被保留。ACPI 通过定义四种 ACPI 睡眠状态(S1、S2、S3 和 S4)的系统属性,来定义 G1 睡眠状态的特性。每种睡眠状态的定义都允许实现方案在成本、功耗和唤醒延迟之间进行权衡。此外,ACPI 还定义了这些睡眠状态,使得 ACPI 平台可以支持多种睡眠状态,从而允许平台先进入某个特定睡眠状态一段预定义时间,然后再转换到功耗更低/唤醒延迟更高的睡眠状态(通过 G0 状态进行转换)(见下方注释)。
OSPM 使用 RTC 唤醒功能或“时间与闹钟”命名空间设备来设定状态转换延迟。
在进入睡眠之前,OSPM 会将闹钟设置为时间上最近的一次唤醒事件:
要么是在稍后切换到更低功耗睡眠状态的时刻,
要么是某个日历事件的时刻(例如运行某个应用程序)。
ACPI 定义了一种编程模型,为 OSPM 提供了一个机制以发起进入睡眠或软关机状态(S1-S5);该机制由一个 3 位字段 SLP_TYPx 组成(见下方注释),该字段指示要进入的睡眠状态类型,以及一个单独的控制位 SLP_EN,用于启动睡眠过程。在 HW-reduced ACPI 系统上,使用 FADT 中 SLEEP_CONTROL_REG 字段所描述的寄存器,而不是固定的 SLP_TYPx 和 SLP_EN 寄存器位字段。
请注意,可能存在两个固定的 PM1x_CNT 寄存器,
它们分别指向不同的系统 I/O 空间区域。
通常,一个寄存器分组只允许某个位或位域存在于单个寄存器分组实例
(a 或 b)中;但是,每个平台都可以有两个 SLP_TYP 实例
(每个分组寄存器 a 和 b 各一个)。\_Sx 控制方法返回一个包含两个值的
Package:第一个值是 SLP_TYPa,第二个值是 SLP_TYPb。
注释
对于包含不具备用于将处理器置于低功耗状态的硬件机制的处理器的系统,在 OSPM 设置 SLP_EN 位之后,可能还需要执行适当的原生指令,以将处理器置于低功耗状态。硬件可以实现若干低功耗睡眠状态,然后将这些状态与已定义的 ACPI 睡眠状态关联起来(通过 SLP_TYPx 字段)。ACPI 系统固件会为每个受支持的睡眠状态创建一个关联的睡眠对象(不受支持的睡眠状态通过缺少该睡眠对象来标识)。每个睡眠对象包含两个常量 3 位值,OSPM 将把它们编程到 SLP_TYPa 和 SLP_TYPb 字段中(在固定寄存器空间内);或者,在 硬件精简 ACPI 平台上,包含一个单独的 3 位值,OSPM 将把该值写入由 FADT 的 SLEEP_CONTROL_REG 字段指定的寄存器。
在不是 硬件精简 ACPI 平台的系统上,定义了另一种进入和退出 S4 状态的机制。此机制将控制权交给平台运行时固件,以保存和恢复平台上下文。上下文所有权的定义与 S3 状态类似,但硬件会将内存上下文保存到非易失性存储中(例如磁盘驱动器),并在之后恢复,而 OSPM 将其视为具有隐含延迟和功耗约束的 S4 状态。这种进入 S4 状态的替代机制称为 S4BIOS 转换。
在进入睡眠状态(S1-S4)之前,OSPM 将执行包含在 _PTS(准备睡眠)控制方法中的 OEM 特定 AML/ASL 代码。_PTS 控制方法的一个用途是,它可以向嵌入式控制器指示系统将进入哪种睡眠状态。随后,嵌入式控制器即可在进入睡眠状态时通过执行适当的电源平面时序作出响应。
随后执行 _WAK(唤醒)控制方法。该控制方法同样包含 OEM 特定的 AML/ASL 代码。_WAK 控制方法的一个用途是请求 OSPM 检查平台上是否存在任何在系统处于睡眠期间被添加到系统中或从系统中移除的设备。例如,某个 PC Card 控制器可能被插入或移除了 PC Card,而由于该设备在睡眠状态下断电,因此状态变化事件不会被产生。
本节讨论启用了 ACPI 的平台的系统初始化序列。这包括引导序列、不同的唤醒场景,以及一个用于说明如何使用系统地址映射报告接口的示例。该序列是 ACPI 事件编程模型的一部分。
注释
硬件精简 ACPI 平台不实现下面所描述的传统模式,也不实现 S4BIOS 状态。
有关上述电源管理控制方法的详细信息,请参见 电源与性能管理