このページの目次

休止とウェイクアップ

概要: suspend-to-RAM (S3) → suspend-to-disk (S4/hibernate) → freeze (suspend-to-idle) → runtime PM → ACPI S-states → ドライバPMコールバック → デバッグ カーネルバージョン: 2.6 ~ 6.x

システムの休止状態

suspend-to-idle (freeze / s2idle):
  ユーザープロセスのフリーズ + デバイスの低電力状態移行 + CPU idle
  → 消費電力: 中程度, ウェイクアップ: 最速 (~100ms)
  → 依存: すべてのデバイスとCPUが優れたruntime PMをサポートしていること

suspend-to-RAM (S3 / deep):
  RAMの自己刷新, CPUと大部分のデバイスの電源オフ
  → 消費電力: 低い (~1W), ウェイクアップ: ~1-2秒
  → BIOS/UEFI ACPI S3 サポートが必要

suspend-to-disk (S4 / hibernate):
  全RAM内容をスワップまたはファイルに書き出し, 全機電源オフ
  → 消費電力: 0W, ウェイクアップ: ~10-30秒 (RAM容量とディスク速度による)
  → カーネルリジューム: スワップイメージをRAMに読み込み → 実行を再開

Suspend-to-RAM の詳細フロー

Suspend-to-RAM (S3):サスペンド 4 手順 → S3 睡眠 → ウェイクアップ 4 手順 echo mem > /sys/power/state · kernel/power/suspend.c · pm_suspend() ① ユーザープロセスのフリーズ freeze_processes() ② デバイスのサスペンド dpm_suspend() ③ 非ブートCPUの無効化 disable_nonboot_cpus() ④ syscore + S3移行 acpi_suspend_enter() この時点でシステムは S3 状態 —— RAMは自己刷新、CPU/デバイスは電源オフ、ウェイクアップソースを待機中 ウェイクアップトリガー: RTCアラーム / ライドカバー開 / キー入力 ⑤ CPUリセット起動 →BIOS→resume path ⑥ CPU+デバイスのリジューム 逆順リジューム ⑦ ユーザープロセスのアンフリーズ ⑧ ユーザー空間に戻る echo mem の次の行から継続 全 8 手順はカーネル空間で完了します。ユーザープロセスは①のフリーズから⑦のアンフリーズまで、その間いかなるロックも保持できません。 S3 中は RAM が自己刷新され、CPU/デバイスの電源がオフになり、消費電力は約 1W に低下します。ウェイクアップには約 1–2 秒かかり、BIOS/UEFI の ACPI S3 サポートに依存します。

Hibernate (Suspend-to-Disk)

Suspend-to-Disk (S4/Hibernate):ディスクへの書き出し → 電源オフ → コールドブートで読み込み echo disk > /sys/power/state · kernel/power/hibernate.c · hibernate() ① プロセスとデバイスのフリーズ ② メモリスナップショットの作成 物理ページを走査 → スワップに書き出し ③ メタデータの書き出し ページマッピング, カーネル状態 ④ デバイスの再サスペンド → シャットダウン power off システムはシャットダウン済み (power off) —— 次回起動時に resume= カーネルパラメータによって読み込みがトリガーされるのを待機中 コールドブートでディスクから読み込み、resume path に入る ⑤ resume=/dev/sda2 カーネルパラメータ ⑥ swsusp_check() シグネチャの読み込み ⑦ swsusp_read() スナップショット → RAM ⑧ カーネル状態のリジューム 保存された実行ポイントへジャンプ 全RAM内容がスワップに書き出された後、システム全体の電源がオフになり、消費電力は 0W に低下します。使用中のページのみが書き出され、アイドルページやページキャッシュはスキップされます。 次回起動時は resume= カーネルパラメータによって読み込みがトリガーされ、ウェイクアップには約 10–30 秒かかり、RAM容量とディスク速度に依存します。

Runtime PM: デバイスレベルの電源管理

// drivers/base/power/runtime.c
// 各デバイスは独立してサスペンド/リジューム可能 (他のデバイスやプロセスに影響を与えない)

// 自動サスペンドの条件:
//   - デバイスがアイドル状態で autosuspend_delay_ms を超過
//   - リファレンスがない (pm_runtime_get/put)
//   - ドライバが runtime_suspend/runtime_resume をサポート

// PCIe: runtime D3hot (電源オフだが PCIe リンクは維持)
// USB: 選択的サスペンド (個々のUSBデバイスをサスペンド)

デバッグ

# サポートされている休止状態
cat /sys/power/state          # freeze mem disk

# サスペンド/ウェイクアップのトレース
echo 1 > /sys/power/pm_trace  # RTCハッシュを使用して障害デバイスをトレース
dmesg | grep -i "PM: suspend" # サスペンド/ウェイクアップのログ

# サスペンドをブロックしているデバインの特定
cat /sys/power/pm_wakeup_irq  # 最後のウェイクアップIRQ
dmesg | grep -i "wakeup"      # ウェイクアップソース

# サスペンド/ウェイクアップのレイテンシ分析
echo 1 > /sys/kernel/debug/tracing/events/power/suspend_resume/enable
cat trace_pipe

参考

  • ソースコード⁠: kernel/power/suspend.c, kernel/power/hibernate.c, drivers/base/power/, drivers/acpi/sleep.c
  • カーネルドキュメント⁠: Documentation/admin-guide/pm/sleep-states.rst, Documentation/power/runtime_pm.rst

キーワード: suspend, hibernate, freeze, s2idle, S3, S4, runtime PM, pm_wakeup, ACPI