ACPIと電源・デバイス状態の抽象化
ノートPCの蓋を閉じて復帰する一連の動きを、ACPI の状態モデルから理解できます。S/C/D/G 状態の定義とサスペンド・ハイバネートの実装、ファームウェアと OS の責務分担を構造で押さえます。
- 1.ACPI はシステム全体(G/S)、CPU(C)、デバイス(D)の電源状態を別軸で定義し、OS が DSDT 内の AML メソッドを実行してハードウェアを直接触らずに遷移させる抽象層。
- 2.サスペンド(S3)は RAM へ給電したまま状態を保持し復帰が速い。ハイバネート(S4)はメモリ像をディスクへ書き出し全停止するため復帰は遅いが無給電で保持できる。
- 3.デバイス電源(D0〜D3)とシステム遷移は連動し、サスペンド前に各デバイスを D3 へ落とし、ウェイクイベントを出せるデバイスだけ電源を残す。責務はファームウェア(テーブル提供・物理制御)と OS(方針決定・順序付け)で分担される。
ACPI が解く問題:電源管理の方針と機構の分離
ノートPCの蓋を閉じると数秒でサスペンドし、開ければ即復帰する。この当たり前の挙動の裏には、ハードウェアの電源制御をOSが直接叩かずに済ませる抽象層が必要です。チップセットやレジスタの番地はマシンごとに違うため、もしOSが機種ごとの直接制御を持てば移植性が崩壊します。
ACPI(Advanced Configuration and Power Interface) はこの問題を、方針(policy)と機構(mechanism)の分離で解きます。いつ・何を省電力にするかの方針はOSが握り、このハードでどのレジスタをどう叩くかの機構はファームウェアがテーブルとして提供する。OSはテーブル内の手続きを実行するだけで、物理的な詳細を知らずに遷移できます。これは旧来の APM(電源制御をBIOSが丸ごと握る方式)とは逆の発想で、制御権をOS側に取り戻したのが ACPI の本質です。
ACPI の状態は直交する複数の軸で定義される点が要です。一つの数字ではなく、システム・CPU・デバイスをそれぞれ別の状態空間で表します。
| 状態クラス | 対象 | 代表値の意味 |
|---|---|---|
| G(Global) | システム全体の大分類 | G0=動作中 / G1=スリープ / G2=ソフトオフ / G3=機械的オフ |
| S(Sleep) | G1 を細分したスリープ深度 | S0=動作 / S1〜S4=徐々に深い省電力 / S5=ソフトオフ |
| C(CPU) | 動作中(S0)の CPU アイドル深度 | C0=実行中 / C1〜Cn=深いほど復帰遅延大・省電力 |
| D(Device) | 個々のデバイスの電源 | D0=全開 / D1・D2=中間 / D3=最小〜オフ |
S 状態:システムをどこまで眠らせるか
S 状態は G1(スリープ)の深さを表し、どこまで電源を切り、どこに状態を残すかで段階が分かれます。実務で意味を持つのは主に S3 と S4 です。
| 状態 | 通称 | RAM | CPU/デバイス | 復帰速度 | 状態の保存先 |
|---|---|---|---|---|---|
| S0 | 動作中 | 給電 | 動作 | — | そのまま |
| S3 | サスペンド(STR) | セルフリフレッシュで給電 | 電源断 | 速い(秒) | RAM上に保持 |
| S4 | ハイバネート(STD) | 電源断 | 電源断 | 遅い(数十秒) | ディスク上のイメージ |
| S5 | ソフトオフ | 電源断 | 電源断 | —(再起動扱い) | 保存しない |
S3(Suspend to RAM) は、RAM をセルフリフレッシュモードで給電し続け、CPU とほとんどのデバイスを止めます。メモリ内容がそのまま残るので、復帰はチップセットの初期化とデバイスの再開だけで済み、数秒で戻ります。代償として、待機中もわずかに電力を消費し、給電が切れれば状態は失われます。
S4(Suspend to Disk=ハイバネート) は、メモリ全体の内容を不揮発ストレージへ書き出してから完全に電源を切る方式です。OS は物理メモリのイメージ(ハイバネーションイメージ)をスワップ領域や専用ファイルへ保存し、電源を落とします。無給電で状態を保てる一方、復帰時はファームウェアが起動した後にイメージを読み戻す必要があり、書き出し・読み戻しの I/O 量に比例して遅くなります。メモリ像をストレージへ退避する考え方は /os/swap-mechanism-internals/ の匿名ページ退避と同根です。
近年のノートPCは S3 を廃し、S0ix(Modern Standby) を採る機種が増えています。これは S0(動作中)のまま、CPU を深い C 状態へ、デバイスを D3 へ落とし込み、ソフトウェア主導で「画面オフだが浅く眠る」状態を作ります。S3 のような明確なハード遷移を持たない代わり、ネットワーク維持やプッシュ通知の受信が可能です。半面、各デバイスが正しく低電力へ落ちないと S3 より消費電力が増える「眠らないスタンバイ」問題が起きやすく、設計と検証の難度は上がります。
C 状態:動作中の CPU をどこまで止めるか
C 状態は S0(システム動作中)における CPU 単体のアイドル深度で、S 状態とは別軸です。アイドルループに入った CPU を、どこまで眠らせるかを表します。
C0 実行中(命令を処理している)
C1 クロック停止(halt)。復帰は即時に近い
C2 追加でバスを止める等。やや復帰が遅い
C3+ キャッシュをフラッシュ・電圧を下げる。省電力大・復帰遅延大
深い C 状態ほど消費電力は下がりますが、復帰遅延(exit latency)が増えるトレードオフがあります。さらに C3 以深ではコアのローカルタイマ(LAPIC タイマ)が止まることがあり、カーネルは別のクロックソースへ切り替えてタイマを維持します。OS のアイドルガバナは、次のタイマ満了までの予測時間と各 C 状態の復帰遅延を突き合わせ、「この眠りで損をしないか」を見積もって深さを選びます。
C 状態は「アイドル時にどれだけ深く眠るか」、P 状態(Performance state) は「動作中の周波数・電圧の組(DVFS)」です。C は止め方、P は走らせ方を制御します。両者は独立で、たとえば C0(実行中)の中でも P 状態は高負荷時の最高周波数から省電力時の低周波数まで動きます。混同すると省電力設計の議論が噛み合わなくなります。
ファームウェアと OS の責務分担:AML というインタプリタ
ACPI の心臓部は、ファームウェアが提供するテーブル群です。OS は起動初期に RSDP(ルートポインタ)を手がかりに XSDT を辿り、そこから各テーブルへ到達します。中でも DSDT(Differentiated System Description Table) が重要で、デバイスの構成と電源制御の手続きが AML(ACPI Machine Language) というバイトコードで記述されています。テーブルの取得はブート初期の仕事で、その位置づけは /os/boot-chain-internals/ の流れの中にあります。
ここが ACPI の巧妙な点です。OS は AML を直接ハードへ流すのではなく、カーネル内の AML インタプリタ で実行します。たとえば「このデバイスを D3 に落とせ」という要求は、DSDT 内の _PS3 という制御メソッドを呼ぶことで実現され、その中身(どのレジスタにどの値を書くか)はファームウェア作者がマシンごとに書いています。OS はメソッド名という抽象だけを知り、機種固有の物理操作を知らずに済みます。
| 層 | 責務 | 具体例 |
|---|---|---|
| ファームウェア | テーブルと AML メソッドの提供、一部の物理制御 | DSDT に _PS0/_PS3 等を記述、S 遷移の最終ハード処理 |
| OS(ACPI サブシステム) | AML 実行、状態遷移の方針決定と順序付け | ガバナによる C 状態選択、サスペンド時のデバイス停止順 |
| デバイスドライバ | 自デバイスの状態保存・復元 | サスペンド時にレジスタ退避、復帰時に再初期化 |
電源管理に関わる代表的な制御メソッドを名前で押さえておくと、ログ解析が一気に楽になります。_PSx(デバイスを Dx へ)、_PRx(Dx で必要な電源リソース)、_Sx(システム S 状態への対応値)、_PRW(ウェイク可能な電源と GPE)、_PSW(ウェイクの有効/無効)などが、ACPI ダンプに現れます。
デバイス電源(D 状態)とシステム遷移の連動
サスペンドは「システムをいきなり止める」のではなく、各デバイスを順序立てて D 状態へ落としてからシステム S 状態へ移る、という入れ子の手続きです。ここでデバイス電源管理とシステム電源管理が噛み合います。
D 状態は D0(全開)から D3(最小)までで、D3 はさらに D3hot(デバイスへの主電源は残るが内部は停止、レジスタアクセス可)と D3cold(電源リソースを切り、レジスタにも触れない)に分かれます。デバイスを深い D 状態へ落とすほど省電力ですが、復帰時の再初期化コストが増えます。各デバイスがどの S 状態でどの D 状態を取れるか、どのデバイスがウェイクを起こせるかは、前述の _Sx・_PRW メソッドが規定します。
サスペンドの流れは概ね次のように進みます。
[サスペンド into S3]
1. ユーザー空間を凍結(freeze)し、I/O を静める
2. 各ドライバの suspend コールバックを依存順に呼ぶ
→ デバイス状態をレジスタ等へ退避
→ ウェイク非対応デバイスは D3 へ、対応デバイスは
ウェイク可能な電源だけ残す
3. 非ブート CPU をオフラインにし、割り込みを止める
4. ファームウェア(AML の _Sx 処理)へ制御を渡し、
チップセットがハードを S3 へ落とす
[復帰]
5. ファームウェアがチップセットを再初期化し、OS の復帰点へ
6. CPU/割り込みを戻し、ドライバの resume を逆順に呼ぶ
→ 退避した状態を書き戻し、デバイスを D0 へ
7. ユーザー空間を解凍
復帰のきっかけとなるウェイクイベントは、ACPI の GPE(General Purpose Event) や PME(PCIe の Power Management Event)として上がり、割り込みとしてカーネルに届いて復帰処理を起動します。「どのデバイスがどの条件で起こせるか」を _PRW が、起こす能力の有効化を _PSW が制御します。蓋スイッチや電源ボタン、Wake-on-LAN がこの仕組みで効きます。割り込みとして受ける側の機序は /os/interrupt-top-bottom-half/ と地続きで、各ドライバの suspend/resume コールバックの呼び出しは /os/device-driver-model/ のドライバモデルが順序付けます。
デバイスは依存順で止め、逆順で起こす必要があります。親バス(例:PCIe ルート)を子デバイスより先に切ると、子の状態退避に必要なバスアクセスが失われて復帰に失敗します。また、ウェイクを起こすデバイスへ誤って電源を切ると蓋を開けても復帰しない、逆にウェイク不要なデバイスの電源を残すと S3 でも消費電力が落ちない、という不具合が典型的です。サスペンドが不安定なときは、まず suspend/resume コールバックの順序と _PRW の設定を疑うのが定石です。
「S3 と S4 の違い」は定番です。S3=RAM 給電で状態保持・復帰速い、S4=メモリ像をディスクへ書き出し無給電・復帰遅い、と即答できるように。「C 状態と P 状態の違い」(C=アイドルの止め方、P=動作中の周波数/電圧)、「ACPI と APM の違い」(電源制御権が OS 側か BIOS 側か)、「AML の役割」(機種固有の物理制御を抽象化するバイトコードを OS が解釈実行する)も頻出。D3hot と D3cold の差(主電源とレジスタアクセスの有無)まで言えると上級です。
まとめ
- ACPI は電源管理の方針(OS)と機構(ファームウェアのテーブル+AML)を分離し、OS がハードを直接触らずに遷移できる抽象層を提供する。APM と違い制御権は OS 側にある。
- 状態は直交する複数軸で定義される。G=システム大分類、S=スリープ深度、C=動作中 CPU のアイドル深度、D=個々のデバイス電源。
- S3 は RAM 給電で状態を保持し復帰が速い、S4 はメモリ像をディスクへ書き出し無給電で保持するが復帰が遅い。近年は S0ix(モダンスタンバイ)も普及。
- サスペンドは各デバイスを依存順で D 状態へ落としてからシステム S 状態へ移る入れ子の手続き。ウェイク可能デバイスだけ電源を残し、GPE/PME で復帰する。
- 責務は、ファームウェア(テーブルと AML メソッドの提供)、OS(AML 実行・順序付け・方針)、ドライバ(自デバイスの退避と復元)に分かれる。
OS Article
ACPIと電源・デバイス状態の抽象化を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ACPI
比較で見る軸
難易度: advanced / カテゴリ: OS / タグ数: 6
導入後に効く点
サスペンド(S3)は RAM へ給電したまま状態を保持し復帰が速い。ハイバネート(S4)はメモリ像をディスクへ書き出し全停止するため復帰は遅いが無給電で保持できる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- OS
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ACPI / 電源管理」に近いか確認する。
- 強みである「ACPI はシステム全体(G/S)、CPU(C)、デバイス(D)の電源状態を別軸で定義し、OS が DSDT 内の AML メソッドを実行してハードウェアを直接触らずに遷移させる抽象層。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。