Android中Linux睡眠唤醒流程

linux休眠唤醒流程 按键导致uboot运行,会继续运行suspend_enter函数(kernel-4.19\kernel\power\suspend.c)中syscore_resume函数,依次调用arch_suspend_enable_irqs,platform_resume_noirq,dpm_resume_noirq,platform_resume_early,dpm_resume_early,platform_resume_finish,唤醒的过程是休眠的反向的。 阅读详情
-----------------------------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://blog.youkuaiyun.com/android_huber
交流邮箱:dp.shao@gmail.com
-----------------------------------------------------------------------


        上层 echo on > /sys/power/state 或者 echo mem > /sys/power/state对系统的电源管理进行控制,首先看echo mem > /sys/power/state会进入reauest_suspend_state(state)然后如果是on的话进入late_resume_work(在执行late_resume_work之前会向系统申请main_wake_lock),如果是mem进入early_suspend_work。下面分析early_suspend_work,这个工作队列的执行函数是early_suspend(),在这个函数里会遍历early_suspend_handlers,依次执行里面的early_suspend函数,执行完所有的early_suspend后,释放main_wake_lock,进入wake_unlock函数。对于一个lock进入wake_unlock,首先会将lock从原链表中删除(active_wake_locks),然后加入inactive_locks链表中。对于释放锁,上面两个过程就结束了,但是如果这个锁的类型是WAKE_LOCK_SUSPEND,那么还需要执行一些操作,判断是否可以进入睡眠。首先调has_wake_lock_locked(type)去查找是否还有这种类型的锁,会遍历active_wake_locks[type]链表,如果在这个链表中一检测中有锁,而且该锁不是超时锁,那么就返回-1。如果是超时锁,且已经超时了,那就去释放这个锁,如果没超时就得到一个max_timeout,然后返回max_timeout。接着就会回到wake_unlock函数中,调用mod_timer(&expire_timer,jiffies +has_lock);hsa_lock就是前面返回的max_timeout,这句话的意思就是向系统中再添加定时器,定时时间就是最大的超时时间.expire_timer的操作函数是expire_wake_locks,这里会去检测还有没有锁,没有的话就进入suspend_work,执行suspend,进入睡眠流程。上面wake_unlock中如果没有检测到锁,也会执行suspend。在suspend函数中又会通过has_wake_lock去检测有没有锁,有锁就直接返回。
        suspend函数中,通过pm_suspend(requested_suspend_state)进入suspend操作。这个里面也有唤醒操作,只有等唤醒后才会跳出pm_suspend,跳出后会打印log:suspend:exit suspend, ret =pm_suspend就是判断传入的state是否符合suspend,符合就调用enter_state(state),到现在开始才进入了linux标准的suspend流程。
        enter_state这个函数主要有三个函数调用,分别是suspend_prepare,suspend_devices_and_enter,
suspend_finish。suspend_prepare做一些睡眠的准备工作suspend_devices_and_enter就是真正的设备进入睡眠
suspend_finish唤醒后进行的操作。
        下面来一个一个分析:
        suspend_prepare中首先通过pm_prepare_console,给suspend分配一个虚拟终端来输出信息;接着通过pm_notifier_call_chain来广播一个系统进入suspend的通报;关闭用户态的helper进程;最后通过suspend_freeze_processes来冻结用户态进程,最后会尝试释放一些内存。在suspend_freeze_processes()函数中调用了freeze_processes()函数,而freeze_processes()函数中又调用了try_to_freeze_tasks()来完成冻结任务。在冻结过程中,会判断当前进程是否有wake_lock,若有,则冻结失败,函数会放弃冻结。执行完上面的操作后再次回到enter_state函数中,下面开始调用suspend_devices_and_enter()函数让外设进入休眠。在suspend_devices_and_enter()中首先调用关于平台的suspend_ops->begin,接着通过suspend_console来关闭console,也可以通过改变一个flag来使这个函数无效。接着调用dpm_suspend_start。dpm_suspend_start中会执行device_prepare和device_suspend,这两个函数都是调用pm接口里的prepare和suspend函数(其实这里就开始通过总线的接口来执行驱动的suspend函数了,通过bus->pm->suspend)。接着回到suspend_devices_and_enter中调用suspend_enter(state);在suspend_enter中,首先调用平台相关的suspend_ops->prepare,接着执行dpm_suspend_noirq()调用pm接口里的
pm->suspend_noirq,回到suspend_enter,接着调用suspend_ops->prepare_late,接下来多cpu中非启动的cpu通过函数disable_nonboot_cpus()被关闭,然后通过调用arch_suspend_disable_irqs()关闭本地中断。再后来才到睡眠设备的操作,sysdev_suspend(PMSG_SUSPEND),这样就会进入sysdev_driver.suspend阶段。最后调用suspend_ops->enter(),这里就开始执行到睡眠的最后一步了,执行平台相关的睡眠。在平台睡眠的代码中主要是通过suspend_in_iram(suspend_param1)来执行一段汇编代码,最终在汇编中睡死。唤醒的步骤与睡眠的步骤相反,cpu有电后会首先从汇编中起来,接着回到suspend_enter函数中,执行suspend_ops->enter()返回后的一些唤醒代码,这边就不再去说了,基本是按照上面的逆序来操作的。


唤醒
        唤醒的时候,程序从suspend_devices_and_enter函数中出来后,开始执行suspend_finish,接着就会从enter_state中退出来,返回pm_suspend,然后又从pm_suspend返回到wakelock.c中的suspend(),在这里接下来就会打印出”suspend:exit suspend, ret“这些log。

下面是我画的一张睡眠唤醒的流程图,唤醒部分走的是虚线部分。 要是图看不全的话可以保存在本地方便放大了看喔。



需要清晰大图的请至下面网址下载

http://download.youkuaiyun.com/detail/android_huber/8537239

电源管理休眠流程梳理 1.Linux 描述的电源状态 On(on) S0 - Working Standby (standby) S1 - CPU and RAM are powered but not executed Suspend to RAM(mem) S3 - RAM is powered and the runn 阅读详情

相关推荐

suspend/resume流程

Linux的suspend机制是一种节能技术,用于将计算机的当前状态保存起来,然后进入休眠状态,以节省能源。在休眠状态下,计算机的硬件设备会停止工作,而保存的计算机状态被保存在内存或磁盘中。在用户空间向“/sys/power/state”文件分别写入“freeze”、“standby”和“mem”,即可触发它们。

weixin_44740132的博客 2471

Linux之4种休眠模式(三)

1.Linux 4中休眠模式 # echo standby >/sys/power/state //CPU和RAM在运行 # echo mem > /sys/power/state //挂起到内存(待机),关闭硬 盘、外设等设备 # echo disk > /sys/power/state //挂起到硬盘(休眠),关闭硬盘、外设等设备,进入关机状态。此时计算机 完全关闭,不耗...

Android系统攻城狮 1万+

F280049C_HRPWM_死区时间高精度控制与MEP技术实战解析

本文深入解析了F280049C的HRPWM模块及其基于MEP技术的死区时间高精度控制。通过实测数据与TI官方代码对比,详细阐述了DBREDHR和DBFEDHR寄存器的配置技巧、精度优化方法及常见问题调试,为电源管理和电机控制应用提供了实用的实战指南。

yolo5detector的博客 217

linux下休眠/待机命令

<br />if you<br /> # cat /sys/power/state<br /> mem disk<br /> you can<br /> echo “mem” > /sys/power/state 这相当于待机<br /> echo “disk” > /sys/power/state 这相当于休眠<br />from http://linux.chinaunix.net/bbs/viewthread.php?tid=1057578<br />命令行中执行如下:<br />[root

8万+

ADS仿真功率放大器实例学习笔记

ADS仿真功率放大器实例学习笔记

qq_36521926的博客 1万+

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

Robot_PLC_HMI_Automation 8607

linux 睡眠 唤醒 性能 几秒,Android/linux(earlysuspend、lateresume)睡眠唤醒机制简介

背景介绍:睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以是嵌入式设备尽可能的进入休眠状态,来延长电池的续航时间(这在移动终端消费类电子设备中是非常重要和有意义的!!)。但标准的Linux睡眠唤醒机制有其自身的一些缺陷(所有模块必须同时睡下或者唤醒),在某些情况下,这会导致能耗的白白浪费。因此Android在标准Linux睡眠唤醒的机制上作了新的改动(wake_lock唤...

weixin_29911569的博客 452

OSCP-Challenge 2 - Relia

使用andrea:PasswordPassword_6登录远程桌面,在c盘根目录下发现一个计划任务的ps,文件,修改执行的exe位木马,获取到milana用户的反弹shell。,发现开放了一个8000端口,但是我们外部是访问不到的,它对应的页面是/var/www/internal/,这个目录下的文件我们是可以访问的,把这个文件打个包放到本地分析下。其中数据的可以直接连接mssql,但是端口是49965,不过在数据库中没发现什么可用的信息,但是可以修改密码直接进后台,这个可以先放放。

羽的博客 7763

android 真待机流程分析

来源处 http://blog.sina.com.cn/s/blog_759dc36b0100stax.html   背景介绍: 睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以是嵌入式设备尽可能的进入休眠状态,来延长电池的续航时间(这在移动终端消费类电子设备中是非常重要和有意义的!!)。但标准的Linux睡眠唤醒机制有其自身的一些缺陷(所有模块必须同时睡下或者唤醒)

yipie的专栏 1万+

建行报专版报道建设银行金融科技发展历程

经过十多年的建设,总行前中后台部门都有了自己的业务系统,但系统“部门”特征显著,渠道、客户、产品的横向整合不足,产品系统层次化、结构化、参数化程度不高,渠道支持产品快速部署以及跨渠道服务能力不足,管理分析类系统建设相对滞后,系统较弱的可扩展能力在应对高速增长的交易量时已疲态尽显,同时安全稳定运行的压力和风险日益积聚。站在新的历史起点上,科技条线将聚焦主责主业,完善信息科技管理体系,紧紧围绕安全生产中心任务,持续推动技术能力复用共享和自主可控,为全行做好金融五篇大文章,推动业务高质量发展提供技术支撑。

银行信息系统应用架构详解 384

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2652

Android/linux(earlysuspend、lateresume)睡眠唤醒机制简介

转载自: http://blog.sina.com.cn/s/blog_759dc36b0100stax.html   背景介绍: 睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以是嵌入式设备尽可能的进入休眠状态,来延长电池的续航时间(这在移动终端消费类电子设备中是非常重要和有意义的!!)。但标准的Linux睡眠唤醒机制有其自身的一些缺陷(所有模块必须同时睡下或

sam0535的专栏 513

作物生长模型Oryza V3实战9:控制文件参数详解

control.dat是ORYZA水稻模型的核心配置文件,主要包含三部分:1)基础参数设置与模拟时间定义;2)关键文件路径配置,包括土壤参数文件(soil.sol)、作物参数文件(cultivar.crp)、田间管理文件(manage.exp)及气象数据目录,同时指定输出结果文件(res.dat)和运行日志(model.log);3)可选参数和输出控制选项。该文件通过关联各类输入数据(气象、土壤、品种特性等)和输出结果,实现模型运行的全流程控制,支持参数调整后继续模拟和中断恢复功能。

219

待机唤醒及一些调试处理

Android (Linux) Suspend流程 1. Linux Suspend简介     Linux Suspend主要有以下三步:    1) 冻结用户态进程和内核态任务    2) 调用注册的设备的suspend的回调函数,顺序是按照注册顺序    3) 休眠核心设备和使CPU进入休眠态。    冻结进程(suspend_freeze_processes)是内核把进程列表中所

tianshiyalin的专栏 1232

【AI产品与商业航图】Flux.1 完全开源 AI 绘图模型:本地部署与 ComfyUI 实战指南

Flux.1是一个开源项目,用户可以自由使用和修改,完全免除使用费用。🖥️本地部署支持:与一些依赖云端计算的工具不同,Flux.1支持本地部署,确保用户可以离线使用并自主控制数据隐私。🔄兼容ComfyUI框架:Flux.1可以无缝集成到ComfyUI中,用户可以享受更加简便和直观的操作界面。🎨卓越的图像生成能力:Flux.1能够生成高质量、细腻的图像,支持多种风格与创作主题的切换。💾低硬件要求。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1736

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android休眠唤醒机制简介(一)【转】

本文转载自:http://blog.youkuaiyun.com/zhaoxiaoqiang10_/article/details/24408129 Android休眠唤醒机制简介(一) *************************************************************************作者:sean日期:2012-11-29修改历史:2014-1*...

159

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android休眠唤醒机制简介(一)

Android休眠唤醒机制简介(一) ************************************************************************* 作者:sean 日期:2012-11-29 修改历史: **************************************************************************

coldsnow33的专栏 2047

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android休眠唤醒流程分析

Android休眠唤醒机制简介(一) 1、背景介绍:    睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以是嵌入式设备尽可能的进入休眠状态,来延长电池的续航时间(这在移动终端消费类电子设备中是非常重要和有意义的!!)。但标准的Linux睡眠唤醒机制有其自身的一些缺陷(所有模块必须同时睡下或者唤醒),在某些情况下,这会导致能耗的白白浪费。因此Android在标准L

石头的专栏 8966
上一篇: 关于双屏显示的一些问题解释
下一篇: LDD之input子系统--代码分析
huber
博客等级 码龄15年 79粉丝 24原创
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值