Linux电源管理框架详解:从休眠唤醒到Runtime PM
导读:电源管理是嵌入式设备的核心能力,直接影响续航和发热。本文系统梳理Linux电源管理框架,从Suspend/Resume到Runtime PM再到Power Domain,全篇干货。
一、顶级架构一句话总结
系统休眠(Suspend) + 运行时电源管理(Runtime PM) + 系统关机(Shutdown)
💡 提示:电源管理做得好,设备续航提升50%不是梦!
二、三分钟搞懂电源管理全景图
电源管理层次
| 用户空间 | PM核心层 | 设备驱动 | 平台驱动 |
|---|---|---|---|
| /sys/power/state | kernel/power/ | suspend/resume | platform_pm_ops |
| power_supply | 系统级PM | runtime_pm | genpd |
↓ 最终到达 ↓
硬件层:CPU休眠、时钟门控、电源域
系统睡眠状态
| 状态 | 说明 | 功耗 | 唤醒时间 |
|---|---|---|---|
| S0 | 正常运行 | 高 | - |
| S1 | 待机(Power On Suspend) | 中 | 快 |
| S3 | 睡眠(Suspend to RAM) | 低 | 中 |
| S4 | 休眠(Suspend to Disk) | 极低 | 慢 |
| S5 | 软关机 | 极低 | 需重启 |
三、Suspend/Resume 休眠唤醒全流程
Suspend/Resume 时序流程
| 步骤 | 操作 |
|---|---|
| 1. 用户触发 | echo mem > /sys/power/state |
| ↓ | |
| 2. 冻结进程 | freeze_processes() |
| ↓ | |
| 3. 设备Suspend | prepare → suspend → suspend_late → suspend_noirq |
| ↓ | |
| 4. 平台Suspend | 关闭CPU、进入低功耗状态 |
| ↓ | |
| 💤 休眠完成 | 系统进入低功耗,等待唤醒源 |
⚠️ 注意:callback函数执行顺序不可颠倒,否则会导致设备休眠异常。
dev_pm_ops 结构体定义
struct dev_pm_ops { int (*prepare)(struct device *dev); void (*complete)(struct device *dev); int (*suspend)(struct device *dev); int (*resume)(struct device *dev); int (*freeze)(struct device *dev); int (*thaw)(struct device *dev); int (*poweroff)(struct device *dev); int (*restore)(struct device *dev); int (*suspend_late)(struct device *dev); int (*resume_early)(struct device *dev); int (*suspend_noirq)(struct device *dev); int (*resume_noirq)(struct device *dev); int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); };