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.3. 初始化

本节介绍 ACPI 平台的初始化序列。在从复位状态或从 S2、S3 或 S4 睡眠状态唤醒后(如 ACPI 睡眠状态定义所定义),CPU 将从其引导向量开始执行。此时,初始化软件根据硬件平台所支持的内容有多种选择。本节从高层次描述了对于这些不同选项应当执行的操作。下图说明了启动软件的流程。

../_images/Waking_and_Sleeping-3.png

图 16.2 平台固件初始化

处理器将在从 S2、S3 或 S4 睡眠状态唤醒时、在上电序列期间,或由于硬复位或软复位的结果,从其上电复位向量开始执行。

当由于上电序列、硬复位或软复位,**或从 S4 睡眠状态唤醒,**而从上电复位向量执行时,平台固件执行完整的硬件初始化;将系统置于引导配置。随后固件将控制权交给操作系统引导加载程序。

当由于从 S2 或 S3 睡眠状态唤醒而从上电复位向量执行时,平台固件仅执行将系统恢复到以下两种状态之一所需的硬件初始化:平台在初始操作系统引导之前所处的状态,或睡眠前的配置状态。在多处理器系统中,非引导处理器应被置于与初始操作系统引导之前相同的状态。随后平台固件通过跳转到 FACS 中的 Firmware_Waking_Vector 或 X_Firmware_Waking_Vector,将控制权交还给 OSPM 系统(更多信息请参见 固件 ACPI 控制结构(FACS))。在 S2 或 S3 睡眠状态期间,不得更改操作系统内存内容。

首先,平台运行时固件通过检查在睡眠会话之间会被保留的 SLP_TYP 寄存器值,来确定这是否是从 S2 或 S3 唤醒。如果这是一次 S2 或 S3 唤醒,则平台运行时固件在跳转到唤醒向量之前恢复系统的最小上下文。这包括:

CPU 配置。

平台运行时固件恢复每个 CPU 的睡眠前配置或初始引导配置(MSR、MTRR、固件更新、SMBase 等)。中断必须被禁用(对于 IA-32 处理器,通过 CLI 指令禁用)。

内存控制器配置。

如果该配置在睡眠状态期间丢失,则平台运行时固件将内存控制器初始化为其睡眠前配置或初始引导配置。

缓存内存配置。

如果该配置在睡眠状态期间丢失,则平台运行时固件将缓存控制器初始化为其睡眠前配置或初始引导配置。

功能设备配置。

平台运行时固件不需要配置/恢复功能设备(例如网络接口,即使它在物理上包含于芯片组中)或中断控制器的上下文。OSPM 负责恢复这些设备的所有上下文。对硬件和平台运行时固件的唯一要求是确保在控制权交给 OS 时,设备不会发出中断请求。

ACPI 寄存器。

在非 硬件精简 ACPI 平台上,SCI_EN 位必须置位,并且所有事件状态/使能位(PM1x_STS、PM1x_EN、GPEx_STS 和 GPEx_EN)不得被平台运行时固件更改。

注

平台运行时固件可以将 CPU、内存控制器和缓存内存控制器重新配置为睡眠前配置或初始引导配置中的任一种。OSPM 必须适应这两种配置。

当从 S4BIOS 睡眠状态唤醒时,平台启动固件初始化最少数量的设备,例如 CPU、内存、缓存、芯片组和引导设备。在初始化这些设备之后,平台启动固件从硬盘等非易失性存储器恢复内存上下文,并跳转到唤醒向量。

如前所述,从 S4 状态唤醒与冷启动同样对待:平台启动固件运行 POST,然后初始化内存以包含 ACPI 系统描述表。完成这些之后,它可以调用 OSPM 加载程序,并将控制权交给 OSPM。

当从 S4(无论是 S4OS 还是 S4BIOS)唤醒时,平台启动固件可以选择在将控制权交给 OSPM 之前置位 SCI_EN 位。在这种情况下,在控制权交给 OSPM 之前必须禁用中断(对于 IA-32 处理器,通过 CLI 指令禁用),并且芯片组必须配置为 ACPI 模式。

16.3.1. 将系统置于 ACPI 模式

当平台从冷启动(机械断电,或从 S4 或 S5 状态)进行初始化时,如果不是 硬件精简 ACPI 平台,则硬件平台可以被配置为传统配置。从这些状态开始,平台启动固件软件会像为传统操作系统那样初始化计算机。当控制权传递给操作系统时,OSPM 将检查 SCI_EN 位;如果该位未置位,则会先查找 ACPI 表,然后向 SMI_CMD 端口写入 ACPI_ENABLE 值(如 FADT 中所述),以启用 ACPI 模式。硬件平台将设置 SCI_EN 位,以向 OSPM 指示硬件平台现已配置为 ACPI。

注

在启用 SCI 之前,不会发生任何 SCI 中断。在 ACPI 打开之后,也不会立即发生任何 SCI 中断。只有在 OSPM 启用了某个 GPE/PM1 使能位之后,才可以发出 SCI 中断信号。

当平台从 S1、S2 或 S3 状态唤醒时,以及在 硬件精简 ACPI 平台上从 S4 和 S5 唤醒时,OSPM 假定硬件已经处于 ACPI 模式,因此不会向 SMI_CMD 端口发出 ACPI_ENABLE 命令

16.3.2. 平台启动固件对内存的初始化

在上电复位、从 S4 睡眠状态退出或从 S5 软关机状态退出期间,平台启动固件需要初始化内存。本节说明平台启动固件应如何配置内存,以供包括以下在内的多种功能使用:

  • ACPI 表。

  • 希望跨 S4 睡眠会话保存且应可缓存的平台固件内存。

  • 不需要保存且应可缓存的平台固件内存。

例如,平台缓存控制器的配置需要一块内存区域来存储配置数据。在唤醒序列期间,平台启动固件将重新启用内存控制器,然后可以使用其配置数据重新配置缓存控制器。为支持这三项内容,基于 IA-PC 的系统包含系统地址映射接口,这些接口返回以下内存范围类型:

ACPI 可回收内存。

由平台启动固件标识、包含 ACPI 表的内存。该内存可以位于 8 MB 以上的任意位置,并包含 ACPI 表。当 OSPM 使用完 ACPI 表后,它可以自由回收这块内存供系统软件使用(应用空间)。

ACPI 非易失性睡眠内存(NVS)。

由 BIOS 标识为保留给平台启动固件使用的内存。OSPM 必须将这块内存标记为可缓存,并在进入 S4 状态前保存其映像,在退出 S4 状态后恢复其映像。除非控制方法另有指示,否则 OSPM 不允许使用这块物理内存。OSPM 将在进入睡眠状态前的某个时刻调用 _PTS 控制方法,以允许平台的 AML 代码在进入睡眠状态前更新该内存映像。在系统从 S4 状态唤醒后,OSPM 将恢复该内存区域,并调用 _WAK 控制方法,以使平台启动固件能够重新取得其内存映像。

注

系统地址映射报告接口返回的内存信息在 S4 睡眠前后应当相同。

当系统首次启动时,OSPM 将在基于 IA-PC 的传统系统上调用 E820 接口,或在启用 UEFI 的系统上调用 GetMemoryMap() 接口,以获取系统内存映射(更多信息请参见系统地址映射接口)。作为示例,下面的内存映射表示一个典型的基于 IA-PC 的传统平台的物理内存映射。

../_images/Waking_and_Sleeping-4.png

图 16.3 物理内存映射示例

下面列出了不同内存区域的名称和属性:

  • 0-640 KB。 兼容性内存。用于 8086 系统的应用程序可执行内存。

  • 640 KB-1 MB。 兼容性空洞。内存空间中的空洞,允许访问被定向到 PC 兼容帧缓冲区(A0000h-BFFFFh)、适配器 ROM 空间(C0000h-DFFFFh)以及系统平台固件空间(E0000h-FFFFFh)。

  • 1 MB-8 MB。 连续 RAM。一段连续的物理内存地址区域。操作系统可能要求这块内存是连续的,以便其加载程序在启动时能够正确加载 OS。(任何内存映射 I/O 设备都不应映射到该区域中。)

  • 8 MB-Top of Memory1。 该区域包含直到“内存顶部 1”边界的内存。在该区域中,可能存在内存映射 I/O 块。

  • Boot Base-4 GB。 该区域包含引导 ROM。

平台启动固件应决定不同内存结构应放置的位置,然后配置 E820 处理程序返回适当的值。

对于此示例,平台启动固件将按图 16.4 所示通过 E820 报告系统内存映射。请注意,从 1 MB 到内存顶部的内存范围被标记为系统内存,然后另外有一个较小的范围被标记为 ACPI 可回收内存。不支持 E820 扩展的传统操作系统将忽略扩展内存范围调用,并正确地将该内存标记为系统内存。

../_images/Waking_and_Sleeping-5.png

图 16.4 启动后配置的内存

此外,从 Top of Memory1 到 Top of Memory2,平台启动固件已留出一些内存供其自身使用,并将 ACPI NVS 内存和保留内存都标记为保留。传统 OS 会丢弃 ACPI NVS 内存,并正确地将其标记为保留内存(从而防止将该内存范围分配给任何附加设备)。

OSPM 将在发起睡眠之前调用 _PTS 控制方法(通过编程睡眠类型,然后设置 SLP_EN 位)。在灾难性故障期间(AML 代码解释器或驱动程序结构的完整性存在疑问时),如果 OSPM 决定关闭系统,它将不会发出 _PTS,而是立即发出值为“软关机”的 SLP_TYP,然后设置 SLP_EN 位,或者直接将 硬件精简 ACPI Sleep Type 值和 SLP_EN 位写入 Sleep Control Register。因此,硬件不应仅依赖 _PTS 控制方法来将系统按顺序切换到“软关机”状态。从 S4 状态唤醒后,OSPM 将恢复 ACPI NVS 内存映像,然后发出 _WAK 控制方法,通知平台运行时固件其内存映像已恢复。

16.3.3. OS 加载

此时,平台启动固件已将控制权传递给 OSPM,方式要么是使用 OSPM 引导加载器(从 S4/S5 或引导条件唤醒的结果),要么是使用 OSPM 唤醒向量(从 S2 或 S3 状态唤醒的结果)。对于操作系统引导加载器路径,OSPM 将通过系统地址映射接口中描述的机制之一获取系统地址映射。如果 OSPM 是从 S4 状态启动,它随后将检查 NVS 映像文件的硬件签名与 FACS 表(由平台启动固件构建)中的硬件签名是否一致,以确定自进入睡眠状态以来该签名是否发生了变化(这表明平台的基础硬件配置在当前睡眠状态期间已发生变化)。如果签名发生了变化,OSPM 将不会恢复系统上下文,而是可以从头启动(从 S4 状态)。接下来,对于 S4 唤醒,OSPM 将检查 NVS 文件是否有效。如果有效,则 OSPM 将把 NVS 映像加载到系统内存中。接下来,如果不是 硬件精简 ACPI 平台,OSPM 将检查 SCI_EN 位;如果该位未置位,则会向 SMI_CMD 寄存器写入 ACPI_ENABLE 值,以将系统切换到 ACPI 模式,然后将再次从 NVS 文件重新加载内存映像。

../_images/Waking_and_Sleeping-6.png

图 16.5 OS 初始化

如果不存在 NVS 映像文件,则 OSPM 加载器将从头加载 OSPM。此时,OSPM 将发出 _WAK 调用,以指示平台运行时固件其 ACPI NVS 内存映像已成功且完整地更新。

16.3.4. 退出 ACPI 模式

对于那些不是以 ACPI 模式启动的机器,ACPI 提供了一种机制,使 OS 能够禁用 ACPI。将发生以下过程:

  1. OSPM 卸载所有 ACPI 驱动程序(包括 ACPI 驱动程序)。

  2. OSPM 禁用所有 ACPI 事件。

  3. OSPM 完成对所有 ACPI 寄存器的使用。

  4. OSPM 对地址由 SMI_CMD 字段(在 FADT 中)指定的端口执行一次 I/O 访问,写入值为 ACPI_DISABLE 字段(在 FADT 中)所包含的值。

  5. 平台运行时固件随后将所有 SCI 事件重新映射为传统事件,并复位 SCI_EN 位。

  6. 在看到 SCI_EN 位被清除后,ACPI OS 进入传统 OS 模式。

当且如果传统 OS 将控制权返回给 ACPI OS 时,如果传统 OS 没有维护 ACPI 表(位于保留内存和 ACPI NVS 内存中),则 ACPI OS 将重新引导系统,以便平台运行时固件重新初始化这些表。

Prev
16.2. 刷新缓存