我正在阅读有关睡眠状态如何在 Windows 中工作的页面,我对重置向量很感兴趣。我目前的理解是;
当系统处于 S2/S3 时,处理器完全断电,缓存丢失,总线至少停止,如果不是完全断电的话。RAM 的内容被保留以允许快速恢复。
在恢复时,处理器读取存储在重置向量(在 x86 上,即0xFFFFFFF0
)中的地址,该向量通常映射到 ROM。它跳转到它刚刚读取的地址并开始执行。
由于它是 ROM,我认为内存不容易写入,因此必须保持半恒定(不包括 BIOS 闪存等)
因此,处理器启动,从 ROM 读取地址,跳转到该地址并开始执行(大概是 POST 或其他初始化)。
在此过程中的某个时刻,它需要跳回到睡眠前正在执行的任何内容。
从存储中恢复的地址在哪里,是什么导致处理器查看那里?
操作系统可以使用 L3 缓存控制器中的 Cbo SAD PAM 配置寄存器(可通过总线 0 设备之一上的 PCIe 配置空间访问)将旧版 BIOS 的 0xFFFF0 重置向量处的代码更改为定向到 RAM,而不是闪存。SAD可能是硬编码的,将0xFFFFFFF0重定向到IIO(即DMI),但是\xe2\x80\x93我不知道如果你在它上面配置DRAM_RULE (MMCFG / DRAM / NXM)会发生什么。
\n这是BIOS在启动时执行此操作(传统BIOS通过最初将写入重定向到RAM而不是读取来将自身映射到相同的地址),而不是操作系统,因为操作系统知道哪个设备在运行总线 0 以及寄存器偏移量为与该 BIOS 版本兼容的 CPU 型号配置这些 SAD。BIOS 使用 ACPI 为操作系统抽象了这一点(例如,操作系统不需要知道特定 CPU 的 PCIEXBAR 在哪里,它只需在 MCFG ACPI 表中查找即可)。
\n在这种情况下,内核只需将恢复代码地址写入FADT ACPI表中的固件控制字段所指向的FACS中的固件唤醒向量。0xFFFFFFF0 复位向量不需要更改,因为 ACPI 状态寄存器检查发生在复位向量到达的代码中。查看更多。进一步感兴趣。尽管重置向量可能不是 0xFFFFFFF0,但它可能是验证启动 ACM 并加载微码更新的微码。我猜是这样,因为微码补丁 SRAM 会断电。
\n