Linux的Suspend流程代码
kernel/power/suspend.c
enter_state()
|--sys_sync();
|--suspend_prepare();//准备进入suspend,冻结进程
|--pm_prepare_console(); //准备虚拟终端
|--pm_notifier_call_chain(PM_SUSPEND_PREPARE);//广播系统要进入SUSPEND模式
|--usermodehelper_disable();//关闭用户态helper
|--suspend_freeze_processes();//冻结进程
|--pm_restrict_gfp_mask();
|--suspend_devices_and_enter(state);//使外设进入SUSPEND状态
|--suspend_ops->begin(state);//平台中注册的suspend_pos,一般在arch/arm/plat***/下,比如我的在arch/arm/plat-samsung/pm.c中定义suspend_pos结构
|--suspend_console();
|--suspend_test_start()
|--dpm_suspend_start(PMSG_SUSPEND);
|--dpm_prepare(state);//遍历dpm_list把上面的设备电源管理入口都移动到dpm_prepared_list链表上
|--dpm_suspend(state);//遍历dpm_prepared_list链表,放到dpm_suspended_list链表上面
|--suspend_enter(state);//进入state模式
|--suspend_ops->prepare();//同样实在平台注册的
|--dpm_suspend_noirq(PMSG_SUSPEND);
|--suspend_ops->prepare_late();
|--disable_nonboot_cpus();//一次性关闭所有非引导的CPU,只留下一个
|--arch_suspend_disable_irqs();
|--syscore_suspend();
|--suspend_ops->enter(state);
//执行到这个函数,我们就进入到SUSPEND模式,就像时间静止了一样。而唤醒的时候,一切又从这里继续,知道恢复如初。
|--syscore_resume();//上面有suspend,这就就要有resume
|--arch_suspend_enable_irqs();
|--enable_nonboot_cpus();//重新使能那些关闭的CPU
|--suspend_ops->wake()
|--dpm_resume_noirq(PMSG_RESUME);
|--suspend_ops->finish();//这里结束后,又返回到suspend_enter()函数中
|--suspend_test_start();
|--dpm_resume_end(PMSG_RESUME);
|--resume_console();
|--suspend_ops->end();
|--pm_restore_gfp_mask();
|--suspend_finish();