在寫下第一行 ASL 之前,你必須先知道這門語言存在的理由。本章從歷史與架構 切入,建立「韌體描述硬體、作業系統解讀並決策」這個 ACPI 的核心世界觀。
說明 ACPI 解決了什麼問題,以及它取代了哪些舊機制。
描述 BIOS/UEFI 與 ACPI 的分工:誰產生資料、誰解讀資料。
說明 OS 如何透過 ACPI 取得硬體資訊並綁定 Device Driver。
指出 ACPI 在 Windows 與 Linux 軟體堆疊中的位置。
說明 ACPI 與 Power Management 的關係。
不看書畫出 Hardware 到 Device Driver 的完整資料流圖。
ACPI 解決什麼問題?
1990 年代中期以前,PC 的電源管理與硬體組態是韌體的私有領域: (Advanced Power Management)由 BIOS 全權決定何時降頻、 何時休眠,作業系統只能透過少數 BIOS call 被動配合;主機板上有哪些裝置、 用哪些資源,則由 PnP BIOS、MPS 表等各自為政的機制描述。這帶來三個問題:
OS 是瞎子:BIOS 突然把機器休眠,OS 完全不知情, 檔案系統與網路連線說斷就斷。
各家行為不一致:每家 OEM 的 APM 實作不同, OS 無法寫出可攜的電源管理策略。
描述能力不足:越來越多裝置(Embedded Controller、 電池、感測器)不在 PCI 這類可自動列舉的匯流排上, 舊機制無法告訴 OS 它們的存在。
1996 年,Intel、Microsoft、Toshiba 共同制定了 (Advanced Configuration and Power Interface), 後來由 UEFI Forum 接手維護,目前版本為 ACPI 6.5。 ACPI 的核心思想是(Operating System-directed configuration and Power Management):
韌體負責描述(describe):把硬體組態、電源控制方法寫成 ACPI Tables 放進記憶體。作業系統負責決策(decide): 讀取這些描述,由 OS 統一決定何時開關裝置、何時睡眠。 ACPI 本身不是驅動程式,而是韌體與 OS 之間的介面與合約。
兩代機制的對比如下:
| APM 時代 | ACPI 時代 | |
|---|---|---|
| 決策者 | BIOS | 作業系統(OSPM) |
| OS 的角色 | 被動配合 | 主動管理 |
| 硬體描述 | PnP BIOS、MPS 等分散機制 | 統一的 ACPI Namespace |
| 擴充方式 | 各家自訂 BIOS call | 標準化的 Tables 與 AML |
| 可攜性 | 低 | 高(跨 OS、跨平台) |
BIOS/UEFI 與 ACPI 的關係
很多初學者以為「ACPI 是 BIOS 的一部分功能」,這只對了一半。 正確的說法是:BIOS/UEFI 在開機時「生產」ACPI Tables, 之後便退居幕後;「消費」這些 Tables 的是作業系統。
開機流程如下:韌體完成硬體初始化(POST)後,把一系列 ACPI Tables 放進系統記憶體,並在交棒給 OS 時留下一個入口點—— (Root System Description Pointer)。 UEFI 系統透過 EFI Configuration Table 提供 RSDP; 傳統 BIOS 則讓 OS 在特定記憶體區段掃描簽章。 OS 從 RSDP 出發,就能找到所有其他表:
RSDP (Root System Description Pointer) └── XSDT (Extended System Description Table) ├── FADT (Fixed ACPI Description Table) │ └── DSDT ← AML:本教材的主角 ├── SSDT ← AML:DSDT 的延伸(可有多個) ├── MADT ← 中斷控制器與 CPU 拓撲 ├── MCFG ← PCIe ECAM 組態空間 └── HPET / BGRT / ...
常見的表整理如下:
llL6.8cm 簽章 & 全名 & 用途
RSDP & Root System Description Pointer & 一切的起點,指向 XSDT
XSDT & Extended System Description Table & 其他表的位址目錄
FADT & Fixed ACPI Description Table & 固定硬體暫存器資訊,並指向 DSDT
DSDT & Differentiated System Description Table & 主要的硬體描述(AML),開機必載
SSDT & Secondary System Description Table & DSDT 的補充,可動態載入、可多個
MADT & Multiple APIC Description Table & CPU 與中斷控制器拓撲
MCFG & Memory-mapped Configuration & PCIe 組態空間基底位址
FACS & Firmware ACPI Control Structure & 韌體與 OS 共享的控制區(喚醒向量)
BIOS/UEFI 把 ACPI Tables 放進記憶體後就功成身退; 表中的 AML 位元組碼是由 OS 內建的 ACPI Interpreter 執行的, 不是由韌體執行。這就是為什麼改壞 DSDT 通常導致 OS 開機當機, 而不是 BIOS 畫面出不來。
OS 如何取得 Hardware Information?
硬體分成兩類。第一類是(enumerable)的:PCI、USB 裝置插上去就能被匯流排協定自動發現,不太需要 ACPI 幫忙。 第二類是的:Embedded Controller、GPIO 控制器、 I2C 感測器、電池、電源鍵、筆電上蓋開關……這些裝置沒有自我介紹的能力, OS 完全依賴 ACPI 的描述才知道它們存在。
以「筆電上蓋開關」為例,DSDT 裡通常有這樣一段 ASL:
Scope (_SB)
Device (LID0)
Name (_HID, EisaId ("PNP0C0D")) // Lid device 的標準 ID
Method (_LID, 0, NotSerialized) // Query: open or closed? Return (LIDS) // LIDS: EC field, 1 = open
OS 開機時的處理流程是:
之後只要上蓋開閤,韌體發出事件,OS 呼叫 方法讀取狀態, 再決定要不要睡眠——描述來自韌體,決策屬於 OS,這正是 OSPM 的精神。
ACPI 與 Device Driver 的關係
ACPI 不取代 Driver,而是替 Driver 做三件事:
發現(Discovery):透過 / 識別碼,OS 知道該載入哪個 Driver。
資源(Resources):透過 , Driver 知道裝置用哪段 MMIO、哪個 IRQ、哪條 I2C 匯流排。
控制(Control):Driver 在執行期呼叫 ACPI Method (例如 上電、 斷電、 裝置特定功能),由 AML 代為敲硬體暫存器。
ACPI 描述「裝置在哪裡、怎麼開關」;Driver 實作「裝置怎麼用」。 兩者透過 Namespace 中的物件與 Method 互相銜接: Driver 是 Method 的呼叫者,AML 是 Method 的實作者。
ACPI 在 Windows / Linux 中的位置
兩大作業系統都內建 ACPI Interpreter:
Windows: 是 ACPI bus driver, 負責解譯 AML、建立裝置樹,再由 PnP Manager 載入各裝置驅動。
Linux:核心的 子系統內嵌了 (ACPI Component Architecture,Intel 維護的 參考實作),與 iASL 編譯器系出同門。
在 Linux 上,你隨時可以觀察 ACPI 的存在:
\(ls /sys/firmware/acpi/tables/ APIC DSDT FACP FACS HPET MCFG SSDT1 SSDT2 ...\) dmesg | grep -i acpi | head -5 ACPI: Core revision 20230628 ACPI: Interpreter enabled ACPI: PM: (supports S0 S3 S4 S5)
整體軟體堆疊如下(由下而上):
ACPI 與 Power Management 的關係
電源管理是 ACPI 最初誕生的理由,也是它最重要的應用。ACPI 定義了 多層次的電源狀態(詳細內容在 Module 7):
clL6.2cm 層級 & 狀態 & 意義
系統 & S0–S5 & S0 運作中、S3 睡眠、S4 休眠、S5 關機
裝置 & D0–D3 & D0 全速運作、D3 斷電
CPU(閒置) & C0–Cn & C0 執行中,數字越大越省電、喚醒越慢
CPU(效能) & P0–Pn & P0 最高頻率,數字越大頻率越低
按下睡眠鍵時,OS 會呼叫 DSDT 中的 (Prepare To Sleep), 逐一將裝置降到低功耗 D-state,最後透過 FADT 描述的暫存器讓系統進入 S3——每一步都由 ASL 寫的 Method 參與。
完整資料流:從硬體規格到 Driver
把本章所有觀念串起來,就是這張你必須背下來的圖:
而站在開發者的角度,Intel 的 ASL Tutorial 描述的工作流程 則是這張圖的「生產端」:
本教材接下來的所有內容,都是在把這條生產線的每一站拆開來練習: Module 2 先搞懂 ASL 與 AML 的關係和 Namespace,Module 3 學語法, Module 4–7 學會描述裝置與電源,Module 8–10 進入 DSDT/SSDT 實戰與除錯,最後在 Module 11–12 把 ACPI 接上 Linux Kernel 與 Driver。
「ACPI 是 BIOS 設定畫面」——錯。設定畫面是韌體 UI; ACPI 是韌體交給 OS 的資料與位元組碼。
「AML 由 BIOS 執行」——錯。AML 由 OS 的 Interpreter 執行。
「PCI 裝置都靠 ACPI 才能被發現」——錯。PCI 可自動列舉, ACPI 主要補足不可列舉裝置與電源管理。
ACPI 讓「描述」與「決策」分離:韌體描述硬體,OS 決策管理(OSPM)。
BIOS/UEFI 生產 ACPI Tables;OS 透過 RSDP \(\to\) XSDT \(\to\) FADT 找到 DSDT,解譯 AML 建立 Namespace。
不可列舉的裝置(EC、GPIO、I2C 感測器、電池)完全依賴 ACPI 描述。
Driver 透過 綁定、 取得資源、 呼叫 Method 控制電源。
Windows 用 ,Linux 用內嵌的 ACPICA。
用自己的話解釋 OSPM:APM 時代與 ACPI 時代,「誰做決策」有什麼不同?
為什麼 Embedded Controller 和 I2C 感測器一定需要 ACPI 描述, 而 USB 隨身碟不需要?
在一台 Linux 機器上執行 , 記錄你看到的表,並對照本章表格說出每一張的用途。
不看書,畫出從 Hardware 到 Device Driver 的八層資料流圖, 並標出「哪一層是韌體產生的、哪一層是 OS 執行的」。