linux电源管理--休眠与待机

简介

Linux内核支持多种睡眠状态,例如:Freeze、mem和disk等。通过在用户空间向"/sys/power/state"分别写入freeze、disk、和mem等即可触发。

这里主要通过对两种睡眠状态:挂起到内存和挂起到硬盘来分析。

  1. 挂起到内存

    计算机将当前的运行状态放到内存中,关闭其他的硬盘等外设设备,进入等待状态。只需要为内存提供少量需要的电力维持数据存储。恢复时计算机从内存中读出数据,恢复到挂起之前的状态,恢复速度较快。

  2. 挂起到disk

    计算机将当前的运行状态放到disk的特定文件或特定区域中,RAM也可以被关掉,因此,此时的恢复时间相较挂起到内存需要更多的时间,需要先从disk中读回数据到RAM,然后再恢复计算机的状态。当计算机选择挂起到disk中后,可以关闭掉硬盘、外设等设备,并且计算机进入到完全关机状态,不耗电。

 

相关代码分布

内核中的suspend及resume过程主要有包含PM Core、Device PM以及Platform PM等几个部分,具体如下:

  • PM Core

    • kernel/power/user.c ---- 提供用户空间接口

    • kernel/power/suspend.c ---- suspend功能的主要逻辑

    • kernel/power/suspend.c ---- suspend功能的测试逻辑

    • kernel/power/console.c ---- suspend过程中对控制台的处理逻辑

    • kernel/power/process.c ---- suspend过程中对进程的处理逻辑

    • kernel/power/hibernate.c ---- suspend-to-disk 功能实现

    • kernel/power/swap.c ---- suspend-to-swap 功能实现

    • kernel/power/main.c ---- PM subsystem core functionality

  • Device PM

    • drivers/base/powe/* ---- 设备驱动相关电源管理处理逻辑,主要功能是:对下,定义Device PM相关的回调函数,让各个具体设备的驱动实现;对上,实现统一的PM操作函数,供PM核心逻辑调用

    • 相关的具体设备驱动

  • Platform PM

    • include/linux/suspend.h ---- 定义platform dependent PM有关的处理逻辑

    • 具体平台架构的电源管理操作

 

suspend与resume流程分析

接下来介绍suspend与resume的流程,并简单分析相关函数。

suspend流程

Linux suspend主要有以下三个步骤:

  1. 冻结用户态进程和内核态任务

  2. 调用设备注册的suspend回调函数,按照注册顺序执行

  3. 休眠核心设备和CPU

对linux suspend流程做一个分析,代码大致流程如下图所示:

 

 

resume流程

从待机状态恢复的流程从syscore_resume函数开始。这个函数唤醒系统的核心设备。

与恢复相关的函数还有:

  1. arch_suspend_enable_irqs  :  使能中断
  2. enable_nonboot_cpus  :  使能非启动CPU
  3. suspend_ops->wake  :  执行处理器的wake函数
  4. dpm_resume_start  :  唤醒外设
  5. dpm_resume_end  :  resume所有非系统设备,即执行所有注册设备的resume回调函数
  6. resume_console  :  resume console子系统,此时printk可用
  7. suspend_finish
    1. suspend_thaw_processes  :  解冻进程
    2. pm_notifier_call_chain  :  广播一个系统suspend结束的Notify,外设在收到通知时会做一些准备
    3. pm_resotre_console  :  恢复控制台

 

参考链接

  • https://blog.csdn.net/zirconsdu/article/details/9355657?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.channel_param
  • https://blog.csdn.net/qwaszx523/article/details/52651000
  • http://www.wowotech.net/linux_kenrel/suspend_and_resume.html
posted @ 2021-01-21 22:39  天涯霜雪  阅读(1333)  评论(0)    收藏  举报