次の表は /sys/power/state (kernel 内対応関数 state_store()) に書き込む文字列と kernel の挙動です。PC (パソコン) で調査したのでアーキテクチャやプラット・ホームの機能で詳細な挙動に違いがあるかもしれません。関連ドキュメントは /Documentation/power/states.txt です。
書き込む文字列 (kernel 内定数) | プロセス稼働 | CPU稼働 | 主記憶内容 | 電力管理 | ACPI 相当 | 主要な dev_pm_ops call back[1] |
freeze (PM_SUSPEND_FREEZE) | 停止 | 継続 (idle 状態が長くなる) | 保持 | 周辺 IO デバイス 低消費電力化 | S0 | susped - (wake up) - resume |
standby (PM_SUSPEND_STANDBY) | 停止 | boot processor は最小限の内部状態を維持して停止[2]、それ以外の processor は内部状態を失って offline。復帰過程では boot processor が復帰後、その他の processor を online にしている | 保持 | 周辺 IO デバイス + CPU とその周辺 + 主記憶 低消費電力化 | S1 | susped - (wake up) - resume |
mem (PM_SUSPEND_MEM) | 停止 | boot processor は内部状態が待避されて停止[3]、それ以外の processor は内部状態を失って offline (全停止に至る過程で boot processor 以外を offline にしている。復帰過程も boot processor 復帰後、その他の processor を online にしている) | 保持 | 周辺 IO デバイス + CPU とその周辺 + 主記憶 低消費電力化 (standby よりも多くの復帰操作が必要な積極的な低消費電力化) | S3 | susped - (wake up) - resume |
disk (PM_SUSPEND_MAX) | 停止 | 内部状態を失って全停止 (全停止に至る過程で boot processor 以外を offline にして hibernation image 作成、online にして hibernation image を swap 領域へ書き出している) | swap 領域へ待避した後、喪失 | wakeup に必要な回路以外は電源 off | S4 | freeze - (hibernation image 作成) - thaw - (hibernation image 書き出し) - poweroff - (power_down) - (wake up) - restore |
[1] call back のうち prepare, complete, *_early, *_late, *_noirq, runtime_* は省略してあります。
[2] CPU に電源が供給されています。CPU 内部の詳細は公開されていないので推測するしか無いのですが、スタティック動作の回路は状態を維持します。ダイナミック動作の回路は状態を失い、PLL の様な clock 供給・分配系の回路は停止すると考えられます。
[3] 一般的に専用のハードウエアが processor の内部状態を待避復旧しています。このような専用のハードウエアは簡易なプロセッサとプログラムの組み合わせで構成されることもあります。
state ノードに "freeze" を書き込むと単に process が停止し device が suspend するのに対し、kernel 内の dev_pm_ops の freeze メンバ(call back pointer) は "disk" を書き込み hibernate (swap 領域にメモリ内容を書き出し電源 off) する時に呼ばれます。注意が必要です。
suspend - resume が上手くいかない場合
debugfs が /sys/kernel/debug に mount されているならば、# cat /sys/kernel/debug/suspend_stats (kernel 内対応関数 suspend_stats_show(), # cat /sys/kernel/debug/wakeup_sources (kernel 内対応関数 wakeup_sources_stats_show()) で suspend, resume, freeze 周辺の問題の要約を表示できます。/Documentation/power/basic-pm-debugging.txt にテストとデバッグの方法が書かれています。
dump_stack() を使って dev_pm_ops メンバが指している call back 関数が呼ばれるまでの call path を列挙します。i8253_ref ドライバを修正して取得しました。 platform_device 以外の device では途中から call path が変化します。
[85109.654592] Call Trace: [85109.654609] [<ffffffff817d2279>] dump_stack+0x63/0x81 [85109.654618] [<ffffffffc033d75d>] i8253_ref_suspend+0x4d/0x60 [i8253_ref] [85109.654627] [<ffffffff81474ade>] ? acpi_thermal_resume+0xfa/0xfa [85109.654634] [<ffffffff8150d829>] platform_pm_suspend+0x29/0x50 [85109.654641] [<ffffffff815187ae>] dpm_run_callback+0x4e/0x150 [85109.654647] [<ffffffff81519542>] __device_suspend+0x132/0x3b0 [85109.654651] [<ffffffff8151b27a>] dpm_suspend+0x13a/0x310 [85109.654654] [<ffffffff8151b967>] dpm_suspend_start+0x57/0x60 [85109.654660] [<ffffffff810c8c2f>] suspend_devices_and_enter+0x8f/0x780 [85109.654664] [<ffffffff810c9416>] pm_suspend+0xf6/0x3b0 [85109.654668] [<ffffffff810c7d69>] state_store+0x79/0xf0 [85109.654676] [<ffffffff813b33df>] kobj_attr_store+0xf/0x20 [85109.654681] [<ffffffff81275bfd>] sysfs_kf_write+0x3d/0x50 [85109.654687] [<ffffffff812750aa>] kernfs_fop_write+0x12a/0x180 [85109.654692] [<ffffffff811fa198>] __vfs_write+0x28/0xf0 [85109.654697] [<ffffffff811fcda9>] ? __sb_start_write+0x49/0xf0 [85109.654705] [<ffffffff81320373>] ? security_file_permission+0x23/0xa0 [85109.654709] [<ffffffff811fa889>] vfs_write+0xa9/0x1b0 [85109.654713] [<ffffffff811fb656>] SyS_write+0x46/0xb0 [85109.654719] [<ffffffff81218742>] ? __close_fd;+0x82/0xa0 [85109.654725] [<ffffffff817da0b2>] system_call_fastpath+0x16/0x75 [85109.654743] i8253_ref i8253_ref.0.auto: Suspended.
[85110.121742] Call Trace: [85110.121761] [<ffffffff817d2279>] dump_stack+0x63/0x81 [85110.121773] [<ffffffffc033d8cd>] i8253_ref_resume+0x4d/0x60 [i8253_ref] [85110.121781] [<ffffffff8150d87b>] platform_pm_resume+0x2b/0x50 [85110.121789] [<ffffffff815187ae>] dpm_run_callback+0x4e/0x150 [85110.121794] [<ffffffff81518d76>] device_resume+0xd6/0x200 [85110.121798] [<ffffffff8151a479>] dpm_resume+0x129/0x320 [85110.121801] [<ffffffff8151aa55>] dpm_resume_end+0x15/0x30 [85110.121808] [<ffffffff810c8cc7>] suspend_devices_and_enter+0x127/0x780 [85110.121812] [<ffffffff810c9416>] pm_suspend+0xf6/0x3b0 [85110.121816] [<ffffffff810c7d69>] state_store+0x79/0xf0 [85110.121827] [<ffffffff813b33df>] kobj_attr_store+0xf/0x20 [85110.121831] [<ffffffff81275bfd>] sysfs_kf_write+0x3d/0x50 [85110.121839] [<ffffffff812750aa>] kernfs_fop_write+0x12a/0x180 [85110.121845] [<ffffffff811fa198>] __vfs_write+0x28/0xf0 [85110.121850] [<ffffffff811fcda9>] ? __sb_start_write+0x49/0xf0 [85110.121860] [<ffffffff81320373>] ? security_file_permission+0x23/0xa0 [85110.121864] [<ffffffff811fa889>] vfs_write+0xa9/0x1b0 [85110.121868] [<ffffffff811fb656>] SyS_write+0x46/0xb0 [85110.121874] [<ffffffff81218742>] ? __close_fd+0x82/0xa0 [85110.121881] [<ffffffff817da0b2>] system_call_fastpath+0x16/0x75 [85110.121984] i8253_ref i8253_ref.0.auto: Resumed. counter=0x02f8