我正在读这一页关于 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 可能已经断电。