Linux ACPI

ACPI-the Advanced Configuration & Power Interface. ACPI是OS、BIOS和硬件之间的抽象层。它允许OS和平台独立的发展,比如新的OS可以控制老的平台,老的OS也可以控制新的平台,而不需要额外的修改。ACPI的基本结构图:

计算机领域的一个基本方法是增加一个抽象层,从而使得抽象层的上下两层独立的发展,ACPI事实上也是借鉴类似的思想。ACPI的抽象主要是通过ACPI表中提供的信息来实现,这些信息包括ACPI寄存器、AML代码、配置信息。

(1)ACPI寄存器,描述了和ACPI相关的寄存器。OS可以直接从ACPI表中取得这些寄存器的信息,因此不必了解具体的硬件配置。

(2)AML代码,一种类C的代码,由BIOS提供,OS的AML解释器(在Linux中叫ACPI CA)解释执行这些代码。这是ACPI抽象层的关键,下面会详细介绍。

(3)配置信息,ACPI包含的配置信息很多,比如多处理器配置信息(MADT)、NUMA配置信息(SRAT、SLIT)、高精度定时器(HPET)等。

AML代码是抽象的关键,为了消除平台相关性,BIOS把平台相关的操作用AML代码来实现。OS不需要知道平台的细节,它只是解释执行这些代码,在解释执行的过程中平台相关的操作就被执行了。ACPI规范定义了一些标准的AML函数,OS解释执行一个这样的标准函数就可以实现特定的功能。举个例子:

Scope (_SB.PCI0.LPC) {  	
OperationRegion (LPCS, PCI_Config, 0x00, 0x0100)  	
Field (LPCS, AnyAcc, NoLock, Preserve)  	{  	
    Offset (0x60),                                            
    PIRA,   8,  	} 
} Device (LNKA) { 
                    Method (_DIS, 0, NotSerialized)   
        {      Or (/_SB.PCI0.LPC.PIRA, 0x80, /_SB.PCI0.LPC.PIRA)  	} }

比如我们想禁止LNKA设备,ACPI规范定义了OS必须执行此设备的的_DIS函数。从硬件的角度来讲,禁止LNKA设备需要将某个PCI设备的配置空间的寄存器0x60的最高位置上。OS不需要知道硬件的细节,它解释执行_DIS函数即可,上面的代码就是AML代码,由BIOS提供,语句 ‘Or (/_SB.PCI0.LPC.PIRA,0x80,/_SB.PCI0.LPC.PIRA)’实际上就是给寄存器/_SB.PCI0.LPC.PIRA置上最高位,而PIRA就是PCI设备LPC的配置空间的寄存器0x60。从此段代码我们可以明显的看出BIOS以AML代码的形式隐藏(抽象)了硬件的细节,从而使得OS看到的是一个平台无关的硬件。

更多的ACPI预定义的函数可以在ACPI规范中找到,可以在http://www.acpi.info/下载最新的规范。

Linux/ACPI实现中使用的AML解释器是ACPICA- the ACPI Componet Architecture。可以从https://www.intel.com/content/www/us/en/standards/processor-vendor-specific-acpi-specification.html得到。它包含一个AML解释器(Linux kernel包含了这个解释器,很多其他OS也是如此)、一个编译器(将ACPI Source Language(ASL)编译成AML代码)和一些测试工具。

猜你喜欢

转载自blog.csdn.net/CHS007chs/article/details/88011098