桌面电脑操作系统开发笔记(5)——ACPI
ACPI,英文全称为advanced configuration and power interface,即高级配置与电源接口,主要用来替代过时的将电源管理全部交给BIOS的APM(advanced power management),让系统软件可以直接管理系统和设备的电源,管理如睡眠和唤醒这样的事件。它还可以提供系统硬件的信息。有关ACPI的资料,可参考维基百科和ACPI的官方网站:
http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface
http://www.acpi.info/
ACPI规范目前已经到版本5,可从http://www.acpi.info/spec50.htm免费下载。
系统软件要使用ACPI,需要先找到BIOS固件(firmware)提供的ACPI根系统描述指针(root system description pointer,RSDP)。根据ACPI规范,在使用传统BIOS的系统上,系统可以以16字节边界遍历拓展BIOS数据区(EBDA,通常位于0x9FC00~0x9FFFF)或者BIOS的ROM(0xF0000~0xFFFFF),若发现起始有8字节的签名“RSD PTR ”,则可认为是ACPI RSDP。RSDP含有指向根系统描述表(RSDT)的32位指针和指向拓展根系统描述表(XSDT)的64位指针。下表给出了RSDP的结构。
域 | 字节长度 | 起始字节偏移 | 描述 |
签名 | 8 | 0 | “RSD PTR ”(这个签名必须包含末尾的空格。) |
校验和 | 1 | 8 | 这是ACPI 1.0规范定义的校验和,只包括本表的前20字节(0-19),包括本校验和域,这20字节加起来必须为0。 |
OEMID | 6 | 9 | OEM提供的用来是识别OEM的字符串。 |
版本 | 1 | 15 | 本结构的版本。大版本号向后兼容小版本号。ACPI 1.0版的这个域的值为0。当前版本的这个域的值为2。 |
RSDT 地址 | 4 | 16 | RSDT的32位物理地址。 |
长度 | 4 | 20 | 整个表的长度(字节数),包括从偏移量0开始的表头。这个域用来记录整个表的大小。 |
XSDT 地址 | 8 | 24 | XSDT的64位物理地址。 |
拓展 校验和 | 1 | 32 | 这是整个表的校验和,包括两个校验和域。 |
保留 | 3 | 33 | 保留。 |
RSDT和XSDT中有指向固定ACPI描述表(FADT)、多APIC描述表(MADT)等其他ACPI系统描述表的指针。RSDT中的指针是32位的,而XSDT中的指针是64位的。为了适应64位系统的普及,ACPI规范中指出,如果存在XSDT,应该使用XSDT而不采用RSDT。RSDT和XSDT的结构如下:
域 | 字节长度 | 起始字节偏移 | 描述 |
头 |
|
|
|
签名 | 4 | 0 | “RSDT”/“XSDT” |
长度 | 4 | 4 | 整个RSDT的长度(字节数)。这个长度指示了表的后面表项的数目(n)。 |
版本 | 1 | 8 | 1 |
校验和 | 1 | 9 | 整个表加起来必须为0。 |
OEMID | 6 | 10 | OEM ID |
OEM表ID | 8 | 16 | 表ID是生产商的模型ID。这个域必须跟FADT中的OEM表ID匹配。 |
OEM版本 | 4 | 24 | OEM提供的RSDT/XSDT表的版本 |
创建者ID | 4 | 28 | 创建这个表的工具的供应商ID。对于包含定义块的表,这是ASL编译器的ID。 |
创建者版本 | 4 | 32 | 创建这个表的工具的版本。对于包含定义块的表,这是ASL编译器的版本。 |
项 | 4*n(RSDT)/ | 36 | 指向其他描述表表头的32位(RSDT)/64位(XSDT)物理地址的数组。OSPM假定至少描述表表头是可寻址的,并且可根据其长度域进一步访问表中信息。 |
FADT中有指示世纪域位置、指示8042键盘控制器是否存在、指示VGA硬件是否存在、指示CMOS RTC是否存在等的信息。
MADT中有逻辑处理器及其本地APIC(LAPIC)、IO APIC等的多处理器或多核操作系统需要的信息。关于这些数据结构的具体内容,请见ACPI规范。
ACPI CA致力于给操作系统开发者提供ACPI的开源的软件实现,其官方网站为:https://acpica.org/
其源代码可在github中找到:https://github.com/acpica/acpica