android 休眠唤醒机制分析(3) — suspend

android 休眠唤醒机制分析(三) — suspend前面我们分析了休眠的第一个阶段即浅度休眠,现在我们继续看休眠的

android 休眠唤醒机制分析(三) — suspend

前面我们分析了休眠的第一个阶段即浅度休眠,现在我们继续看休眠的第二个阶段 — 深度休眠。在深度休眠的过程中系统会首先冻结所有可以冻结的进程,然后依次挂起所有设备的电源,挂起顺序与设备注册的顺序相反,这样保证了设备之间电源的依赖性;直至最后进入省电模式,等待用户或者RTC唤醒;在唤醒过程中则会按照设备注册的顺序依次恢复每个设备的电源进入正常工作状态,解冻相关的进程,然后再进行浅度休眠的唤醒流程。

1、深度休眠入口

根据wake_lock一节的分析我们知道driver层进入深度休眠的入口有4个,分别为expire_timer、wake_lock、wake_lock_timeout、wake_unlock,这几个入口函数将根据相应的条件启动suspend_work里面的pm_suspend()函数进入深度休眠流程,代码在linux/kernel/power/suspend.c中:

// 设备注销时都会调用的函数,将设备从dpm_list链表中移除void device_pm_remove(struct device *dev){pr_debug("PM: Removing info for %s:%s\n", dev->bus ? dev->bus->name : "No Bus", kobject_name(&dev->kobj));mutex_lock(&dpm_list_mtx);list_del_init(&dev->power.entry);mutex_unlock(&dpm_list_mtx);pm_runtime_remove(dev);}