Linux acpi off – the Advanced Configuration & Power Interface. ACPI是OS,BIOS和硬件之间的抽象层。它允许OS和平台独立的发展,比如新的OS可以控制老的平台,老的OS也可以控制新的平台而不需要额外的修改。
ACPI寄存器,描述了和ACPI相关的寄存器。OS可以直接从ACPI表中取得这些寄存器的信息,因此不必了解具体的硬件配置。
AML代码,一种类C的代码。由BIOS提供,OS的AML解释器(在Linux中叫ACPI CA)解释执行这些代码。这是ACPI抽象层的关键,下面会详细介绍。
配置信息,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设备,Linux acpi off规范定义了OS必须执行此设备的_DIS函数。从硬件的角度来讲,禁止LNKA设备需要将某个PCI设备的配置空间的寄存器0×60的最高位置上。OS不需要知道硬件的细节,它解释执行_DIS函数即可。上面的代码就是AML代码,由BIOS提供,语句‘Or (\_SB.PCI0.LPC.PIRA, 0×80, \_SB.PCI0.LPC.PIRA)’实际上就是给寄存器\_SB.PCI0.LPC.PIRA置上最高位, 而PIRA就是PCI设备LPC的配置空间的寄存器0×60。从此段代码我们可以明显的看出BIOS以AML代码的形式隐藏(抽象)了硬件的细节,从而使得OS看到的是一个平台无关的硬件。
更多的Linux acpi off预定义的函数可以在ACPI规范中找到,可以在http://www.acpi.info下载最新的规范。
Linux acpi off实现中使用的AML解释器是ACPICA -the ACPI Component Architecture. 可以从http://www.intel.com/technology/iapc/acpi/downloads.htm得到。它包含一个AML解释器(Linux kernel包含了这个解释器,很多其他OS也是如此,比如BSD、opensolaris等),一个编译器(将ACPI Source Language (ASL)编译成AML代码)和一些测试工具。
最新的Linux acpi off的代码可以使用git在http://www.kernel.org/git/?p=linux/kernel/git/lenb/linux-acpi-2.6.git得到。
【编辑推荐】
- Linux 查看磁盘空间实现代码介绍
- Linux操作系统需要微软的十大帮助
- 探寻Linux到底需要多低的配置
- Linux测试工具tcpdump监视TCP/IP连接命令介绍
- Linux流量控制实例应用介绍