现在的位置: 首页 > 综合 > 正文

[PowerManagement]Linux的Suspend流程

2018年02月11日 ⁄ 综合 ⁄ 共 1664字 ⁄ 字号 评论关闭

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();

抱歉!评论已关闭.