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 Timer - OSDev Wiki