首页 理论教育ACPI驱动程序与AML解释器

ACPI驱动程序与AML解释器

【摘要】:ACPI驱动程序与AML解释器与操作系统实现相关,其主要目的是将操作系统与ACPI提供的资源进行隔离。这组API负责处理ACPI中的各类Event,包括GPE事件和PM事件。ACPI使用AML语言描述这个硬件抽象层。ACPI表由AML解释器负责分析并维护,在ACPI表中除了存放底层硬件的资源描述外,还可以操作这些资源。

ACPI驱动程序与AML解释器与操作系统实现相关,其主要目的是将操作系统与ACPI提供的资源进行隔离。如上文所述,ACPI使用一组标准的API函数访问ACPI表,目前Unix/Linux系统使用ACPICA规范实现这些接口函数,ACPICA的组成结构如图14-2所示。值得注意的是Windows使用了其他方式实现这些接口函数。

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

图14-2 ACPICA的组成结构

由上图所示,当操作系统需要访问ACPI表时,将首先通过ACPICA接口函数,因此在一个操作系统中,仅需要关注ACPICA接口函数,而不必了解硬件的具体实现细节,并由BIOS管理硬件的具体实现细节。从而使得某x86处理器平台引入的某些“自定义”功能仅与BIOS有关,而与操作系统无关。

1.ACPICA接口函数

ACPICA子系统提供了一系列标准的函数接口,Host OS可以通过这些函数接口向AML解释器传递数据,并由AML解释器访问ACPI的相关资源。在Linux系统的./drivers/acpi/acpica目录中,定义了这些ACPI接口函数,这些ACPI接口函数包括以下几大类。本章并不会详细介绍这些接口函数,而仅在分析相关代码时简要介绍对应的接口函数。

●ACPI Table Management接口函数。这组API负责分析和管理在操作系统中存放的DS-DT、FAT等描述符,ACPI表在操作系统引导时放入系统内存中,有关ACPI表的详细描述见第14.2.2节。

●Namespace Management接口函数。这组API负责创建APCI表在操作系统中存放的名字空间,并管理这些名字空间。

●Resource Management接口函数。在名字空间中包含一些硬件资源,如I/O地址空间和中断向量等,这组API负责管理名字空间中使用的各类资源。

●Event Management接口函数。这组API负责处理ACPI中的各类Event,包括GPE事件和PM事件。

●ACPI Hardware Management接口函数。这组API负责访问ACPI提供的各类硬件资源,包括寄存器和中断。

Host OS通过ACPICA提供的接口函数最终可以访问AML解释器,并由AML解释器访问底层硬件。当一个系统使能了ACPI机制后,底层硬件的实现细节将被屏蔽,AML解释器并不会直接访问底层硬件,而是直接访问ACPI提供的硬件抽象层。ACPI使用AML语言描述这个硬件抽象层。

在一个处理器系统中,ACPI BIOS将提供ACPI表,并由BIOS存放到处理器系统的特定存储器空间中。操作系统在初始化时,需要通过某个地址找到这个ACPI表。(www.chuimin.cn)

值得注意的是ACPI主要管理“非标准”外部设备的硬件资源,并不会管理一些标准外部设备,如标准PCI设备,因此在ACPI表中并不包含标准PCI设备使用的BAR地址空间等一系列标准信息,但是会管理PCI总线中的中断路由表。

ACPI表由AML解释器负责分析并维护,在ACPI表中除了存放底层硬件的资源描述外,还可以操作这些资源。有关ACPI表的详细介绍见下文。

如图14-2所示,在ACPICA中还存在一个OS服务层(OS Services Layer)接口,该接口的主要目的是保证ACPICA实现的“系统独立性”。目前在Unix/Linux系统中,ACPICA接口函数使用OS服务层接口,访问与ACPI相关的硬件资源或者执行相应的操作。

2.OS服务层接口函数

ACPICA的实现与操作系统无关,但是ACPI接口函数仍然需要使用一些操作系统资源,比如ACPI接口函数需要使用操作系统提供的分配与释放内存资源,访问PCI设备配置空间等一系列API函数。

但是在不同的操作系统中,访问系统内存资源、访问PCI配置空间所需要调用的API函数并不相同。为了保证ACPICA的实现与操作系统无关,ACPICA抽象了OS服务层接口函数。ACPICA的接口函数使用OS服务层接口函数,而不是操作系统提供的函数访问HOST OS的资源,以保证ACPICA的独立性。值得注意的是,在不同的操作系统中,ACPICA定义这组函数的实现并不相同,目前Linux/Unix系统使用了ACPICA定义的这组函数,而Win-dows使用其他的方法实现这些功能。

在Linux系统中,OS服务层接口函数的实现在./drivers/acpi/osl.c文件中,在该文件中提供了一系列访问系统资源的标准函数,这些函数实现的功能相对简单,如acpi_os_printf函数、acpi_os_sleep函数、acpi_os_write_memory、acpi_os_read_pci_configuration。在该文件中,还包含一些最基本的与访问外部设备、内存管理和进程调度相关的操作函数。

例如在ACPICA程序释放中断服务例程时,需要调用acpi_os_remove_interrupt_handler函数,而不能直接调用Linux系统提供的free_irq函数,即便在Linux系统中,这两个函数几乎等价。因为acpi_os_remove_interrupt_handler函数的主要工作就是调用free_irq函数。该函数的实现如源代码14-11所示。

源代码14-11 acpi_os_remove_interrupt_handler函数

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

但是在开发与ACPICA相关的函数时,需要调用acpi_os_remove_interrupt_handler函数,而不能直接使用free_irq函数,以保证ACPICA的平台无关性,因为在不同的操作系统中,释放中断服务例程使用的函数并不相同。

ACPICA使用OS服务层接口函数,极大降低了ACPICA接口函数的移植难度,在Linux系统中实现的ACPICA接口函数可以方便地移植到其他操作系统中。