背景

  • Read the fucking source code! --By 鲁迅
  • A picture is worth a thousand words. --By 高尔基

说明:

  1. Kernel版本:4.14
  2. ARM64处理器
  3. 使用工具:Source Insight 3.5, Visio

1. 介绍

Linux Kernel支持四种Sleep State

  • Suspend-to-Idle
    纯软件,轻量级的Suspend操作,它会freeze user spacesuspend the timekeepingput all I/O devices into low-power states
    处于S2Idle状态下时,设备中断就可以将其唤醒。

  • Standby
    除了实现Suspend-to-Idle时的操作外,还会将nonboot CPUs置于offline状态,以及suspend all low-level system functions。由于系统核心逻辑单元保持上电状态,操作的状态不会丢失,也会很容易恢复到之前的状态。
    处于Standby状态时,可能需要依赖平台来设置唤醒源。

  • Suspend-to-RAM
    STR/S2RAM时,除了Memory需要进行自刷新来保持数据外,其他的所有设备都需要进入到低功耗状态。除了实现Standby中的操作外,还有一些平台相关的操作要进行。比如,在STR的最后一步,将控制权交给Firmware,然后下电,等着唤醒时再重新Resume回来。由于存在掉电行为,因此Resume的时候需要重新进行配置。
    处于STR状态时,需要依赖平台设置唤醒源。
    本文主要分析的流程就是STR

  • Hibernation
    Suspend-to-Disk, STD,简而言之,这个操作会将运行时的context保存在Disk这种非易失的存储器中,然后进行掉电操作。当按下电源键进行唤醒时,Firmware/Uboot会将保存的context进行恢复。

上述四个状态,功耗节省效果依次增强,同时唤醒回来的时间开销也相应加大。

2. 流程

通过/sys接口可以触发Suspend流程:

  • cat /sys/power/state:查看支持的操作,比如:freeze, mem
  • echo mem > /sys/power/state:进行STR操作;
  • echo freeze > /sys/power/state:进行S2Idle操作;

代码路径:
kernel/power/main.c
kernel/power/suspend.c

STR流程如下图,入口函数为pm_suspend

简而言之,这是一张信息量很大的图片,涵盖了Suspend To Ram的整个流程。
图片中,从上到下涉及到进程的freeze,各种设备驱动的Suspend,平台的Suspend,CPU的Offline操作,syscore的Suspend操作。其中涉及到CPU的操作时,在ARMv8中,会通过PSCI接口调用到ARM Trusted Firmware, ATF,这个在【原创】Linux PSCI框架探讨过。
多说无益,看图吧。

3. process freeze

Suspend过程中,有一个函数suspend_freeze_processes引起了我的好奇心,我刻意分析了下。在Suspend的时候是需要将用户进程和内核线程freeze掉,避免它们来捣乱,比如你在Suspend某个驱动的时候,此时用户还在使用该驱动的资源,这时候可能就会引起问题了。不过,内核线程并不是所有的都能freeze掉。
记住两个知识点:

  • 用户线程的freeze是通过发送信号来触发执行的;
  • 内核线程的freeze是通过主动调用函数触发的;

具体还是看图吧:

进程的操作比较复杂,以后在研究进程管理的时候再分析。

【原创】Linux Suspend流程分析的更多相关文章

  1. 嵌入式Linux开发之uboot启动Linux整体流程分析

    嵌入式Linux开发之uboot启动Linux整体流程分析 Uboot全称Universal Boot Loader,一个遵循GPL协议的的开源项目,其作用是引导操作系统,支持引导linux.VxWo ...

  2. Linux系统启动流程分析

    作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...

  3. Linux中断流程分析

    裸机中断: 1.中断流入口 2.事先注册中断处理程序 3.根据中断源编号,调取处理程序 irq_svc:1.等到产生中断源的编号(每一个中断号都有一个描述结构) 2.

  4. Android中Linux suspend/resume流程

    Android中Linux suspend/resume流程首先我们从linux kernel 的suspend说起,不管你是使用echo mem > /sys/power/state 或者使用 ...

  5. 基于linux与busybox的reboot命令流程分析

    http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 ********************************** ...

  6. 【原创】Linux信号量机制分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  7. 【转】linux文件系统之mount流程分析

    本质上,Ext3 mount的过程实际上是inode被替代的过程. 例如,/dev/sdb块设备被mount到/mnt/alan目录.命令:mount -t ext3 /dev/sdb /mnt/al ...

  8. Linux文件系统之Mount流程分析

    转载:原文地址http://www.linuxeye.com/linuxrumen/1121.html 本质上,Ext3 mount的过程实际上是inode被替代的过程.例如,/dev/sdb块设备被 ...

  9. S3C6410 SPI全双工读写流程分析(原创)【转】

    转自:http://blog.csdn.net/hustyangju/article/details/21165721 原创博文,知识共享!转载请注明出处:http://blog.csdn.net/h ...

随机推荐

  1. python课堂整理6---字典

    一.字典  dict info = {"k1" : "v1", "k2" : "v2"} 以键值对形式组成字典 字典里的 ...

  2. EF Core懒人小技巧之拒绝DbSet

    前言 最近在项目中使用EF Core的频率越来越高,当项目比较大的时候,疯狂往DbContext中加各种DbSet,你会不会特难受?如果你是一键生成的大佬,那么请忽略本文.本文旨在不写 DbSet,那 ...

  3. 云计算:Linux运维核心管理命令详解

    云计算:Linux运维核心管理命令详解 想做好运维工作,人先要学会勤快: 居安而思危,勤记而补拙,方可不断提高: 别人资料不论你用着再如何爽那也是别人的: 自己总结东西是你自身特有的一种思想与理念的展 ...

  4. web设计_4_可扩展的行

    不要指定横向页面组件的高度,要让它们能够在纵向自由扩展. 常见的包含文章正文或大段文字的区域,应该适应任何篇幅和大小的文字. 但是例如文章标题.登陆信息栏等也要考虑文字内容数量及高度的变化. 例如:下 ...

  5. 考试安排查询脚本(CUP)

    去年热情高涨的时候心血来潮做了个简易的查询脚本,限于当时技术水平(菜),实现得不是很好,这几天终于想起来填坑了.环境依赖: brew install python3 pip3 install requ ...

  6. 【一些小常识】Linux文件目录的通配符用法/*

    在使用linux命令的时候,一时有点搞不清*的用法,于是整理记录下,在做jenkins 持续集成时还是很有用的 “*”在通配符中是最常用的一种,主要整理下在使用Linux命令时,文件夹目录的用法. 1 ...

  7. 90后iOS开发者的出路,如何规划30岁前的自己(程序员必修课)

    前言: 最近发生了一些和我们没有直接关系但是有间接关系的事情.比如华为“清洗”高龄基层员工,比如游戏公司2号员工拿不到股份而离职.先不说事实到底如何,起码很多码农是心有戚戚焉. 最近一年多也发生了一些 ...

  8. Windows上的Linux容器

    翻译自:https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-contai ...

  9. Netty学习(四)-TCP粘包和拆包

    我们都知道TCP是基于字节流的传输协议.那么数据在通信层传播其实就像河水一样并没有明显的分界线,而数据具体表示什么意思什么地方有句号什么地方有分号这个对于TCP底层来说并不清楚.应用层向TCP层发送用 ...

  10. java并发编程(十六)----(线程池)java线程池的使用

    上节我们简单介绍了线程池,这次我们就来使用一下.Executors提供四种线程池,分别是:newCachedThreadPool,newFixedThreadPool ,newScheduledThr ...