ACPI 中文文档ACPI 中文文档
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
首页
第 1 章
第 2 章
第 3 章
第 4 章
第 5 章
第 6 章
第 7 章
第 8 章
第 9 章
第 10 章
第 11 章
第 12 章
第 13 章
第 14 章
第 15 章
第 16 章
第 17 章
第 18 章
第 19 章
第 20 章
第 21 章
附录 A
  • 第 16 章

    • 总览
    • 16.1. 睡眠状态
    • 16.2. 刷新缓存
    • 16.3. 初始化

16.1. 睡眠状态

下图显示了工作状态、睡眠状态以及软关机状态之间的转换。

../_images/Waking_and_Sleeping-2.png

图 16.1 睡眠状态示例

ACPI 对 G0 和 G1 系统状态定义了明确的差异。

  • 在 G0 状态中,OS/应用软件以及硬件正在执行工作。CPU 或任何特定硬件设备都可能处于任一定义的电源状态(C0-C3 或 D0-D3)之一;但是,系统中总会有某些工作正在进行。

  • 在 G1 状态中,系统被认为不执行任何工作。在进入 G1 状态之前,OSPM 将把设备置于与即将进入的系统睡眠状态兼容的设备电源状态;如果某设备被启用为可唤醒系统,则 OSPM 将把这些设备置于该设备支持唤醒的最低 Dx 状态。这在该设备对象的电源资源描述中定义。对 G1 状态的这一定义意味着:

  • CPU 在 G1 状态下不执行任何指令。

  • 硬件设备不工作(除非可能用于产生唤醒事件)。

  • 如果不是 硬件精简,则 ACPI 寄存器会受到如下影响:

* 根据已启用的唤醒选项,在相应的固定寄存器或通用用途寄存器中启用唤醒事件位。

* 对 PM1 控制寄存器进行编程,以设置所需的睡眠状态。

* WAK_STS 在睡眠状态期间由硬件置位。

所有睡眠状态都具有这些规范。ACPI 还定义了附加属性,使 ACPI 平台最多可以具有四种不同的睡眠状态,每种状态具有不同的属性。选择这些属性是为了能够区分在功耗、唤醒延迟和实现成本权衡方面不同的睡眠状态。

以降低的性能级别运行处理器并不是 ACPI 睡眠状态 (G1);这是一个工作状态 (G0) 下定义的事件。

CPU 在睡眠状态下不能执行任何指令;OSPM 依赖这一事实。平台设计人员可能会倾向于通过降低系统时钟频率来支持睡眠中的系统,这使平台能够在保持低功耗状态的同时维持那些需要持续交互的通信会话(如某些网络环境中的情况)。这明确属于 G0 活动,其中 OS 策略决定关闭用户界面(屏幕)并使处理器以降低的性能模式运行。ACPI 规范并未将这种降低性能的状态定义为睡眠状态;ACPI 假定在睡眠状态期间不执行任何代码。

ACPI 为四种睡眠状态定义了属性:S1、S2、S3 和 S4。(请注意,从硬件角度看,S4 和 S5 非常相似。)兼容 ACPI 的平台可以支持多种睡眠状态。ACPI 规定,每种睡眠状态都关联一个 3 位二进制数(这些数在 ACPI 根命名空间中被赋予对象:\_S0、\_S1、\_S2、\_S3、\_S4 和 \_S5)。在进入系统睡眠状态时,OSPM 将执行以下操作:

  1. 选择平台和已启用的唤醒设备所支持的最深睡眠状态。

  2. 执行 _PTS 控制方法(其将预期睡眠状态的类型传递给 OEM AML 代码)。

  3. 如果 OS 策略决定进入 S4 状态,并选择使用 S4BIOS 机制,且平台支持 S4BIOS,则 OSPM 将通过向 SMI_CMD 端口写入 S4BIOS_REQ 值,把控制权交给平台运行时固件软件。

  4. 如果不使用 S4BIOS 机制,则 OSPM 从关联的睡眠对象 (\_S1、\_S2、\_S3、\_S4 或 \_S5) 获取 SLP_TYPx 值。

  5. 使用所选睡眠对象中包含的值对 SLP_TYPx 字段进行编程。

注释

兼容性 — _GTS 方法在 ACPI 5.0A 中已弃用。对于更早版本,执行 _GTS 控制方法,并传递一个参数以指示要进入的睡眠状态(1、2、3 或 4 分别表示 S1、S2、S3 和 S4)。

  1. 如果进入 S1、S2 或 S3,则刷新处理器缓存。

  2. 如果不是进入 S4BIOS,则设置 SLP_EN 位以启动睡眠序列。(这实际上发生在对 PM1_CNT 寄存器进行同一次写操作时,该写操作同时对 SLP_TYPx 字段进行编程。)如果进入 S4BIOS,则向 SMI_CMD 端口写入 S4BIOS_REQ 值。

  3. 如果是 硬件精简,则对 SLEEP_CONTROL_REG FADT 字段所指示的寄存器进行编程,写入 硬件精简 ACPI 睡眠类型值(从上面步骤 4 中的睡眠状态对象取得),并将 SLP_EN 位置为 1。

  4. 在包含不具备用于将处理器置于低功耗状态的硬件机制的处理器的系统上,执行适当的原生指令以将处理器置于低功耗状态。

_PTS 控制方法为平台运行时固件提供了一种在进入系统睡眠状态之前执行某些准备工作的机制,例如将睡眠类型值写入嵌入式控制器。控制方法的执行发生在进入睡眠状态“之前的紧邻时刻”,并不是与写 PM1_CNT 寄存器同步的事件。执行可能发生在系统实际进入睡眠状态之前数秒。因此,执行 _PTS 控制方法不会进行任何硬件电源平面时序操作。

注释

兼容性 — _BFS 方法在 ACPI 5.0A 中已弃用。在更早版本中,在唤醒时执行 _BFS 控制方法。然后 OSPM 执行 _WAK 控制方法。该控制方法执行 OEM 特定的 ASL/AML 代码,可搜索在睡眠状态期间被添加或移除的任何设备。*

以下各节描述睡眠状态属性。

16.1.1. S1 睡眠状态

S1 状态被定义为一种低唤醒延迟的睡眠状态。在此状态下,除 CPU 缓存外,所有系统上下文都被保留。在进入 S1 之前,OSPM 将刷新系统缓存。如果平台支持 WBINVD 指令(如 FADT 中的 WBINVD 和 WBINVD_FLUSH 标志所指示),OSPM 将执行 WBINVD 指令。硬件负责维护所有其他系统上下文,其中包括 CPU、内存和芯片组的上下文。

下面给出 S1 睡眠状态实现替代方案的示例。

16.1.1.1. 示例 1:S1 睡眠状态实现

此示例引用了一个 IA 处理器,该处理器通过断言 STPCLK# 信号来支持停止授予状态。当 SLP_TYPx 被编程为 S1 值(OEM 选择一个值,然后将其放入 \_S1 对象中)并随后设置 SLP_ENx 位时,或者当将用于 S1 的 硬件精简 ACPI 睡眠类型 值和 SLP_EN 位写入 Sleep Control Register 时,硬件可以通过向处理器断言 STPCLK# 信号来实现 S1 状态,从而使其进入停止授予状态。

在这种情况下,系统时钟(PCI 和 CPU)仍在运行。任何已启用的唤醒事件都会导致硬件对处理器去断言 STPCLK# 信号,因此 OSPM 必须首先使 CPU 缓存失效,然后再转换回工作状态。

16.1.1.2. 示例 2:S1 睡眠状态实现

当 SLP_TYPx 被编程为 S1 值并随后设置 SLP_ENx 位时,或者将用于 S1 的 硬件精简 ACPI 睡眠类型 值和 SLP_EN 位写入 Sleep Control Register 时,硬件将通过执行以下操作来实现 S1 睡眠状态转换:

  1. 将处理器置于停止授予状态。

  2. 停止处理器输入时钟,将处理器置于停止时钟状态。

  3. 将系统内存置于自刷新或挂起刷新状态。刷新由内存自身维持,或通过某个在睡眠状态期间不会停止的其他参考时钟来维持。

  4. 停止所有系统时钟(向系统 PLL 芯片断言待机信号)。通常 RTC 将继续运行。

在这种情况下,系统中的所有时钟都已停止(RTC 除外)。硬件必须在任何已启用的唤醒事件发生时逆转该过程(重新启动系统时钟),因此 OSPM 必须首先使 CPU 缓存失效,然后再转换回工作状态。

16.1.2. S2 睡眠状态

S2 状态被定义为一种低唤醒延迟的睡眠状态。该状态类似于 S1 睡眠状态,在该状态下,除系统内存之外的任何上下文都可能丢失。此外,在唤醒事件之后,控制从处理器的复位向量开始。在进入 S2 之前以及设置 SLP_EN 位之前,OSPM 将刷新系统缓存。如果平台支持 WBINVD 指令(如 FADT 中的 WBINVD 和 WBINVD_FLUSH 标志所示),OSPM 将执行 WBINVD 指令。硬件负责保持芯片组和内存上下文。下面给出一个 S2 睡眠状态实现示例。

16.1.2.1. 示例:S2 睡眠状态实现

当 SLP_TYPx 寄存器被编程为 S2 值(位于 \_S2 对象中)并设置 SLP_EN 位时,或者将用于 S2 的 硬件精简 ACPI 睡眠类型 值和 SLP_EN 位写入 Sleep Control Register 时,硬件将通过执行以下操作来实现 S2 睡眠状态转换:

  1. 停止系统时钟(唯一仍在运行的时钟是 RTC)。

  2. 将系统内存置于自刷新或挂起刷新状态。

  3. 关闭 CPU 和缓存子系统电源。

从 S2 睡眠状态唤醒时,CPU 会在检测到唤醒事件后被复位;但是,核心逻辑和内存会保持其上下文。执行控制从 CPU 的启动向量开始。平台启动固件必须:

  1. 编程 CPU 的初始启动配置(例如 CPU 的 MSR 和 MTRR 寄存器)。

  2. 将缓存控制器初始化为其初始启动大小和配置。

  3. 使内存控制器能够接受内存访问。

  4. 跳转到唤醒向量。

16.1.3. S3 睡眠状态

S3 状态被定义为一种低唤醒延迟的睡眠状态。从软件视角看,该状态在功能上与 S2 状态相同。操作上的区别在于,在 S2 状态下可能保持开启的某些电源资源在 S3 状态下可能不可用。因此,当系统处于 S3 状态时,某些设备可能比在 S2 状态时处于更低的功耗状态。类似地,某些设备唤醒事件在 S2 中可以工作,但在 S3 中不行。下面给出一个 S3 睡眠状态实现示例。

16.1.3.1. 示例:S3 睡眠状态实现

当 SLP_TYPx 寄存器被编程为 S3 值(位于 \_S3 对象中)并设置 SLP_EN 位时,或者将用于 S3 的 硬件精简 ACPI 睡眠类型 值和 SLP_EN 位写入 Sleep Control Register 时,硬件将通过执行以下操作来实现 S3 睡眠状态转换:

  1. 将内存置于低功耗自动刷新或自刷新状态。

  2. 维持内存的设备将自身与系统中的其他设备隔离。

  3. 切断系统电源。此时,只有支持内存的设备仍然通电(可能是部分供电)。系统中唯一运行的时钟是 RTC 时钟。

从 S3 睡眠状态唤醒时,唤醒事件会重新为系统上电并复位大多数设备(取决于具体实现)。执行控制从 CPU 的启动向量开始。平台启动固件必须:

  1. 编程 CPU 的初始启动配置(例如 MSR 和 MTRR 寄存器)。

  2. 将缓存控制器初始化为其初始启动大小和配置。

  3. 使内存控制器能够接受内存访问。

  4. 跳转到唤醒向量。

请注意,如果系统在睡眠期间丢失了缓存内存控制器的配置,则平台启动固件必须将其重新配置为睡眠前状态或初始启动状态配置。平台启动固件可以将缓存内存控制器的配置存储到保留内存空间中,以便在唤醒后检索这些值。OSPM 将在每个会话中调用一次 _PTS 方法(在进入睡眠之前)。

平台启动固件还负责恢复内存控制器的配置。如果该配置数据在 S3 睡眠状态期间被破坏,则平台启动固件需要将睡眠前状态或初始启动状态配置存储在非易失性内存区域中(例如 RTC CMOS RAM),以便它能够在唤醒过程中恢复这些值。

当 OSPM 在退出 S3 睡眠状态后重新枚举总线时,它将发现任何已插入或移除的设备,并在设备加电时对其进行配置。

16.1.4. S4 睡眠状态

S4 睡眠状态是 ACPI 支持的功耗最低、唤醒延迟最长的睡眠状态。为了将功耗降至最低,假定硬件平台已关闭所有设备的电源。由于这是睡眠状态,因此平台上下文会被保持。根据进入 S4 睡眠状态的方式不同,维护系统上下文的责任也会发生变化。S4 支持两种进入机制:由 OS 发起和由平台运行时固件发起。由 OSPM 发起的机制类似于进入 S1-S3 睡眠状态;OSPM 驱动程序写入 SLP_TYPx 字段并设置 SLP_EN 位,或者将用于 S3 的 硬件精简 ACPI 睡眠类型 值和 SLP_EN 位写入 Sleep Control Register。由平台运行时固件发起的机制则是 OSPM 通过将 S4BIOS_REQ 值写入 SMI_CMD 端口,把控制权转移给平台运行时固件;该机制在 硬件精简 ACPI 平台上不受支持。

在由 OSPM 发起的 S4 睡眠状态中,OSPM 负责保存所有系统上下文。在进入 S4 状态之前,OSPM 将按照 系统地址映射接口 中规定的内容保存所有内存的上下文。

在唤醒时,OSPM 随后应恢复系统上下文。当 OSPM 在退出 S4 睡眠状态后重新枚举总线时,它将发现任何已经插入或移除的设备,并在设备加电时对其进行配置。

在由平台运行时固件发起的 S4 睡眠状态中,OSPM 负责与 S3 睡眠状态中所述相同的系统上下文(平台运行时固件恢复内存和某些芯片组上下文)。S4BIOS 转换会将控制权转移给平台运行时固件,使其能够将上下文保存到非易失性内存(例如磁盘分区)中。

16.1.4.1. 操作系统发起的 S4 转换

如果 OSPM 支持由 OSPM 发起的 S4 转换,则它不会生成由平台固件发起的 S4 转换。支持由平台固件发起的 S4 转换的平台也支持由 OSPM 发起的 S4 转换。

由 OSPM 发起的 S4 转换由 OSPM 通过保存系统上下文、向 SLP_TYPx 寄存器写入适当的值并设置 SLP_EN 位来启动,或者将用于 S4 的 硬件精简 ACPI 睡眠类型 值和 SLP_EN 位写入 Sleep Control Register。在退出 S4 睡眠状态时,平台启动固件将芯片组恢复到其 POST 状态,更新硬件签名(本节稍后描述),并通过正常启动过程将控制权传递给 OSPM。

当平台启动固件构建 ACPI 表时,它会为系统生成一个硬件签名。如果在由 OS 发起的 S4 转换期间硬件配置发生了变化,则平台启动固件会更新 FACS 表中的硬件签名。硬件配置变化被定义为平台硬件中任何会导致平台在尝试恢复 S4 上下文时失败的变化;此类硬件通常仅限于启动设备。例如,在处于 S4 状态时更改图形适配器或硬盘控制器应导致硬件签名发生变化。另一方面,从 PC Card 插槽中移除或添加 PC Card 设备则不应导致硬件签名发生变化。

16.1.4.2. S4BIOS 转换

此转换在 硬件精简 ACPI 平台上不受支持。在其他系统上,由平台运行时固件发起的 S4 转换开始于 OSPM 将 S4BIOS_REQ 值写入 SMI_CMD 端口(如 FADT 中所规定)。一旦获得控制权,平台运行时固件随后会保存适当的内存和芯片组上下文,然后将平台置于 S4 状态(所有设备断电)。

在 FACS 内存表中,有一个 S4BIOS_F 位,用于指示硬件是否支持由平台运行时固件发起的 S4 转换。如果硬件平台支持 S4BIOS 状态,则它会在引导 OS 之前,在 FACS 内存结构中设置 S4BIOS_F 标志。如果 FACS 表中的 S4BIOS_F 标志已设置,则表明 OSPM 可以通过将 S4BIOS_REQ 值(位于 FADT 中)写入 SMI_CMD 端口(由 FADT 中的 SMI_CMD 值标识)来请求平台运行时固件将平台转换到 S4BIOS 睡眠状态。

在唤醒时,平台启动固件会恢复内存上下文并跳转到唤醒向量(类似于从 S3 状态唤醒)。从 S4BIOS 状态恢复时,平台启动固件必须只配置启动设备(以便它可以读取其保存系统上下文的磁盘分区)。当 OSPM 在退出 S4BIOS 状态后重新枚举总线时,它将发现任何已经插入或移除的设备,并在设备加电时对其进行配置。

16.1.5. S5 软关机状态

OSPM 将平台置于 S5 软关机状态,以实现逻辑关机。请注意,S5 状态不是睡眠状态(它是一个 G2 状态),并且 OSPM 或硬件都不会保存任何上下文,但在该状态下平台的某些部分可能仍然带电,因此不可以安全地拆卸。还要注意,从硬件角度看,S4 和 S5 状态几乎相同。启动后,硬件会按顺序将系统转换到类似于关机状态的状态。硬件没有责任维护任何系统上下文(内存或 I/O);但是,它允许由于按下电源按钮或远程启动而转换到 S0 状态。启动时,平台启动固件执行正常的上电复位,加载引导扇区,然后执行(但不是唤醒向量,因为进入 S5 软关机状态时所有 ACPI 表上下文都会丢失)。

_TTS 控制方法为平台运行时固件提供了一种执行某些维护工作的机制,例如将目标睡眠状态存储在其他控制方法(例如 _PS3 和 _DSW)可访问的“全局”变量中。

16.1.6. 从工作状态转换到睡眠状态

当系统从工作状态转换到睡眠状态时,会发生以下过程:

  1. OSPM 决定(通过策略方案)将系统置于睡眠状态。

  2. OSPM 调用 _TTS 方法,以指示系统将转换到的最深可能系统状态(1、2、3 或 4,分别表示 S1、S2、S3 和 S4)。

  3. OSPM 检查所有已启用以唤醒系统的设备,并确定系统为支持已启用的唤醒功能所能进入的最深睡眠状态。将检查每个设备下的 _PRW 命名对象,以及它所指向的电源资源对象。

  4. OSPM 将所有设备驱动程序置于其各自的 Dx 状态。如果设备启用了唤醒功能,则进入与唤醒能力相关联的 Dx 状态。如果设备未启用以唤醒系统,则进入 D3 状态。

  5. OSPM 执行 _PTS 控制方法,并传递一个参数以指示期望的睡眠状态(1、2、3 或 4,分别表示 S1、S2、S3 和 S4)。

  6. OSPM 将任何其他处理器(本地处理器除外)的上下文保存到内存中。

  7. OSPM 将唤醒向量写入内存中的 FACS 表。

注

兼容性 — _GTS 方法已在 ACPI 5.0A 中弃用。对于更早版本,OSPM 执行 _GTS 控制方法,并传递一个参数以指示将要进入的睡眠状态(1、2、3 或 4,分别表示 S1、S2、S3 和 S4)。*

  1. 如果不是 硬件精简 ACPI 平台,OSPM 清除 PM1a_STS 和 PM1b_STS 寄存器中的 WAK_STS。在 硬件精简 ACPI 平台上,OSPM 清除睡眠状态寄存器中的 WAK_STS 位。

  2. OSPM 将本地处理器的上下文保存到内存中。

  3. OSPM 刷新缓存(仅当进入 S1、S2 或 S3 时)。

  4. OSPM 设置 GPE 使能寄存器或启用具备唤醒能力的中断,以确保所有适当的唤醒信号都已布防。

  5. 如果使用 S4BIOS 机制进入 S4 状态,OSPM 将 S4BIOS_REQ 值(来自 FADT)写入 SMI_CMD 端口。这会将控制权传递给平台运行时固件,然后由其将平台转换到 S4BIOS 状态。

  6. 如果不是进入 S4BIOS 状态,并且不是 硬件精简 ACPI 平台,则 OSPM 将 SLP_TYPa(来自相关的睡眠对象)连同置位的 SLP_ENa 位写入 PM1a_CNT 寄存器。

  7. OSPM 将 SLP_TYPb 连同置位的 SLP_EN 位写入 PM1b_CNT 寄存器,或者将 硬件精简 ACPI 睡眠类型值和 SLP_EN 位写入睡眠控制寄存器。

  8. 在包含没有用于将处理器置于低功耗状态的硬件机制的处理器的系统上,OSPM 执行适当的原生指令以将处理器置于低功耗状态。

  9. OSPM 在 WAK_STS 位上循环等待;对于 硬件精简 ACPI 平台,则是在 PM1a_CNT 和 PM1b_CNT 寄存器中,或者在 SLEEP_STATUS_REG 中循环等待。

  10. 系统进入指定的睡眠状态。

注

这是在上述第 14 步或第 15 步之后完成的。

16.1.7. 从工作状态转换到软关机状态

当系统从工作状态转换到软关机状态时,会发生以下过程:

  1. OSPM 执行 _PTS 控制方法,并传递参数 5。

  2. OSPM 准备关闭其组件(刷新磁盘缓存)。

注

兼容性 — _GTS 方法已在 ACPI 5.0A 中弃用。对于更早版本,OSPM 执行 _GTS 控制方法,并传递参数 5。

  1. 如果不是 硬件精简 ACPI 平台,OSPM 将 SLP_TYPa(来自 \_S5 对象)连同置位的 SLP_ENa 位写入 PM1a_CNT 寄存器。

  2. OSPM 将 SLP_TYPb(来自 \_S5 对象)连同置位的 SLP_ENb 位写入 PM1b_CNT 寄存器,或者将用于 S5 的 硬件精简 ACPI 睡眠类型值和 SLP_EN 位写入睡眠控制寄存器。

  3. 系统进入软关机状态。

Prev
总览
Next
16.2. 刷新缓存