首页 理论教育了解ACPI表格快速导读PCIExpress体系结构导读

了解ACPI表格快速导读PCIExpress体系结构导读

【摘要】:在V1.0之后的ACPI版本中,该描述符表被XSDT取代。值得注意的是,FADT的识别标识是“FACP”,在ACPI表中,FACP.dat文件存放处理器系统的FADT表。该表是ACPI规范最复杂,同时也是最重要的一个表。图14-3 ACPI表的组成结构ACPI表存放在处理器的主存储器中,当处理器系统初始化时,BIOS将这些表放入特定物理内存,之后系统软件可以访问这些表项。在Linux系统中,可以使用以下方法调试ACPI表。

ACPI规范使用了一系列描述符表管理处理器系统的部分硬件信息,而且包含与这些硬件相关的操作,并使用RSDP指针(Root System Description Pointer)指向这些描述符表。ACPI规范定义了以下描述符表。

●XSDT(Extended System Description Table)。XSDT包含ACPI规范的版本号和一些与OEM相关的信息,并含有其他描述符表的64位物理地址,如FADT(Fixed ACPI De-scription Table)和SSDT(Secondary System Description Table)等。

●RSDT(Root System Description Table)。RSDT包含的信息与XSDT基本一致,只是在RSDT中存放的物理地址为32位。在V1.0之后的ACPI版本中,该描述符表被XSDT取代。但是有些BIOS可能会为操作系统同时提供RSDT和XSDT,并由操作系统选择使用RSDT还是XSDT。

●FADT。FADT包含ACPI寄存器组使用的系统I/O端口地址、FACS(Firmware ACPI Control Structure)和DSDT(Diffe rentiated System Description Table)的基地址等信息。FADT中还存放了一个“Boot Architecture Flags”字段,在这个字段中存放一些有关处理器系统初始化的基本信息,详见[Advanced Configuration and Power Interface Specifica-tion 4.0]的Table 5-11。值得注意的是,FADT的识别标识是“FACP”,在ACPI表中,FACP.dat文件存放处理器系统的FADT表。

●FACS。FACS包含OS与BIOS进行数据交换使用的一些参数,包括处理器系统的硬件签名,以及Firmware在处理器系统被唤醒后使用的、用来通知操作系统Firmware工作已经告一段落的中断向量,即Firmware Waking Vector。在处理器被唤醒之后,Firm-ware将执行一些基本的加载操作,并通过Firmware Waking中断向量,将控制权交还给操作系统,由操作系统完成其他的唤醒操作。在FACS中,还包含一个全局锁(Global Lock),当Firmware和操作系统对某些临界资源进行访问时,需要使用该锁。

●DSDT。该表是ACPI规范最复杂,同时也是最重要的一个表。该表包含处理器系统使用的硬件资源以及对这些硬件资源的管理操作。SSDT可以对DSDT进行补充,在一个处理器系统中可以存在多个SSDT。

●ACPI规范还定义了一些其他表项,如MADT(Multiple APIC Description Table)、SBST(Smart Battery Table)、SRAT(System Resource Affinity Table)和SLIT(System Locality In-formation Table)等一系列表项。其中MADT描述处理器系统的中断资源和多处理器相关的配置信息;SBST与电池的管理相关;而SRAT和SLIT与NUMA系统的资源管理相关。

在ACPI 4.0中,上述这些表的组成结构如图14-3所示。

如上图所示,在RSDP中提供了两个物理地址分别指向RSDT和XSDT。其中在RSDT和在RSDT指向的其他描述符表中,如SSDT和FADT都使用32位物理地址,而在XSDT和在XSDT指向的其他描述符表中都使用64位物理地址。在ACPI 2.0规范之后的版本,均提供对XSDT的支持,即使用64位物理地址。

978-7-111-29822-9-Part03-18.jpg

图14-3 ACPI表的组成结构

ACPI表存放在处理器的主存储器中,当处理器系统初始化时,BIOS将这些表放入特定物理内存,之后系统软件可以访问这些表项。Linux系统提供了一系列操作ACPI表的工具,用户可以使用这些工具读取在系统内存中的ACPI表,并将其分解为DSDT、XSDT等描述符表。其使用方法如源代码14-12所示。

源代码14-12 ACPI表的提取方法(www.chuimin.cn)

$acpidump>tylersburg-hedt.out

$acpixtract-a tylersburg-hedt.out

$iasl-d APCI.dat

$iasl-d DSDT.dat

...

$iasl-d XSDT.dat

首先用户可以使用acpidump命令将ACPI表从内存读出,之后存放到tylersburg-hedt.out文件中;然后使用acpixtract命令将tylersburg-hedt.out文件存放的ACPI表全部分解,并得到一系列后缀为.dat的文件,其中RSDP.dat文件存放RSDT和XSDT表的物理地址;RSDT.dat文件存放对RSDT的描述;而XSDT.dat文件存放对XSDT的描述。

这些.dat文件使用AML语法规范,操作系统中的AML解释器可以分析这些在.dat文件中的数据。但是这些.dat文件并不适合阅读,用户可以使用iasl命令将这些.dat文件转换为相应的.dsl文件。在.dsl文件中存放ASL(ACPI Source Language)源代码,ASL是一种高级语言,便于阅读和编写。在Linux系统中,可以使用以下方法调试ACPI表。通过源代码14-12,可以得到DSDT.dsl文件,之后可以使用源代码14-13所示的方法调试DSDT表。

源代码14-13 DSDT表的调试

978-7-111-29822-9-Part03-19.jpg

经过以上操作,重新编译Linux内核,并用这个内核重新引导Linux系统后,Linux系统将使用源代码14-13指定的DSDT.hex替代BIOS提供的DSDT表。采用这种方法,可以对DSDT表进行调试。