33.3. ACPI

ACPI (進階組態與電源介面) 可讓作業系統設定和控制個別的硬體元件。ACPI 可取代 PnP 與 APM。它能提供一些資訊,包括電池、變電器、溫度、風扇以及 "關閉蓋子" 或 "電池電力不足" 等系統事件。

BIOS 會提供一些表格,內含關於個別元件與硬體的存取方法等資訊。作業系統會使用這此資訊來執行工作,像是指定中斷或啟動和關閉元件。因為作業系統會執行儲存於 BIOS 中的指令,所以 BIOS 實行會決定其功能。ACPI 能偵測和載入的表格在 /var/log/boot.msg 中可以找到。請參閱 節 33.3.4, "疑難排解",以取得更多有關 ACPI 問題疑難排解的資訊。

33.3.1. ACPI 的動作

如果核心在系統啟動時偵測到 ACPI BIOS,會自動啟動 ACPI 並關閉 APM。有些較舊的機器可能需要用到開機參數 acpi=force。電腦需支援 ACPI 2.0 或以後的版本。請檢查 /var/log/boot.msg 中的核心開機訊息,以查看 ACPI 是否啟動。

接著,需載入一些模組。這會由 acpid 的啟動程序檔來完成。如果其中任何一個模組導致問題發生,該項模組就不會在 /etc/sysconfig/powersave/common 中載入或取消載入。 系統記錄 (/var/log/messages) 內有模組的訊息,從中可以知道已偵測到哪些元件。

/proc/acpi 目前含有一些檔案,用來提供有關系統狀態的資訊,也可以用來對某些狀態進行變更。有些功能還不能使用,因為仍在開發中,而且有些功能的支援主要是依靠製造商是否在產品中實行。

所有檔案 (dsdtfadt 除外) 都可使用 cat 來讀取。有些檔案可使用 echo 修改設定,例如 echo X > file 可為 X 指定適合的值。powersave 指令是可存取這些值的一種簡單方式 ,它可做為省電精靈的前端工具。最重要的檔案說明如下:

/proc/acpi/info

有關 ACPI 的一般資訊。

/proc/acpi/alarm

在此指定何時從睡眠狀態中喚醒系統。目前,尚未完整支援此功能。

/proc/acpi/sleep

提供可能的睡眠狀態的相關資訊。

/proc/acpi/event

所有事件都會會在此報告,並經由 Powersave 精靈來加以處理 (powersaved)。如果沒有精靈存取此檔案,快速按一下電源按鈕或是關閉蓋子等事件,可使用 cat /proc/acpi/event 來讀取 (按 Ctrl-C 來終止)。

/proc/acpi/dsdt/proc/acpi/fadt

這些檔案包含 ACPI 的 (不同系統說明表格) DSDT 表格和 (固定 ACPI 說明表格) FADT 表格。可以使用 acpidmpacpidisasmdmdecode 來讀取它們。這些程式及其文件位於 pmtools 套件中。例如,acpidmpDSDT | acpidisasm

/proc/acpi/ac_adapter/AC/state

顯示是否已連接 AC 轉換器。

/proc/acpi/battery/BAT*/{提醒、資訊、狀態}

有關電池狀態的詳細資訊。透過比較資訊中的上次完整電量以及狀態中的剩餘電量來讀取充電等級。另一種更方便的方法,便是使用在 節 33.3.3, "ACPI 工具" 中所介紹的特別程式。會觸發電池事件的充電等級 (例如警告、低和極低) 可在提醒中指定。

/proc/acpi/button

此目錄包含各種切換 (如筆記型電腦蓋和按鈕) 的資訊。

/proc/acpi/fan/FAN/state

顯示風扇是否正在運作。以手動方式透過在此檔案中寫入 0 (開啟) 或 3 (關閉),以開啟或關閉風扇。不過,在系統過熱時,核心與硬體 (或 BIOS) 中的 ACPI 程式碼都會覆寫此設定。

/proc/acpi/processor/*

系統中的每個 CPU 都有個別的子目錄。

/proc/acpi/processor/*/info

關於處理器的省電選項的資訊。

/proc/acpi/processor/*/power

關於目前處理器狀態的資訊。在 C2 旁邊有星號表示處理器閒置中。查看使用值時,這是最常出現的狀態。

/proc/acpi/processor/*/throttling

能用來設定調節處理器的時脈。通常,調節可以有八個層級。這和 CPU 的頻率控制是兩回事。

/proc/acpi/processor/*/limit

如果是由精靈來自動控制效能 (過時) 及調節功能,則可在此指定最大上限。部份限制是由系統所決定。部份則可由使用者來調整。

/proc/acpi/thermal_zone/

每個溫度區都有一個子目錄。溫度區是指一個具有類似的溫度屬性的區域,由硬體製造商指定區域的數值及名稱。不過大部份由 ACPI 所提供的可能選項,很少被實作。通常反而是使用 BIOS 來控制溫度。作業系統很少有干預的機會,因為這可能會減少硬體的使用壽命。因此,有一部份的檔案僅具理論價值。

/proc/acpi/thermal_zone/*/temperature

溫度區目前的溫度。

/proc/acpi/thermal_zone/*/state

指示是否一切都正常,或 ACPI 是否套用主動被動冷卻規則。如果風扇控制獨立於 ACPI 之外,則狀態會一直是正常

/proc/acpi/thermal_zone/*/cooling_mode

選取由 ACPI 控制的冷卻方法。從被動 (效能較低,經濟型) 選擇或是作用中的冷卻模型 (完整的效能、風扇噪音)。

/proc/acpi/thermal_zone/*/trip_points

啟用判定溫度上限以觸發指定動作的功能,像是被動或主動冷卻、暫停 (過熱) 或關機 (嚴重)。在 DSDT (視設備而有所不同) 中定義可能動作。在 ACPI 指定中的啟動點分別是嚴重過熱被動主動 1主動 2。即使不會每個都會實作,仍必須依此順序將它們輸入在此檔案中。例如,echo 90:0:70:0:0 > trip_points 項目即是將 嚴重 的溫度設為 90,將 被動 設為 70 (以攝氏測量的所有溫度)。

/proc/acpi/thermal_zone/*/polling_frequency

如果在 temperature 檔案中的值,未在溫度變更時自動更新,請在此切換輪詢模式。echoX > /proc/acpi/thermal_zone/*/polling_frequency 指令能限定每 X 秒查詢一次溫度。設定 X=0 以關閉輪詢。

這些設定、資訊及事件都不需以手動方式編輯。可以使用省電精靈 (powersaved) 及其各種前端工具來完成,像是 powersave、kpowersave 及 wmpowersave。請參閱 節 33.3.3, "ACPI 工具"

33.3.2. 控制 CPU 效能

CPU 有三種省電方法。依據電腦的操作模式的不同,這些方法可合併使用。省電也表示能降低系統溫度,減低風扇的使用頻率。

頻率和電壓比例

AMD 與 Intel 分別以 PowerNow!Speedstep 來實作此技術。不過,此技術也套用於其他製造商的處理器中。CPU 的時脈頻率及其核心電壓會同時降低,產生高於線性的省電效能。也就是當頻率減半 (效能減半),使用的電量卻能遠低於原本的一半。此技術與 APM 或 ACPI 無關。CPU 頻率比例的執行有兩種主要的方式──利用核心本身或利用使用者空間應用程式。因此,有不同的核心調節器,這可在 /sys/devices/system/cpu/cpu*/cpufreq/ 下設定。

使用者空間調節器

如果設定使用者空間調節器,核心會將 CPU 頻率比例的控制權交給使用者空間應用程式 (通常是一個精靈)。在 SUSE Linux 版本中,這個精靈是 powersaved 套件。使用此執行方式時,CPU 頻率會根據目前的系統負載來調整。預設狀態下會使用核心執行方式之一。但是,對某些硬體,或特定的處理器或驅動程式而言,使用者空間執行仍是唯一可行的解決方案。

要求式調節器

這是動態 CPU 頻率規則的核心執行方式,應該適用於大部分系統。只要系統負載一過高,就立即提高 CPU 頻率。系統負載降低,則會隨之降低。

保守調節器

此調節器類似要求式調節器,但所用的規則比較保守。系統負載過高的情況必須持續一段時間後,才會提高 CPU 頻率。

省電調節器

CPU 頻率固定設為可能的最小值。

效能調節器

CPU 頻率固定設為可能的最大值。

調節時脈頻率

此技術會忽略部分 CPU 的時脈訊號脈衝。到達 25% 調節時,會省略四分之一脈衝。到達 87.5% 時則每八次脈衝僅有一次會到達處理器。不過,節省用電量稍低於線性。通常調節功能僅在無此頻率比例時使用,或是為了最大化省電效果時使用。此外,此技術必須使用特定程序來進行控制。系統介面是 /proc/acpi/processor/*/throttling

使處理器進入睡眠

作業系統會在沒事可做時使處理器進入睡眠。在此情況中,作業系統會傳送 halt 指令給 CPU。共有三種狀態:C1、C2 及 C3。在最節省的 C3 狀態中,連處理器快取與主記憶體間的同步化也會暫停。因此,僅能在沒有任何設備透過 Bus master 活動來修改主記憶體內容時可以套用此狀態。有些驅動程式會禁止使用 C3。目前的狀態會顯示在 /proc/acpi/processor/*/power 中。

頻率比例及調節只在處理器忙碌時使用,因為在處理器閒置時,一定會套用最節省的 C 狀態。如果 CPU 正忙碌,頻率比例是建議的省電方法。通常處理器僅有部份的工作負載。在此情況中,可以使用較低的頻率。通常,最佳方法是使用核心要求式調節器或精靈 (例如 powersaved) 來控制動態頻率比例。對電池的操作而言,靜態設定為較低頻率比較好,也可以用在您想降低電腦溫度或減低噪音時。

調節應做最後手段使用,例如,在高度系統負載下仍要延伸電池操作時間時。不過在調節過多時,有些系統無法運作順暢。此外,當 CPU 要做的事不多時,調節 CPU 是無意義的動作。

在 SUSE Linux 中,這些技術是由省電精靈所控制。組態的說明位於 節 33.5, "powersave 套件"

33.3.3. ACPI 工具

ACPI 公用程式包含僅顯示電池充電等級與溫度等資訊的工具 (acpi、klaptopdaemon 及 wmacpimon 等等。)、協助在 /proc/acpi 中存取架構或協助監控變更 (akpi、acpiw、gtkacpiw) 的工具,以及在 BIOS 中編輯 ACPI 表格的工具 (pmtools 套件)。

33.3.4. 疑難排解

共有兩種不同類型的問題。一方面是核心的 ACPI 程式碼包含無法及時偵測到的錯誤。在這種情況中,將會有可供下載的解決方案。不過通常問題是因 BIOS 而起。有時,會刻意在 BIOS 中整合與 ACPI 規格不符的技術,以避免在其他常見作業系統中的 ACPI 實作錯誤。會在黑名單中將那些在 ACPI 實行中有重大錯誤的硬體元件記錄下來,以避免 Linux 核心對這些元件使用 ACPI。

發生問題時要做的第一件事是更新 BIOS。如果電腦未能開機,下列中的某一個開機參數也許有幫助:

pci=noacpi

不使用 ACPI 來設定 PCI 設備。

acpi=oldboot

僅執行一個簡單的資源組態。不將 ACPI 用於其他目的。

acpi=off

關閉 ACPI。

[Warning]未使用 ACPI 的開機問題

有些較新的機器 (尤其是 SMP 系統及 AMD64 系統) 需透過 ACPI 以正確設定硬體。關閉這些機器的 ACPI 會發生隨之而來的問題。

開機後,可使用 dmesg| grep -2i acpi 指令來監控系統的開機訊息 (或所有訊息,因為也可能是 ACPI 以外的因素構成問題)。如果是在分析 ACPI 表格時發生問題,則最重要的 DSDT 表格,可用改良版本來替換。在此情況中,會忽略 BIOS 的錯誤 DSDT。程序在 節 33.5.4, "疑難排解" 中描述。

在核心組態中,有個啟動 ACPI 除錯訊息的切換。如果已編譯並安裝好一個具有 ACPI 除錯能力的核心,則專家將能取得詳細資訊支援,以便搜尋錯誤。

如果您曾遇到 BIOS 問題或硬體問題,建議您聯絡製造商。尤其是哪些一直未提供 Linux 支援的製造商,更應該出面解決這些問題。唯有讓製造商得知他們有不少使用 Linux 的客戶,他們才會嚴肅地處理這些問題。

33.3.4.1. 如需詳細資訊

ACPI 的其他文件和說明: