x86 处理器如何从 S2/S3 睡眠中恢复?

x86 处理器如何从 S2/S3 睡眠中恢复?

我正在读这一页关于 Windows 中睡眠状态如何工作,我对重置向量很感兴趣。我目前的理解是;

当系统处于 S2/S3 状态时,处理器完全断电,缓存丢失,总线至少停止,即使不是完全断电。RAM 的内容被保留,以便快速恢复。

在恢复时,处理器读取存储在复位向量中的地址(在 x86 上,就是这样0xFFFFFFF0通常映射到 ROM。它跳转到刚刚读取的地址并开始执行。

因为它是 ROM,所以我认为内存不能被轻易写入,因此必须保持半恒定(BIOS 闪存等除外)

因此,处理器启动,从 ROM 读取地址,跳转到该地址并开始执行(可能是 POST 或其他初始化)。

在此过程中的某个时刻,它需要跳回到睡眠前正在执行的任何操作。

恢复地址存储在哪里以及是什么原因导致处理器在那里查找?

答案1

操作系统可以使用 Cbo 将旧版 BIOS 的 0xFFFF0 重置向量处的代码更改为指向 RAM,而不是闪存伤心PAM 配置寄存器位于 L3 缓存控制器中,可通过总线 0 设备上的 PCIe 配置空间访问。SAD 可能被硬编码为将 0xFFFFFFF0 重定向到 IIO(即 DMI),但是,我不知道如果您配置DRAM_规则(MMCFG / DRAM / NXM)位于其顶部。

BIOS 在启动时会执行此操作(旧版 BIOS 通过最初将写入重定向到 RAM 而不是读取来将自身隐藏到同一地址),而不是操作系统,因为操作系统知道总线 0 上的设备是什么,以及哪些寄存器偏移量为与该 BIOS 版本兼容的 CPU 型号配置了这些 SAD。BIOS 使用 ACPI 为操作系统抽象出这一点(例如,操作系统不需要知道特定 CPU 的 PCIEXBAR 在哪里,它只需在 MCFG ACPI 表中查找即可)。

在这种情况下,内核只需将恢复代码地址写入 FADT ACPI 表中的固件控制字段指向的 FACS 中的固件唤醒向量。0xFFFFFFF0 重置向量不需要更改,因为 ACPI 状态寄存器检查发生在重置向量到达的代码中。查看更多。 的进一步的兴趣。虽然重置向量可能不是 0xFFFFFFF0,但它可能是验证启动 ACM 并加载微码更新的微码。我猜是因为微码补丁 SRAM 可能已经断电。

相关内容