Android休眠唤醒1

http://blog.csdn.net/zhaoxiaoqiang10_/article/details/24408129#t0


1、标准Linux睡眠唤醒机制简介:

休眠主要三个主要的步骤:

(1)冻结用户态进程和内核态任务;

(2)调用注册的设备的suspend的回调函数,其调用顺序是按照驱动加载时的注册顺序。

(3)休眠核心设备和使CPU进入休眠态      冻结进程:内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文。 

         当这些进程被解冻的时候,它们是不知道自己被冻结过的,只是简单的继续执行。


那么是如何让Linux进入休眠的呢?其实很简单,因为Android和kernel已经做了很多复杂的工作,用户只需通过读写sys文件/sys /power/state 实现控制系统进入休眠。比如:

#echo mem > /sys/power/state /// 使系统进行睡眠
#echo on > /sys/power/state使系统从睡眠中唤醒过来
当然还有其它的状态操作,在下面的内容中将有介绍。

3、Android睡眠唤醒机制简介:

Android在Linux内核唤醒模块基础上,增加了下面三个机制:
Wake _Lock 唤醒锁机制;
Early _Suspend 预挂起机制;
Late _Resume 迟唤醒机制;


基本原理:当启动一个应用程序的时候,可以申请一个wake_lock唤醒锁,申请成功后都会在内核中注册一下(通知系统内核,已经有锁被申请),当应用程序释放wake_lock时,会注销之前申请的wake_lock。

特别注意:系统中有一个wake_lock,系统都不能进行睡眠。但各个模块可以early_suspend。当系统中所有的wake_lock都被释放之后,系统就会进入真正的kernel睡眠状态。

         系统启动的时候会创建一个主唤醒锁main_wake_lock,该锁是内核初始化并持有的一个WAKE_LOCK_SUSPEND属性的非限时唤醒锁。系统正常工作时,将始终因为该锁被内核持有无法进入睡眠状态。不添加新锁的情况下,只需将main_wake_lock 解锁,系统即可进入睡眠状态。 

Android睡眠唤醒模块框架


       从Android最上层(Java写的应用程序)往下跟进,经过Java、C++和C语言写的Framework层、JNI层、HAL层最后到达android的最底层(Kernel层)

主要涉及目录文件:
frameworks/base/core/java/android/os/PowerManager.java 
frameworks/base/services/java/com/android/server/PowerManagerService.java
frameworks/base/services/jni/com_android_server_power_PowerManagerService.cpp
hardware/libhardware_legacy/power/power.c

kernel/power/main.c 
kernel/power/earlysuspend.c
kernel/power/suspend.c
kernel/power/wakelock_android.c
kernel/power/userwakelock.c


      在应用程序框架层中,PowerManager类是面向上层应用程序的接口类,提供了Wake Lock机制(同时也是睡眠唤醒子系统)的基本接口(唤醒锁的获取和释放)。上层应用程序通过调用这些接口,实现对系统电源状态的监控

      PowerManager类通过IBinder这种Android中特有的通信模式,与PowerManagerService 类进行通信。PowerManagerService调用Power 类来与下一层进行通信。PowerManagerService 类是WakeLock 机制在应用程序框架层的核心,他们对应用程调用PowerManager类接口时所传递的参数进行初步的分析和对应的设置,并管理一个唤醒锁队列,然后配合其他模块(例如WatchDog、BatteryService、ShutdownThread 等)的状态信息,做出决策,调用Power类的对应接口,最终通过JNI 接口,调用到硬件抽象层中的函数,对sysfs 的用户接口进行操作,从而触发内核。


PowerManager.java:提供上层应用程序的接口;

PowerManagerService.java:具体实现PowerManager类中的接口;
com_android_server_power_PowerManagerService.cpp:实现Power类中的JNI接口;
power.c:进行sysfs用户接口的操作。

其余涉及到的都是内核kernel中的文件,它们的作用将在后续给予介绍。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值