ACPI_PM_Timer

ACPI PM Timer

概述: ACPI PM Timer是一个非常简单的计时器,它以 3.579545 MHz 运行,在计数器溢出时生成系统控制中断(SCI)。它精度较低,建议使用其他定时器,如HPET或APIC定时器。

检测ACPI PM Timer

关键概念:

  • RSDP(Root System Description Pointer):是一个指向ACPI系统表(如RSDT或XSDT)的指针。它位于系统内存的一个固定位置,操作系统会在启动时查找这个指针,以便访问ACPI表。RSDP在大多数情况下存储在系统的低地址区域(如BIOS固件中)
  • RSDT(Root System Descirption Table):是一个包含指向其他ACPI表的指针的ACPI表,它提供了系统固件中定义的所有ACPI结构的入口。
  • XSDT(Extended System Description Table):是RSDT的扩展,用于支持64位系统。于RSDT使用32指针不同,XSDT使用64位指针,可以支持更多的表
  • FADT(Fixed ACPI Description Table):是ACPI表之一,包含固定的ACPI信息,如电源管理、配置等内容,它描述了系统硬件的一些基本信息,并提供了与电源管理和系统管理相关的接口。

如何查找:

通过RSDP指针以获取RSDT或XSDT,然后找到FADT。一旦找到了FADT,需要检查PMTimerLength字段是否为4,如果不是,则必须假定该计时器不可用。然后,如果ACPI的版本为2或更高,并且X_PMTimerBlock通用地址结构可用(检测地址不为0),则使用它,否则,将PMTimerBlock用作IO端口。

24位和32位模式

ACPI PM Timer支持24位和32位计数器。如果FADA标志的第8位被设置,则计数器位32位。

读取counter值

使用的是X_PMTimerBlock:

  • 检查地址在哪个空间地址中
    • 如果是MMIO(内存映射I/O):将地址映射到虚拟内存中,并从中读取无符号32位整数counter值
    • 如果是IO(端口I/O):从I/O端口读取无符号32位整数counter值

使用的是PM_Timer:

  • 直接从I/O端口读取无符号32位整数counter值

counter值

描述
0:23 计数器的24位
24:31 如果计数器是32位的,则为计数器的高8位。如果计数器是24位的,则为0.

中断请求

ACPI PM Timer在计数器溢出时会触发一个系统控制中断(SCI)。

参考


ACPI_PM_Timer
http://example.com/2024/12/29/ACPI-PM-Timer/
作者
凌云行者
发布于
2024年12月29日
许可协议