Linux – ACPI

ACPI (Advanced configuration and power interface) 的 Power States 狀態被定義成許多類別.除了系統的 Global states , ACPI 還支援了 CPU (Processor , Performance states) 與 device (Device states) 的電源管理.在 wiki 的 ACPI 中把 Power states 定義的很清楚 http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface

Sleep States (Global states)

Global states 從 G0 到 G3 – Go(S0) ,G1(S1 ,S2 ,S3 ,S4) ,G2(S5) ,G3 ,對應到 Linux ACPI 的 Sleep states (S1 ~ S4) 但 S0 = G0 , S5 = G2.
在 Linux 下 ACPI 的功能要在 kernel 2.6 版才支援下面是他的 state 所代表的意義

  • S1 – “Sleep”
    CPU保持供電,但不執行指令,當 CPU 停止運行時,其他相關裝置也一樣被關閉.
  • S2
    在規範定義該狀態是當前未在使用。
  • S3 – “Suspend to RAM”
    所有 CPU 供電被切斷,並且其暫存器的內容被刷新到RAM.
  • S4 – “Suspend to Disk”
    CPU的電源關閉如同 S3,但RAM的資料寫入到磁盤.稱為S4BIOS一種變型是最普遍的,S4 必須由 BIOS 來實現而不是透過作業系統.在以前 Linux 2.4.x 的核心 S4 不被支援.
  • S5 – “Soft Off”
    這個狀態下系統是關閉,但某一些設備還是保有部分電力(像是 LAN 或 USB 等設備),這些設備主要是在等待接收喚醒的事件,接受到會讓系統開機.

檢視系統核心是否有支援.

[root@localhost ~]# cat /boot/config-2.6.18-53.el5 | grep -i acpi_sleep
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_SLEEP_PROC_FS=y
# CONFIG_ACPI_SLEEP_PROC_SLEEP is not set

檢視系統有支援哪一些 state 要看 /sys/power/state

[root@localhost ~]# cat /sys/power/state
standby disk mem

可以看到你的系統有支援 standby(S1), mem(S3), disk(S4).可以用下面的方法來測試一下.

[root@localhost ~]# echo -n standby > /sys/power/state
[root@localhost ~]# echo -n mem > /sys/power/state
[root@localhost ~]# echo -n disk > /sys/power/state

如果動作正常你會看到系統依據不同的 state 有不同的 ACPI 狀態出現.

Processor Operating States (C-states)

不光是系統有 Power states ,Device 和 Processor 也有自己的 Power states.
CPU 在沒有使用時可以被停用或以比較低的效能模式來運行,依據不同的狀態可以區分成為幾種 C-state ,C-state 從 C0 (不閒置)開始,數字越高表示越省電(每一家的 CPU 定義 C-state 會稍微不同).
CPU 的 C-state 有下面幾種.

  1. C0 – Operating State
  2. C1 – Halt
  3. C1E – Enhanced Halt
  4. C2 – Stop Grant
  5. C2 – Stop Clock
  6. C2E – Extended Stop Grant
  7. C3 – Sleep
  8. C3 – Deep Sleep
  9. C3 – AltVID
  10. C4 – Deeper Sleep
  11. C4E/C5 -Enhanced Deeper Sleep
  12. C6 – Deep Power Down
  13. C7 – C6 + LLC may be flushed
  14. C8 – C7 + LLC must be flushed

要看 CPU 有支援哪一些 C-state 可以透過指令 cpupower,參數 idle-info 可以看到有支援的 C-State.

[root@localhost ~]# cpupower idle-info
CPUidle driver: none
CPUidle governor: menu
analyzing CPU 0:

CPU 0: No idle states

參數 monitor 可以檢視目前的 C-State 為哪一種.
POLL = C0

[root@localhost ~]# cpupower monitor -l
Monitor "SandyBridge" (3 states) - Might overflow after 922000000 s
C7	[C] -> Processor Core C7
PC2	[P] -> Processor Package C2
PC7	[P] -> Processor Package C7
[root@localhost ~]# cpupower monitor
              |SandyBridge         
PKG |CORE|CPU | C7   | PC2  | PC7  
   0|   0|   0|  0.00|  0.00|  0.00
   2|   0|   1|  0.00|  0.00|  0.00

MPERF increasing with maxium (P0) frequency in C0
APERF increasing with current/actual frequency in C0

Processor Performance States (P-states)

剛剛的 D0 (Devices) , C0(CPU) 定義為 operating state 也就是在運作階段,在這個階段中處理器還區分為不同的 Performance states 從 P0 ~ P16, P0 是效能最高的狀態.依序效能往下 Pn , Pn-1 …P16.

P-States 就是指 CPU 依據目前狀態自行調整工作頻率,用以省電.
透過指令 cpupower ,參數 frequency-info 可以得知目前這個 CPU 支援的工作頻率.

[root@localhost ~]# cpupower frequency-info
analyzing CPU 0:
  no or unknown cpufreq driver is active on this CPU
  CPUs which run at the same hardware frequency: Not Available
  CPUs which need to have their frequency coordinated by software: Not Available
  maximum transition latency:  Cannot determine or is not supported.
  hardware limits: Not Available
  available cpufreq governors: Not Available
  Unable to determine current policy
  current CPU frequency: Unable to call hardware
  current CPU frequency:  Unable to call to kernel
  boost state support:
    Supported: no
    Active: no

透過 turbostat – http://benjr.tw/99181 與 powertop – http://benjr.tw/99175 , 一樣可以觀察目前 CPU 狀態.

如果要設定 CPU 的工作頻率,可以透過指令 # cpupower frequency-set

Device states

Device states 從 D0 ~ D3 (D0 ,D1 ,D2).

Dump ACPI Table

我們在 Linux 下面可以透過一些方式把 ACPI 定義的表格抓出來,這相容 ACPI 表格,紀錄了作業系統和系統韌體之間的介面。

  • DSDT – Differentiated System Description Table
  • SSDT – Secondary System Description Table

測試環境為 CentOS7 x86_64 (虛擬機)
透過 # cat /sys/firmware/acpi/tables/DSDT > dsdt.aml 我們可以找到 DSDT (Differentiated System Description Table) 檔案,不過這不是給人看的,所以還要透過 # iasl -d dsdt.aml (iasl 由 acpica-tools 套件提供,大部分的系統預設皆沒該項工具.) 來做轉換.

[root@localhost ~]# cat /sys/firmware/acpi/tables/DSDT > dsdt.aml
[root@localhost ~]# iasl -d dsdt.aml

Intel ACPI Component Architecture
ASL+ Optimizing Compiler version 20160527-64
Copyright (c) 2000 - 2016 Intel Corporation

Input file dsdt.aml, Length 0x13331 (78641) bytes
ACPI: DSDT 0x0000000000000000 013331 (v01 PTLTD  Custom   06040000 MSFT 03000001)
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)

Parsing completed
Disassembly completed
ASL Output:    dsdt.dsl - 726215 bytes

或是直接使用 # acpidump ( acpidump 一樣由 acpica-tools 套件提供)來看.

[root@localhost ~]# acpidump
沒有解決問題,試試搜尋本站其他內容

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料