【原创】Linux Suspend流程分析
背景
Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基
说明:
- Kernel版本:4.14
- ARM64处理器
- 使用工具:Source Insight 3.5, Visio
1. 介绍
Linux Kernel支持四种Sleep State
:
Suspend-to-Idle
纯软件,轻量级的Suspend操作,它会freeze user space
,suspend the timekeeping
,put 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流程分析的更多相关文章
- 嵌入式Linux开发之uboot启动Linux整体流程分析
嵌入式Linux开发之uboot启动Linux整体流程分析 Uboot全称Universal Boot Loader,一个遵循GPL协议的的开源项目,其作用是引导操作系统,支持引导linux.VxWo ...
- Linux系统启动流程分析
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells Github:https://github.co ...
- Linux中断流程分析
裸机中断: 1.中断流入口 2.事先注册中断处理程序 3.根据中断源编号,调取处理程序 irq_svc:1.等到产生中断源的编号(每一个中断号都有一个描述结构) 2.
- Android中Linux suspend/resume流程
Android中Linux suspend/resume流程首先我们从linux kernel 的suspend说起,不管你是使用echo mem > /sys/power/state 或者使用 ...
- 基于linux与busybox的reboot命令流程分析
http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 ********************************** ...
- 【原创】Linux信号量机制分析
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- 【转】linux文件系统之mount流程分析
本质上,Ext3 mount的过程实际上是inode被替代的过程. 例如,/dev/sdb块设备被mount到/mnt/alan目录.命令:mount -t ext3 /dev/sdb /mnt/al ...
- Linux文件系统之Mount流程分析
转载:原文地址http://www.linuxeye.com/linuxrumen/1121.html 本质上,Ext3 mount的过程实际上是inode被替代的过程.例如,/dev/sdb块设备被 ...
- S3C6410 SPI全双工读写流程分析(原创)【转】
转自:http://blog.csdn.net/hustyangju/article/details/21165721 原创博文,知识共享!转载请注明出处:http://blog.csdn.net/h ...
随机推荐
- IIS短文件名漏洞复现
IIS短文件名漏洞复现 一.漏洞描述 此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的.它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问). ...
- Java基础之方法
方法 某段代码经常使用,可以使用大括号将这段代码包括起来,起个名字,以后就使用这个名字来代替这段代码. 定义格式: 修饰符 返回值类型 方法名(参数列表) { 方法体语句: return语句: } ...
- shiro解析ini文件
来吧,看看shiro是怎么解析ini文件的,这里假设ini文件在classpath下,名字叫做shiro.ini Factory<org.apache.shiro.mgt.SecurityMan ...
- centos7更新yum库为aliyun库
1. 备份原来的yum源$sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.设置ali ...
- Vue项目的创建和UI资源
Vue项目创建打包与UI资源 1.Vue项目创建 1.1 vue-cli脚手架 vue-cli是一个基于vue的构建工具,用于搭建vue项目的环境,有着兼容,方便,快速的优点,能够完全遵循前后端分离的 ...
- 前端笔记之React(五)Redux深入浅出
一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...
- Flask+APScheduler定时任务
1.安装依赖 pip install flask_apscheduler 2.使用定时任务 ```python from flask import Flask from flask_apschedul ...
- Keil5调试过程中遇到的一些警告和错误
最近用keil5调试代码出了一些警告与错误,整理如下: 1.warning: #1295-D: Deprecated declaration run_c - give arg types void r ...
- java并发编程(十二)----(JUC原子类)数组类型介绍
上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型: AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray.其中前两个的使用方 ...
- echarts legend 限制规定显示个数,显示省略号,修改默认样式
类似百度统计,有的时候legend的个数比较多,但是前端需要控制初始化显示的个数,以及最多显示的条数,先看效果图: 先给代码: <!DOCTYPE html> <html lang= ...