**高级配置与电源接口**（英語：，縮寫：**ACPI**），是1997年由英特尔、微软、东芝共同提出、制定的操作系统電源管理、硬體組態介面，是一种開放标准，取代了進階電源管理、多處理器規範、舊式隨插即用（英语：）規範。2000年8月康柏和凤凰科技加入，推出 ACPI 2.0规格。2004年9月惠普取代康柏，推出 ACPI 3.0规格。2009年6月16日則推出 ACPI 4.0规格。2011年11月23日推出ACPI 5.0规格。由于ACPI技术正被多个操作系统和处理器架构采用，该规格的管理模式需要与时俱进。2013年10月，ACPI的推广者们一致同意将ACPI的属有归到UEFI论坛。今后新的ACPI规格将由UEFI论坛制定。ACPI定義了系統韌體（BIOS或UEFI）和作業系統之間的硬體抽象介面。

概要
--

作为标准中最广为认可的部分，电源管理经历了较多的改进。

首先，進階電源管理（APM, Advanced Power Management）将电源管理几乎完全分配给BIOS控制，这大大的限制了操作系统在控制电能消耗方面的功能。

ACPI可以实现的功能包括：

* 系统电源管理（System power management）
* 设备电源管理（Device power management）
* 处理器电源管理（Processor power management）
* 设备和处理器性能管理（Device and processor performance management）
* 配置/即插即用（Configuration/Plug and Play）
* 系统事件（System Event）
* 电池管理（Battery management）
* 温度管理（Thermal management）
* 嵌入式控制器（Embedded Controller）
* SMBus控制器（SMBus Controller）

Windows 98是微软第一个支持ACPI的操作系统。FreeBSD v5.0是支持ACPI的第一个UNIX操作系统 [來源請求]。Linux、NetBSD和OpenBSD都支持ACPI。Windows Vista及以後的Windows要求電腦必須支援ACPI。

ACPI术语（部分）
----------

* **高级配置电源管理接口（Advanced Configuration and Power Interface (ACPI)）**

按照在本文中的定义， ACPI是一种描述硬件接口的方法，要足够抽象以允许灵活创新的硬件实现，并且足够具体以允许shrink-wrap OS code使用这个硬件接口
* **ACPI硬件（ACPI Hardware）**

它是一种电脑硬件，具有支持OSPM所必备的特性，而且还具有特定的接口，这些接口的特性是由ACPI规范所指定的描述表（Description Tables）所描述的。
* **ACPI命名空间（ACPI Namespace）**

一个树状层次机构，在受操作系统控制的内存里面，这段内存里面包含命名对象（named objects）等。这些对象（objects）可以是数据对象，控制方法对象，总线/设备包对象等。操作系统通过从驻留在 ACPI BIOS 中的 ACPI Tables 载入载出（loading and/or unloading）定义块（definition blocks），来动态改变命名空间（namespace）的内容。在ACPI Namespace 中的所有信息都来自 Differentiated System Description Table (DSDT)，DSDT 里面包含了 Differentiated Definition Block 还有一个或者多个其他的定义块（definition blocks）。
* **ACPI机器语言（ACPI Machine Language (AML)）**

是一种由ACPI兼容的OS支持的虚拟机的伪代码（Pseudo-code），里面写有ACPI控制方法和控制对象。
* **高级可编程中断控制器（Advanced Programmable Interrupt Controller (APIC)）**

一个中断控制器架构，通常多见于Intel32位架构（Intel Architecture-based 32-bit）的PC系统。APIC架构支持多处理器中断管理（中断均匀的分布在所有处理器），多I/O子系统支持，与8259A兼容，并且支持处理器内部中断（Inter-Processor Interrupt, IPI）。这个架构由直属于处理器的本地APICs（Local APICs）和在（南桥）芯片中的I/O APIC组成。
* **ACPI源语言（ACPI Source Language (ASL)）**

一种和AML等同的编程语言。ASL编译以后就是AML镜像（AML images）。
* **控制方法（Control Method）**

控制方法定义OS如何执行一个简单的硬件任务。例如，OS调用控制方法（Control Method）去读取一个高温区的温度。控制方法是用一种叫做AML的编码语言写的，AML可以被兼容ACPI的OS所解释并执行。ACPI兼容的系统必须在ACPI table中提供一组最小的控制方法。OS提供一组well-defined 的控制方法，以使ACPI table开发者能够在他们的控制方法中引用。OEM厂商可以通过，要么Including control methods in the BIOS that test configurations and respond as needed，要么为芯片组的不同修订版包含一组不同的控制方法，来使一个BIOS能够同时支持芯片组的不同修订版。
* **中央处理器或者处理器（Central Processing Unit (CPU) or Processor）**

* **定义区块（Definition Block）**

Definition Blockl以数据和控制方法（编码成AML）的形式包含关于硬件实现和配置详细信息。OEM厂商可以在ACPI Tables中提供一个或者多个Definition Blocks。有一个definition block是必须被提供：那就是Differentiated Definition Block，它描述了基本的系统。在装载Differentiated Definition Block之后，紧接着OS会把Differentiated Definition Block的内容插入到ACPI Namespace。OS可以动态的从the active ACPI Namespace插入和删除的其他definition blocks，可以包含指向Differentiated Definition Block的引用。
* **装置（Device）**

* **熱溫區（Thermal Zone）**

* **ACPI 風扇（Fan）**

* **装置上下文（Device Context）**

装置中包含的变化的数据；通常是易失性（volatile）数据。当进入或者离开特定的状态（states）的时候，设备应该忘记这些信息，在这种情况下OS软件负责保存并恢复这些信息。设备上下文（Device Context）指的是包含在设备周边的小数量的信息。同样可以看看系统上下文。
* **区分系统描述表（Differentiated System Description Table (DSDT)）**

OEM厂商必须为ACPI兼容的OS提供一个DSDT。这个DSDT包含区分定义块，它能提供关于基本系统的实现和配置信息。OS总是在ACPI Namespace中插入DSDT信息，当系统启动的时候，而且绝不会删除它。
* **統一可扩展固件接口（Unified Extensible Firmware Interface (UEFI)）**

它是一个在OS和固件平台之间的接口。
* **嵌入式控制器（Embedded Controller）**

* **嵌入式控制器介面（Embedded Controller Interface）**

* **韌體ACPI控制结构（Firmware ACPI Control Structure (FACS)）**

在读写内存中的一种结构，BIOS用它来实现韌體和OS之间的信息交换（handshaking ）。通过FADT(Fixed ACPI Description Table)FACS被转到兼容ACPI的OS中。FACS包含上次启动时的系统硬件签名，firmware waking vector，和Global Lock。
* **固定ACPI描述表（Fixed ACPI Description Table (FADT)）**

一个包含ACPI 硬件寄存器块（Hardware Register Block）的实现和配置详细信息的表，OS需要用这些配置信息来直接管理ACPI硬件寄存器块和DSDT的物理地址，DSDT则包含其他平台的实现和配置详细信息。 OEM厂商必须在RSDT/XSDT中提供FADT给兼容ACPI的OS。当系统启动的时候，OS则总是把已经定义好了的namespace信息（它存在于DSDT的Differentiated Definition Block中）插入到ACPI Namespace，并且OS绝不会删除它。
* **固定特征（Fixed Features）**

ACPI接口提供的一组特征。ACPI规范限制硬件编程模型（hardware programming model）在哪产生还有如何产生的。所有的Fixed Features，如果被使用了，会按照本片规范中的描述进行实现，以使OSPM能够直接访问Fixed Features寄存器（fixed feature registers）。
* **固定特征事件（Fixed Feature Events）**

一组事件，当Fixed Feature寄存器中的一对状态和事件位（event bits）被在同一时间设定时，这组事件会在ACPI接口处发生。当一个Fixed Feature时间发生时，系统控制中断（SCI，system control interrupt）is raised。对于ACPI Fixed Feature Events来说OSPM（or an ACPI-aware driver）扮演事件的处理者。
* **固定特征寄存器（Fixed Feature Registers）**

一组在fixed feature register space中的硬件寄存器，fixed feature register space在系统I/O地址空间的特殊的地址里。ACPI为fixed features定义了寄存器块（register blocks）（每个寄存器块从FADT那里得到一个单独的指针）
* **一般目的事件寄存器（General-Purpose Event Registers）**

The general-purpose event registers contain the event programming model for generic features. All general-purpose events generate SCIs.
* **一般特征（Generic Feature）**

* **全局系统状态（Global System States）**

Global System States适用于整个系统，而且对于用户是可见的。各种不同的Global System States在ACPI规范中是从G0标记到G3的。
* **省略位（Ignored Bits）**

在ACPI硬件寄存器中的一些没有被使用的位（bits），在ACPI规范中会指定这些位是"ignored"的。在读的时候，软件会忽略ACPI硬件寄存器中的Ignored Bits位（而不去读取它），写的时候，会保护Ignored Bits（不去写这写位）。
* **Intel个人电脑架构（Intel Architecture-Personal Computer (IA-PC)）**

一种对于计算机的一般描述术语，这种计算机的处理器架构符合Intel处理器家族基于Intel架构指令集（Intel Architecture instruction set）的定义，并且有工业标准（industry-standard）PC的结构。
* **I/O APIC（Input/Output Advanced Programmable Interrupt Controller）**

一个输入输出高级可编程中断控制器，用来从设备传递中断给处理器里面的本地APIC（local APIC）。
* **I/O SAPIC**

An Input/Output Streamlined Advanced Programmable Interrupt Controller用来从设备传递中断给处理器里面的本地APIC（local APIC）。应用于安腾处理器（Itanium）。和APIC的不同可以看看Intel® Itanium® Processor Family Interrupt Architecture Guide ，PDF文档的最后一章会讲到不同点。
* **老式的（Legacy）**

这是一种电脑状态，在这个电脑状态下电源管理策略是由平台硬件/固件决定的。在如今的系统中，传统电源管理特性被用来支持安装有传统OS的电脑中的电源管理，这种传统OS并不支持OS直接管理电源架构（OS-directed power management architecture）。
* **老式的硬件（Legacy Hardware）**

没有ACPI或者OSPM电源管理支持的电脑系统。
* **老式的操作系统（Legacy OS）**

此類的作業系統無法得知或對系統的電源管理功能做管理，包含在此類型內的如一些支援APM 1.x的作業系統。
* **本地APIC（Local APIC）**

接收来自I/O APIC的中断。
* **本地SAPIC（Local SAPIC）**

接收来自I/O SAPIC的中断。关于SAPIC，请看"I/O SAPIC"。
* **复合APIC描述表（Multiple APIC Description Table (MADT)）**

它被用在支持APIC和SAPIC的系统上，以描述APIC的实现。Following the MADT is a list of APIC/SAPIC structures that declare the APIC/SAPIC features of the machine.
* **对象（Object）**

ACPI Namespace的节点就是objects，这些objects被OS用system definition tables中的信息插入tree。这些objects可以是数据对象（data objects），包对象（package objects），控制方法对象（control method objects）等。包对象refer to其他对象（objects）。对象同样拥有类型（type），大小（size），和相对名称（relative name）。
* **对象名（Object name）**

ACPI Namespace的一部分。有一组规则for naming objects。
* **操作系统直接电源管理（Operating System-directed Power Management (OSPM)）**

电源（和系统）管理的一个模型，在其中OS扮演重要的角色，使用全局信息为手边的任务优化系统行为（system behavior）。
* **包（Package）**

一组objects。
* **电源按鈕（Power Button）**

用户按的按钮或者其他有触点的开关（switch contact）设备，通过它可以把系统从睡眠或者soft off状态切换到工作状态，还可以给OS发送信号使OS从睡眠或者soft off状态恢复到工作状态。
* **电源管理（Power Management）**

一种最小化系统电源消耗的软硬件机制，管理系统热量限制，延长系统电池使用时间（battery life）。电源管理在系统速度，噪音，电池使用时间，处理器速度，还有电源消耗之间取得平衡。一些system functions，比如appliance (for example, answering machine, furnace control) operations，需要电源管理。
* **电源资源（Power Resources）**

设备需要的资源（比如power planes和clock sources），设备需要在给定的电源状态下对这些资源进行操作。
* **电源来源（Power Sources）**

* **寄存器分组（Register Grouping）**

由两个寄存器块组成（它有两个指向两个不同寄存器块的指针）。在寄存器分组（register grouping）内部的固定位可以被在两个寄存器块（register blocks）之间拆分。这就允许了在寄存器分组内部的位可以被在两个芯片（chips）之间拆分。
* **保留位（Reserved Bits）**

在ACPI硬件寄存器中有一些没有被使用的位，在ACPI规范中被称为保留位。为了未来能够扩展，硬件寄存器保留位总是被归零，并且写入的数据不会造成其他的影响。OSPM的实现必须往所有使能和状态寄存器的保留位写"0"，同样还要往控制寄存器（control registers）的preserve bits写"0"
* **根系统描述指针（Root System Description Pointer (RSDP)）**

兼容ACPI的系统必须在系统低地址空间（system’s low address space）提供一个RSDP。这种结构的唯一目的就是提供RSDT和XSDT的物理地址。
* **根系统描述表（Root System Description Table (RSDT)）**

signature为RSDT的table，它跟随在一组指向其他系统描述表（system description tables）的物理指针之后。OS通过跟随RSDP结构中的指针来定位RSDT。

状态
--

### 全局状态（Global System States，G-State）

ACPI规范定义了一台兼容ACPI的计算机系统可以有以下七个状态（所谓的全局状态）：

* **G0**(**S0**)*正常工作状态*：计算机的正常工作状态-操作系统和应用程序都在运行。CPU执行指令。 在这个状态下(即没有进入G1*睡眠*)，CPU、硬盘、光碟機等设备可以进入節能狀態（如裝置和處理器效能狀態P-State、裝置電源狀態D-State、處理器電源狀態C-State）或從節能狀態恢復。
* **G1** *睡眠* 细分为从S0ix到S4等幾種状态。Linux內核的/sys/power/state檔案中對應的關鍵字與狀態: standby(S1), mem(S3), disk(S4)。在Windows中可用`powercfg /a`命令列出平台支援的ACPI G1狀態。
	+ **S0ix**：Modern Standby。只有BIOS、作業系統和所有的硬件都支援S0ix才能使用Modern Standby。S0ix與S3不相容。
	+ **S1**：最耗电的睡眠模式。CPU的所有寄存器被刷新，并且CPU停止执行指令。CPU和内存的电源被維持。这种模式通常叫*Power on Suspend*或者叫做POS。老式的电脑对S1支持可能比S3好。
	+ **S2**：一種比S1更深的睡眠状态，停止CPU的電源供應。然而，这种模式通常并不被采用。
	+ **S3** ：又稱為*Suspend to RAM*或STR，在Windows XP以后的Windows版本和一些Linux发行版中叫做"待机(Standby)"， 在Windows Vista和Mac OS X则叫做"睡眠(Sleep)"。在这个状态下，RAM是唯一的有电源供應的元件。S3的恢复的过程比S4快。如果S3睡眠過程中斷電，則所有儲存在RAM中的資料將遺失。S3是筆記型電腦最常用的睡眠模式。
	+ **S4**： 在Windows中叫*休眠* ，在Mac OS X中叫作*安全睡眠*，也稱為Suspend to Disk。在这个状态下，所有内存的内容被储存在硬盘，儲存操作系统当前的状态。S4和S3之间的差异是：S4消耗的時間較S3長；S3状态下的时候如果系統斷電，則所有RAM上的数据就会丢失，包括所有的没有保存的文档，而在S4状态下则没有影响。S4和"S1-S3"状态有很大不同，更类似G2*Soft Off*状态和G3 *Mechanical Off*状态。在S4状态下的系统同样可进入G3(*Mechanical Off*)状态，并且保留S4时候的状态信息。在Windows中可用`powercfg`命令的`/h`開關設定Windows的休眠功能。
* **G2**（**S5**）*Soft Off*--*G2*，*S5*，和*Soft Off*都是相同的叫法。G2和G3*Mechanical Off*几乎是相同的，但有些部件仍然带电，使计算机仍然可以被键盘、时钟（RTC）、數據機、LAN、USB等设备所唤醒。在启动系统从G2恢复到G0*正常工作*模式的过程中，无论是G3 *Mechanical Off*还是G2都得运行启动程式来启动操作系统。

此外，当操作系统在不支持ACPI的情况下运行，这种状态被定义为*Legacy*。在这个状态下，硬件和电源不是通过ACPI来管理的，而是由進階電源管理（APM）、舊式隨插即用（Legacy Plug and Play）等管理。

* **G3**（**S6**）*Mechanical Off*--*G3*，*S6*，和*Mechanical Off*都是相同的叫法。即全部件斷電，在這種情況下只能從開機鍵喚醒。

（参考资料：ACPI规范3.0b版的链接在下面 External links, 查看chapter 7.3.4)

### 设备电源状态(Device Power State)

当一个设备已没有电源供应的时候，可能整个電腦系统还在工作，光驱是一个很好的例子。
设备状态是与设备相关的状态，他们的定义和以下四个因素有关：

**电源消耗**（Power consumption），设备用电量的多少。

**设备状态/环境**（Device context），设备（从D0进入其他状态的时候）保留了多少原来的状态/环境。操作系统负责保存丢失的设备状态/环境。

**设备驱动**（Device driver），让设备恢复到D0，驱动程序应该做什么（或者做多少）。

设备状态有以下几个：

* D0 *Fully-On* 是（正常）工作状态，电源消耗量最多，设备是完全被響應的，并且设备保留了全部的设备状态/环境。
* D1 和 D2是中间电源状态，它的定义根据设备的不同而有所不同。
* D3 *Off*是设备电源关闭所以对总线来说是没有相应的。设备状态/环境全部丢失，操作系统会重新初始化设备当重新给它加电的时候。这个状态下的设备恢复到D0相比之下需要最长的时间。

  


**设备状态总结**| 设备状态 | 电源消耗 | 保留设备状态信息 | 驱动程序恢复 |
| --- | --- | --- | --- |
| D1 | D0>D1>D2>D3 | >D2 | <D2 |
| D2 | D0>D1>D2>D3 | <D1 | >D1 |
| D3 - Off | 0 | 没有保留 | 完全初始化并且装载 |

### 处理器电源状态(Processor Power State)

处理器电源状态（C0，C1，C2，C3……Cn状态）是指在G0状态下的处理器电能消耗和温度管理的状态。

只有C0状态下CPU才会执行指令，C1到Cn状态下CPU都处于各种不同程度的睡眠状态（*Sleeping States*），在这睡眠状态下，CPU都有一个恢复到C0的唤醒时间（*latency*），它是和CPU的电能消耗有关的，通常，用电能量越小意味着得花更长的时间恢复到C0状态，也就是唤醒时间越长。

当在C0状态下时，ACPI可以通过性能状态（P-states）来改变处理器的性能。

各个状态的定义如下所示：

* C0是正常工作状态，当处理器处于这种状态下的时候，它能正常处理指令。
* C1（通常称为*Halt*），拥有最短的唤醒时间，这个延时必须短到操作系统软件使用CPU的时候不会考虑到唤醒时间方面的因素。一些处理器，比如Pentium 4、酷睿，支持C1E（Enhanced C1 state）。
* C2 (通常称为*Stop-Clock*)，这个状态下处理器维持着所有的软件所见的状态信息，但是需要更长的时间来恢复到C0。这个状态下情况最坏的硬件唤醒时间是由ACPI固件提供，并且操作系统可以利用这些信息来决定是采用C1而不是C2状态，C2比C1更省电。
* C3 (通常称为*Sleep*)，相比C1和C2更省电了。这个状态下情况最坏的硬件唤醒时间是由ACPI固件提供，并且操作系统可以利用这些信息来决定是采用C2而不是C3状态，当处于C3状态时，处理器缓存保留了所有的状态信息，但是忽略所有的侦听。操作系统负责保证缓存数据的一致性。
* 附加的C-State由處理器廠商來定義，如Intel Haswell處理器最多有C10。

### 设备和处理器性能状态（Device and Processor Performance States）

设备和处理器性能状态（Px状态）是在C0（对于处理器）和D0（对于设备）下定义的电源消耗和能力的状态。性能状态允许OSPM在性能和能源消耗之间取得平衡。P0是最高性能状态，从P1到P*n*是连续的低性能状态，最高限制*n*为16。

* P0状态，使用最大性能并且消耗的电能最多。
* P1状态，性能比前者要小，但是消耗电能也相应少一些。
* Pn状态，n是的大小是依赖于处理器和设备的，处理器和设备可以定一个任意的不超过16的数字。

这个状态在Intel处理器中称为SpeedStep，在AMD处理器中称为PowerNow!、Cool'n'Quiet，在VIA处理器中称为PowerSaver。

參見
--

* BIOS
* UEFI
* 韌體

参考文献
----

1. ↑ . SearchWindowsServer.  [2020-09-18]. （原始内容存档于2019-05-15） （英语）.
2. ↑ . www.kernel.org.  [2020-09-18]. （原始内容存档于2020-08-05）.
3. ↑ . docs.microsoft.com.  [2020-03-20]. （原始内容存档于2022-04-23） （中文（繁體））.
4. ↑  Aram Kananov » How To: ACPI Suspend to RAM on Dell Latitude D800 with Fedora Core 3 的存檔，存档日期2008-10-02.

外部連結
----

* （页面存档备份，存于）