电源管理之android内核suspend to disk的实现(二)

android内核的电源管理(PM) Android定义了几种低功耗的状态:earlysuspend(挂起早期),suspend(挂起),hibernation(休眠)。之所以增加了节能的复杂性,主要考虑到android设备在有程序运行时同样需要进行节能这种特殊需求,以及考虑了外设(比如wifi、led等)单独节能的需求。 其中earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度 阅读详情

转载请注明出处:http://blog.youkuaiyun.com/wang_zheng_kai

4、Linux Suspend 的流程

    相关的文件下面是文件的路径:android4.0/kernel/kernel/power/

    接下来让我们详细的看一下Linux是怎么休眠/唤醒的:

    (1)用户对于/sys/power/state的读写会调用到main.c中的state_store(),用户可以写入constchar * const pm_state[] 中定义的字符串,比如"mem","standby","disk","on".

    (2)然后state_store()会首先检测是不是为disk,如若是disk则调用hibernate();否则调用enter_state(),它们首先会检查一些状态参数,然后同步文件系统.。

    (3)准备, 冻结进程

    当进入到suspend_prepare()中以后,它会给suspend分配一个虚拟终端来输出信息,然后广播一个系统要进入suspend的Notify,关闭掉用户态的helper进程,然后一次调用suspend_freeze_processes()冻结所有的进程,这里会保存所有进程当前的状态,也许有一些进程会拒绝进入冻结状态,当有这样的进程存在的时候,会导致冻结失败,此函数就会放弃冻结进程,并且解冻刚才冻结的所有进程。

    (4)让外设进入休眠

    现在,所有的进程(也包括workqueue/kthread)都已经停止了,内核态人物有可能在停止的时候握有一些信号量,所以如果这时候在外设里面去解锁这个信号量有可能会发生死锁,所以在外设的suspend()函数里面作lock/unlock锁要非常小心,这里建议设计的时候就不要在suspend()里面等待锁.而且因为suspend的时候,有一些Log是无法输出的,所以一旦出现问题,非常难调试。

    (5)然后kernel在这里会尝试释放一些内存。

    (6)最后会调用suspend_devices_and_enter()来把所有的外设休眠,在这个函数中,如果平台注册了suspend_pos(通常是在板级定义中定义和注册),这里就会调用suspend_ops->begin(),然后driver/base/power/main.c中的device_suspend()->dpm_suspend()会被调用,他们会依次调用驱动的suspend()回调来休眠掉所有的设备。

    注:suspend_ops是板级的电源管理操作,通常注册在文件arch/xxx/mach-xxx/pm.c中。

    (7)当所有的设备休眠以后suspend_enter()调用suspend_ops->prepare()会被调用,执行device_prepare这个函数通常会作一些准备工作来让板机进入休眠.接下来Linux,在多核的CPU中的非启动CPU会被关掉,通过注释看到是避免这些其他的CPU造成racecondion,接下来的以后只有一个CPU在运行了,核心设备的停止。

    (8)接下来suspend_enter()会被调用,这个函数会关闭archirq,调用device_power_down(),它会调用suspend_late()函数,这个函数是系统真正进入休眠最后调用的函数,通常会在这个函数中作最后的检查.如果检查没问题,接 下来休眠所有的系统设备和总线,并且调用suspend_pos->enter()来使CPU进入省电状态,这时候,就已经休眠了,代码的执行也就停在这里了。

5、Linux Resume流程

    这里只对suspend to mem的resume做介绍,对于disk的suspend和android很类似,我将会进行作图解释。下面就进行解释:

    如果在休眠中系统被中断或者其他事件唤醒,接下来的代码就会开始执行,这个唤醒的顺序是和休眠的循序相反的,所以系统设备和总线会首先唤醒,使能系统中断,使能休眠时候停止掉的非启动CPU,以及调用suspend_ops->finish(),而且在suspend_devices_and_enter()函数中也会继续唤醒每个设备,使能虚拟终端,最后调用suspend_ops->end().在返回到enter_state()函数中的,当suspend_devices_and_enter()返回以后,外设已经唤醒了,但是进程和任务都还是冻结状态,这里会调用suspend_finish()来解冻这些进程和任务,而且发出Notify来表示系统已经从suspend状态退出,唤醒终端.到这里,所有的休眠和唤醒就已经完毕了,系统继续运行了.

个人观点,有问题请斧正!!

    转载请注明出处:http://blog.youkuaiyun.com/wang_zheng_kai


RK3399平台开发系列讲解(电源管理篇)11.10、linux suspend resume 流程 linux suspend resume 流程 阅读详情

相关推荐

GB28181协议实战:5分钟搞定海康摄像头SIP注册失败问题(附Wireshark抓包分析)

本文详细解析了海康摄像头在GB28181协议下SIP注册失败的7个关键原因及解决方案,包括网络可达性、鉴权参数、NAT穿越等核心问题。通过Wireshark抓包分析,提供快速定位方法,帮助工程师高效解决SIP注册失败问题,提升实时图像联调效率。

weixin_29212867的博客 557

电源管理之android内核suspend to disk的实现(一)

最近刚刚做了一份关于电源管理中android系统suspend to disk的实现研究学习报告,最近比较清闲就简单做了整理。 我是基于北京君正jz4780grus开发板做的探究,我将要在这几天按照下面做一个学习报告,其内容如下所示: 一、Linux休眠/唤醒简介 1、介绍Linux系统的Suspend的四种状态 2、Linux系统的休眠的步骤 3、用户空间接口 4、Linux S

中华田园犬 6847

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 578

Android 内核驱动——电源管理

1.1基本原理 Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。  earlysuspend 是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如 LCD 可以降低亮度或灭掉;  suspend 是指除电源管理以外的其他外围模块以及 cpu 均不工作,只有内存保持自刷新的 状态;  hibernation 是指

wangqiaozhi的专栏 1130

BEVFusion(mit)最强环境安装,部署复现

BEVFusion作为一项经典的工作,值得深入探索。然而由于配置环境比较麻烦,耽误了一些时间。经过几次成功配置之后,有了一些总结,在这里记录下来,供大家参考避坑,也方便自己下次查阅。

qq_45783225的博客 1万+

大疆前端开发面试题及参考答案(4万字长文)

在前端项目中,难点和性能优化的挑战无处不在。比如在处理复杂交互界面时,实现流畅的动画效果和实时反馈就是一大难点。当界面中有大量元素需要同时进行交互和动态更新,像电商平台的商品筛选和排序功能,不仅要保证操作的即时响应,还要确保界面在各种设备和网络环境下的稳定性,这就需要对事件处理、DOM 操作和数据更新机制有深入理解。在性能优化方面,首屏加载速度是常见的难点。当页面包含大量图片、脚本和样式文件时,如何合理地进行资源压缩、合并与缓存,以减少加载时间,是需要精心考虑的。

大模型大数据攻城狮的专栏 1155

【sys/power】freeze、standby、mem、disk四个电源状态

此状态下计算机将所有活动的状态保存到磁盘中,然后处于关机状态,此模式下是不耗电的,而相比之前的模式,休眠和唤醒的速度都比较慢。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。(Suspend-To-Idle), "shallow(浅睡)" (Power-On Suspend) and "deep" (Suspend-To-RAM).Suspend-To-Idle(idle) and hibernation(冬眠) (Suspend-To-Disk), respectively(分别).

木牛的博客 1730

直捣黄龙~

这篇文章描述了一个矩阵寻路问题,要求计算从起点到终点的最短路径数量及长度。主要思路是通过BFS算法解决:首先标记哨兵警戒区域为禁区,然后从起点出发进行广度优先搜索,记录每个位置的最短步数和路径条数。当到达终点时,输出路径数和步数;若不可达则返回(0,0)。算法使用队列实现BFS,同时处理路径统计和步数记录,适用于网格寻路类问题。

面试高手的博客 217

【Android】 android suspend/resume总结(1)

芯片(SoC)上系统的电源状态有:on、idle和suspend。On表示SoC正在运行。Idle是一种中等功率模式,在这种模式下,SoC是通电的,但不执行任何任务。Suspend是一种低功耗模式,其中SoC没有供电。在此模式下,设备的功耗通常比“On” 模式低100倍。

weixin_41028159的博客 7560

【C# + HALCON 机器视觉】HALCON经典算子:光流法运动分析(optical_flow_mg)

摘要:本文面向智能监控人流统计需求,研究C#与HALCON集成开发中optical_flow_mg算子的应用。通过RTSP获取视频流,利用光流法计算运动矢量,结合形态学操作与区域筛选实现行人区域分割,最终完成人流量统计与热力图可视化。详细阐述ROI局部处理等性能优化策略、try-catch异常捕获机制及跨平台集成方案。实验表明,该系统检测准确率达93.6%,单帧处理时间42ms,为公共场所人流量统计提供了完整可行的技术方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1444

西门子 S7-1200 G2 高速计数器的使用方法介绍

西门子 S7-1200 G2 高速计数器的使用方法介绍

Robot_PLC_HMI_Automation 1700

电源管理之android内核suspend to disk的实现(七)--方案的选择与问题解决

一、实现android系统hibernation的方案分析: 实现方案分析:       方案一: linux标准内核实现       android标准内核的代码是由linux内核演变而来,只要解决android系统独特的wakelock问题,并提供交换分区的支持,就能实现android系统的hibernation。       方案二: tuxonice内核补丁实现     t

中华田园犬 4369

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

嵌入式系统电源管理

1、电源管理 1.1 概述 目的: 在系统可维持正常所期望工作状态的情况下,尽可能降低功耗。Linux电源管理涉及到系统待机,频率电压变换,系统空闲处理,运行时期电源管理等多个方面。 措施: 《Linux设备驱动开发详解》一书中对电源管理的总结: 1.2 单片机 对于51单片机的电源管理,提供了低速,空闲和掉电三种模式来省电。 通过分频使系统降频工作 空闲...

风雨无阻 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

电源管理之android内核suspend to disk的实现(四)

3、Android的suspend执行流程     函数的流程如下所示:     应用程序通过对/sys/power/state的写入操作可以使系统进行休眠的状态,会调用/kernel/power/main.c中的state_store函数。pm_states包括:PM_SUSPEND_ON,PM_SUSPEND_STANDBY,PM_SUSPEND_MEM满足的状态。     1)当状态位

中华田园犬 3714

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

linux 电源管理源码分析3,基于Android的Linux内核的电源管理:Early Suspend

3. 工作流程首先,我们从kernel/power/wakelock.c中的初始化函数开始:staticint__initwakelocks_init(void){intret;inti;......for(i=0;iINIT_LIST_HEAD(&active_wake_locks[i]);......wake_lock_init(&main_wake_lock,WA...

weixin_30592887的博客 289

电源管理之android内核suspend to disk的实现(三)

Android休眠的介绍

中华田园犬 3827

基于Android的Linux内核的电源管理:概述

1.  电源管理的状态 Android的Linux内核为系统提供了4种电源状态,内核的源代码为其中的3种定义了名字和对应的宏定义,名字定义在kernel/power/suspend.c中: const char *const pm_states[PM_SUSPEND_MAX] = { #ifdef CONFIG_EARLYSUSPEND [PM_SUSPEND_ON] = "on",

DroidPhone的专栏 1万+

电源管理之android内核suspend to disk的实现(九)--tuxonice实现方案

完成在标准内核基础上的android系统的suspend to disk后,又采取了tuxonice补丁的方式进行比较,发现由于压缩的缘故,速度有所提高10s左右。 该范方案的实现我是根据我的一位离职的同事写学习笔记进行测试,实验证明是可行的,以下部分程序的讲解我也直接进行了引用。 要是大家遇到啥问题,可以一起讨论。。。。。 概要: 1. 目标 2. 概要 3. 操作流程 4.

中华田园犬 7082

android电源管理-休眠简要分析

Android电源管理-休眠简要分析 工作需要,需要对这一块深入学习。故在此做一点分析记录,存疑解惑。 一、开篇  1.Linux 描述的电源状态  - On(on)                                                 S0 -  Working - Standby (standby)                         

CCJHDOPC的专栏: 1650

电源管理之android内核suspend to disk的实现(五)--STR执行流程图

三、Android 休眠(suspend to RAM)程序自行流程图(自己手工绘制,有错误请指正)

中华田园犬 4510
上一篇: 电源管理之android内核suspend to disk的实现(一)
下一篇: 电源管理之android内核suspend to disk的实现(三)
中華田園犬
博客等级 码龄16年 349粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值