ACPI

**進階組態與電源介面**（英語：**Advanced Configuration and Power Interface**，縮寫：**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 相比之下需要最長的時間。

 

### 處理器電源狀態 (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
* 韌體

## 參考文獻

## 外部連結

* https://acpica.org （頁面存檔備份，存於網際網路檔案館）