第十三章 Android内核驱动——电源管理
Linux的电源管理架构

Linux的电源管理架构Linux的源代码里,大部分都属于设备驱动程序的代码,因此,大多数电源管理(PM)的代码也是存在于驱动程序当中。
很多驱动程序可能只做了少量的工作,另外一些,例如使用电池供电的硬件平台(移动电话等)则会在电源管理上做了大量的工作。
这份文档对驱动程序如何与系统的电源管理部分交互做了一个大概的描述,尤其是关联到驱动程序核心中的模型和接口的共享,建议从事驱动程序相关领域的人通过本文档可以了解相关的背景知识。
设备电源管理的两种模型===================================驱动程序可以使用其中一种模型来使设备进入低功耗状态:1. 系统睡眠模型:驱动程序作为一部分,跟随系统级别的低功耗状态,就像”suspend”(也叫做”suspend-to-RAM”),或者对于有硬盘的系统,可以进入”hibernation”(也叫做”suspend-to-disk”)。
这种情况下,驱动程序,总线,设备类驱动一起,通过各种特定于设备的suspend和resume 方法,清晰地关闭硬件设备和各个软件子系统,然后在数据不被丢失的情况下重新激活硬件设备。
有些驱动程序可以管理硬件的唤醒事件,这些事件可以让系统离开低功耗状态。
这一特性可以通过相应的/sys/devices/…/power /wakeup文件来开启和关闭(对于Ethernet驱动程序,ethtool通过ioctl接口达到同样的目的);使能该功能可能会导致额外的功耗,但他让整个系统有更多的机会进入低功耗状态。
2. Runtime 电源管理模型:这种模型允许设备在系统运行阶段进入低功耗状态,原则上,他可以独立于其他的电源管理活动。
不过,通常设备之间不能单独进行控制(例如,父设备不能进入suspend,除非他的所有子设备已经进入suspend状态)。
此外,依据不同的总线类型,可能必须做出一些特别的操作来达到目的。
如果设备在系统运行阶段进入了低功耗状态,在系统级别的电源状态迁移时(suspend或hibernation)就必须做出特别的处理。
安卓期末考试知识总结

安卓期末考试知识总结第一章:Android基础入门习题总结1.Android系统采用分层架构,由高到低分为4层,主要为:应用程序层、应用程序框架层、核心类库、Linux内核2.在Android项目程序开发完成后中,必须__打包成_正式的Android安装文件,才能发布到互联网上让用户下载使用。
3.Android 工程中src目录下存放_java__文件重点知识1.应用层:应用层是核心应用程序的集合。
手机上所有的应用都属于这一层,程序,短信程序。
2.应用程序框架层:应用程序框架层主要提供构建应用程序时用到的各种API,例如:活动管理器、通知管理器、内容提供者3.核心类库:核心类库中包含了系统库及Android运行环境。
(1)系统库主要通过c/c++库为Android系统提供主要的特性支持(2)Android运行时库主要提供一些核心库,允许开发者使用java语言来编写Android应用程序4.Linux内核:为Android·设备的各种硬件提供底层的驱动,如显示驱动、音频驱动、蓝牙驱动、电源管理驱动Android工程中的assets目录主要存放一些文件资源,这些文件会被原封不动的打包到APK文件中更为细分的5层架构:应用程序层、应用程序框架层、核心类库、硬件抽象层 (HAL)、Linux内核硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。
HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。
当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。
第二章:Android常见桌面布局&第三章:Android常见界面控件知识总结1.Android应用的界面是由View 对象和 ViewGroup 对象构建而成的。
ViewGroup继承自View,ViewGroup作为容器盛装界面中的其他控件Android应用的每个界面的根元素必须有且只有一个ViewGroup容器Android常见布局和特点:Android中常见的五种布局:相对布局(RelativeLayout)、线性布局(LinearLayout)、表格布局(TableLayout)、帧布局(FrameLayout)、约束布局(ConstraintLayout)1.相对布局(RelativeLayout):相对布局是一种基于相对位置的布局方式,可以通过设置组件相对于其他组件或父容器的位置来实现布局。
信息安全工程师综合知识真题考点:安卓Android系统架构

信息安全工程师综合知识真题考点:安卓Android系统架构Android是一个开源的移动终端操作系统,共分成Linux内核层、系统运行库层、应用程序框架层和应用程序层四个部分。
●Linux内核层:这一层为Android设备的各种硬件提供了底层的驱动,包括音频驱动、Bindre(IPC)驱动、摄像头驱动、显示驱动、内存驱动、键盘驱动、电源管理、WiFi驱动。
●系统运行库层:Android的系统运行库包含两部分,一个是系统库,另一个是运行时。
Android运行时:核心库、Dalvik虚拟机。
库:FreeType、libc、LibWebCore、媒体框架、OpenGL | ES、SGL、SQLite、SSL、外观管理器。
●应用框架层:这一层主要提供了构建应用程序时可能用到的各种API,如Activity管理器、内容提供器、位置管理器、通知管理器、包管理器、资源管理器、电话管理器、视图系统、窗口管理器。
●应用程序层:所有安装在手机上的应用程序都是这个层,如主屏、浏览器、联系人、电话。
注:详见《信息安全工程师教程》(第2版)544-545页。
考点相关真题
Android 是一个开源的移动终端操作系统,共分成Linux 内核层、系统运行库层、应用程序框架层和应用程序层四个部分。
显示驱动位于()。
A.Linux内核层
B.系统运行库层
C.应用程序框架层
D.应用程序层
参考答案:A。
Android系统架构及内核简介

Android系统架构及内核简介(来源于ThinkPHP)Android是Google公司开发的基于Linux平台的开源⼿机操作系统,它包括操作系统、中间件、⽤户界⾯和应⽤程序,⽽且不存在任何以往阻碍移动产业创新的专利权障碍,并由Google公司于2007年11⽉5⽇正式发布。
同时,Google公司组建了⼀个开放⼿机联盟,这个联盟由中国移动、摩托罗拉、⾼通、宏达电和T-Mobile等在内的全球30多家技术和⽆线应⽤的领军企业组成,Google通过与运营商、设备制造商、开发商和其他有关各⽅结成深层次的合作伙伴关系,希望借助建⽴标准化、开放式的移动电话软件平台,在移动产业内形成⼀个开放式的⽣态系统;可预见地,⽣产和使⽤基于 Android系统的嵌⼊式⼿持移动设备将是未来的发展趋势,对相应软件的需求量也将⽇趋增长,因此对Android系统内部作⼀个完整和深⼊的分析,对基于Android平台的软件移植和开发是很有益处的。
1 Android系统平台架构对操作系统⽽⾔,必须做到设计合理、层次分明,同时还需考虑整个系统的结构要聚耦适当,Android系统是基于linux内核的,因此还必须具备开源的特性,以符合开源⼈员共同⼯作。
从系统的组成要件来讲,Android平台架构包括硬件设备、板级⽀持包、驱动程序、操作系统内核、程序运⾏库,运⾏框架,应⽤程序等,它们的有机结合和协同⼯作共同完成了整个系统的正常运⾏和对事务的处理。
依据Google开源资料可知,整个系统由Linux内核、程序库、Android Runtime、应⽤程序框架和应⽤程序等5部分组成,,系统架构如图1所⽰。
参照图1,由上⽽下对组成系统各部分的主要组件作以下描述。
1.1 Linux内核Android基于Linux 2.6内核,但并⾮完全照搬内核,⽽是对内核作了部分增删和修改,在Linux 2.6内核的基础上,Android核⼼系统实现了安全性、内存管理、进程管理、⽹络协议栈和驱动模型等功能,Linux内核也同时作为硬件和软件栈之间的抽象层。
安卓系统层次架构

安卓系统层次架构1.安卓的系统架构2.分析第一层:Linux操作系统和驱动(Linux kernel):由C语言实现。
Android核心系统服务依赖于Linux2.6内核,包括:安全性、内存管理、进程管理、网络协议、驱动模型。
Linux内核也作为硬件和软件栈之间的抽象层。
除了标准的Linux内核外,Android还增加了内核的驱动程序:Binder(IPC)驱动、显示驱动、输入设备驱动、音频系统驱动、摄像头驱动、WiFi驱动、蓝牙驱动、电源管理。
第二层:本地框架和Java运行环境(LIBRARIES和ANDROID RUNTIME)本地框架是有C/C++实现。
包含C/C++库,被Android系统中不同组件使用,它们通过Android应用程序框架为开发者进行服务。
系统C库:(libc)从BSD继承过来的标准的C系统函数库,专门是为基于嵌入式Linux的设备定制的库。
多媒体库:基于PackerVideo的OpenCore;该库支持多种常用的音频、视频格式回放和录制,支持多种媒体格式的编和解码格式。
Suface Manager:显示子系统管理器,并且为多个应用程序提供2D和3D图层的无缝融合。
LibWebCore:一个最新的Web浏览器引擎,支持Android浏览器,以及一个可嵌入式的Web视图。
SGL:Skia图形库,底层的2D图形引擎。
3D libraries:基于OpenGL ES1.0 API的实现;该库可以使用硬件3D加速(如果可用),或者使用高度优化的3D软加速。
FreeType:位图(bitmap)和矢量(vector)字体显示。
Android运行环境(ANDROID RUNTIME):提供了Java编程语言核心库的大多数功能,由Dalvik Java虚拟机和基础的Java类库组成。
Dalvik是Android中使用的Java虚拟机,每个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
andriod选择题

MITT考试范围Android应用程序开发部分第一章Android应用与开发环境1. 被称为“Android之父”的是( B )。
A、Steve JobsB、Andy RubinC、Tim CookD、Bill Gates解析:安迪-鲁宾(Andy Rubin),Andrew Rubin,Google移动平台副总裁、Android主管,Android 平台创始人。
2.Android的版本代号为4.2版的重要更新内容不包括下面哪一项( C )。
A、支持多用户账户B、加入手势输入C、加入屏幕截图功能D、加入照片球(球形全景拍摄)功能解析:Android的版本代号为4.2版新增功能:Photo Sphere 全景拍照功能。
键盘滑动手势输入及更聪明的语音输入功能。
单一平板电脑装置多重帐户登录与个人主页,并支持快速切换。
Miracast 无线显示分享功能。
Daydream 屏幕保护功能。
可直接进行操作的状态通知列功能新版 Google Now 新增以 Gmail 登入信息作为数据源新版 Google Now 新增航班追踪功能、酒店、餐厅预订,与音乐和电影推荐功能。
Gmail 邮件可缩放显示。
可于屏幕锁定界面直接开启 App 及相机功能。
增加为盲人用户设计的语音输出及手势模式导航功能。
连点三次可放大整个显示页及两指旋转和缩放功能。
3.下面关于Android系统的特性描述错误的是( D)。
A、显示布局:Android操作系统支持更大的分辨率,VGA,2D显示,3D显示都给予OpenGL ES 2.0标准规格,并且支持传统的智能手机。
B、数据存储:Android操作系统内置SQLite小型关联式资料库管理系统来负责存储数据。
C、网络:Android操作系统支持所有的网络制式,包括GSM/EDGE、IDEN、CDMA、EV-DO、UMTS、Bluetooth、Wi-Fi、LTE、NFC和WiMAX。
D、信息:作为原设计给智能手机使用的操作系统,Android操作系统原生只支持短信,并且支持所有的云信息和服务器信息。
安卓

研发历史
• • • • • •
•
2009年 4月30日,Android1.5正式发布。 5月10日,HTC G1和HTC G2市场大卖,成 为仅次于iPhone的热门机型。 9月25日,Android1.6正式发布。 9月29日,HTC Hero G3广受欢迎,成为全 球最受欢迎的机型。 10月28日,Android 2.0 智能手机操作系统正 式发布。 11月10日,由于Android的火热,Android平 台出现第一个恶意间谍软件:Mobile Spy。
• •
• • • • • •
安卓版本
• • Android 3.0Honeycomb(蜂巢) 2011年2月2日,3.0(Honeycomb 蜂 巢)版本主要更新如下: • 1、优化针对平板 • 2、全新设计的UI增强网页浏览功能 • 3、n-app purchases功能
安卓版本
• • • • • • • • • Android 3.1Honeycomb(蜂巢) 2011年5月11日在Google I/O开发者大会宣布发布, 版本主要更新如下: Honeycomb蜂巢(改进3.0BUG) 1、经过优化的Gmail电子邮箱 2、全面支持GoogleMaps 3、将Android手机系统跟平板系统再次合并从而方便 开发者 4、任务管理器可滚动,支持USB 输入设备(键盘、 鼠标等) 5、支持Google TV.可以支持XBOX 360无线手柄 6、widget支持的变化,能更加容易的定制屏幕 widget插件
安卓版本
• •
• • • • • •
Android 2.2/2.2.1Froyo(冻酸奶) 2010年5月20日,2.2(Froyo 冻酸奶)版本 软件开发工具包发布。主要的更新如下: 1、整体性能大幅度的提升 2、3G网络共享功能。 3、Flash的支持。 4、App2sd功能。 5、全新的软件商店。 6、更多的Web应用API接口的开发。
基于android的248游戏开发-毕业设计(论文)

毕业设计(论文)基于Android平台2048游戏开发教学单位:计算机学院专业名称:软件工程(游戏与数字媒体)学号:学生姓名:高振东指导教师:宋喜佳(讲师)指导单位:计算机学院完成时间:2016年4月30日电子科技大学中山学院教务处制发基于Android平台2048游戏开发【摘要】在生活节奏不断加快的现代社会,轻松的益智游戏对缓解生活压力调节情绪具有重要的意义。
《2048》这款小游戏是一款流行的数字游戏。
第一款《2048》小游戏是由Gabriele Cirulli首度发布在GitHub上。
《2048》是当时基于《1024》和《小三传奇》这两款的玩法而开发的新型数字游戏,而游戏设计初衷是一款益智类的游戏,其特点在于轻松,简单,因此,开发要求做到各项功能要完备、操作要简便、易学易用。
现在开发出来的版本有普通版、六边形版、朝代版、3D版、后宫版等等。
本文采用 JAVA语言开发了 2048 小游戏,通过Android平台实现了2048 的基本运行,本着简单,易于操作的原则和缓解生活压力、降低生活节奏的初衷,游戏中没有繁多的按钮,也不用特别复杂的操作,只需动动手指,即可操纵自如。
游戏经过图形界面的处理,以不同的颜色显示不同的数字,并拥有了最高成绩记录,撤销上一步,重置游戏的各项功能。
对于游戏的逻辑实现部分进行测试,测试结果正常,目前没有发现异常。
但是游戏界面可能有些简单,日后可以通过美化界面来获得更好的游戏体验。
【关键词】游戏;益智;数字Based on the Android platform 2048 game 【Abstract】In the accelerated pace of life in the modern society, easy puzzle game to ease the pressure of life.Force, adjust the mood has important meaning "2048" this small game is a popular digital game. The first "2048" small game was released by Cirulli GitHub on Gabriele for the first time. "2048" was based on "1024" and "small three" Legend of the two gameplay and the development of a new type of digital games and game design original intention is a puzzle game, its characteristics is easy and simple, therefore, development.Seeking to achieve the function to complete, easy to operate, Yi Xueyi use. Now developed a version of the ordinary version, hexagonal version, Dynasty version, 3D version, the palace version, etc.The Java language to develop the 2048 small game, 2048, the basic operation is realized through the Android platform, the purpose of simple and easy operation principle and alleviate the pressure of life, reduce the original intention of the rhythm of life, the game without different button, also need not particularly complex operations, only need to move a finger, you can maneuverability.Game through the processing of the graphical interface to display different colors with different numbers, and have the highest score records, undo the last step, reset the function of the game. The logic of the game to achieve part of the test, the test results are normal, there is no abnormal. But the game interface may be a little simple, in the future can be used to beautify the interface to get a better gaming experience.【Key Words】game;puzzle;numbel目录第1章绪论 (1)1.1 游戏开发背景 (1)1.2 国内外研究现状 (1)1.3 游戏开发意义 (2)1.4 论文结构 (2)第2章相关技术和理论基础 (3)2.1 Java语言 (3)2.2 Android操作系统 (4)2.2.1 简介 (4)2.2.2 系统架构 (5)2.2.3 Android版本 (6)2.3 开发平台介绍 (6)2.3.1 Eclipse (6)2.3.2 ADT (7)2.3.2 JDK (7)第3章可行性分析 (8)3.1 可行性研究目的 (8)3.1.1 技术可行性 (8)3.1.2 经济可行性 (8)3.1.3 操作可行性 (8)第4章游戏设计 (9)4.1 游戏规则 (9)4.2 总体设计 (9)4.3 详细设计 (11)第5章游戏测试 (17)5.1测试过程 (17)5.2测试内容 (17)5.3测试结果 (21)第6章心得体会 (22)参考文献 (23)附录游戏实现代码 (24)致谢 (32)图目录图2.1 Java Logo (3)图2.2 Android Logo (4)图2.3 Android系统架构 (5)图4.2.1 系统功能 (9)图4.2.2 计分显示 (10)图4.2.3 游戏内容 (10)图4.2.4 游戏菜单 (10)图4.2.5 游戏流程 (11)图4.3.1 游戏主界面 (12)图4.3.2 数字合并前 (13)图4.3.3 数字合并后 (14)图4.3.4 游戏计分 (15)图4.3.5 游戏计分 (15)图4.3.6 游戏结束 (16)图5.2.1 游戏开始 (18)图5.2.2 向上滑动 (18)图5.2.3 向左滑动 (19)图5.2.4 向下滑动 (19)图5.2.5 向右滑动 (20)图5.2.6 撤销功能 (20)图5.2.7 重置功能 (21)第1章绪论1.1 游戏开发背景Android 智能手机功能非常强大,具有很高的性价比,非常深受人们的喜爱,可能正式因为如此,在2014年中,Android 智能手机在全世界占据着81.5%很夸张的市场份额,一举成为使用的人数最多,市场份额占据最大的Android 智能手机系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十三章Android内核驱动——电源管理13.1 基本原理Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
●earlysuspend是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如LCD可以降低亮度或灭掉;●suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的状态;●hibernation是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到“关机”之前的状态。
13.2 电源管理机制的实现电源管理机制的源代码主要在kernel/power/文件夹下面。
main.c文件是整个框架的入口。
用户可以通过读写sys文件/sys/power/state实现控制系统进入低功耗状态。
用户对于/sys/power/state的读写会调用到main.c中的state_store(),用户可以写入const char * const pm_states[] 中定义的字符串,比如“on”,“mem”,“standby”,“disk”。
state_store()首先判断用户写入的是否是“disk”字符串,如果是则调用hibernate()函数命令系统进入hibernation状态。
如果是其他字符串则调用request_suspend_state()(如果未定义CONFIG_EARLYSUSPEND)或者调用enter_state()(如果未定义CONFIG_EARLYSUSPEND)。
request_suspend_state()函数是android相对标准linux改动的地方,它实现在earlysuspend.c 中。
在标准linux内核中,用户通过sysfs 写入“mem”和“standby”时,会直接调用enter_state()进入suspend模式,但在android中则会调用request_suspend_state()函数进入early suspend 状态。
request_suspend_state()函数代码如下:可见实际工作的是early_suspend和late_resume这两个函数。
Android提供了register_early_suspend和unregister_early_suspend两个函数供驱动调用,分别完成设备earlysuspend的注册和注销。
系统将所有注册支持early_suspend的设备驱动对应的handler 挂在一个称为early_suspend_handler的链表上。
函数early_suspend和late_resume完成的事情很简单,就是遍历这个链表,依次调用每个设备注册的handler,late_resume是唤醒处于register_early_suspend函数完成的功能就是把驱动提供的earlysuspend handler挂到early_suspend_handler链表上。
unregister_early_suspend则相反,从链表上摘下handler。
fbearlysuspend.c和consoleearlysuspend.c这两个文件实现了针对lcd framebuffer的earlysuspend支持和console的earlysuspend支持。
实际上这两个文件就是利用上面earlysuspend.c提供的接口注册了针对framebuffer和console的early suspend handler,并提供相应的handler函数。
Hibernate.c文件实现hibernation低功耗状态,是最彻底的低功耗模式,它把所有内存镜像都写入磁盘中,然后系统关机。
该文件还在sysfs文件系统中创建了多个entry,分别是/sys/power/disk,/sys/power/resume和/sys/power/image_size,这样用户可以直接通过sysfs 来控制系统进出hibernation状态。
这块代码跟标准Linux内核没有什么区别。
Android改动较大的另一处是增加了wakelock机制。
实现在wakelock.c和userwakelock.c中。
wakelock可以阻止处于正常运行(active)或者空闲(idle)状态的系统进入睡眠等低功耗状态。
直到所持有的wakelock全部被释放,系统才能进入睡眠等低功耗的状态。
wakelock有加锁和解锁两种状态,加锁的方式有两种,一种是永久的锁住,这样的锁除非显示的放开,是不会解锁的。
第二种是超时锁,这种锁会锁定系统一段时间,如果这个时间过去了,这个锁会自动解除。
锁有两种类型:●WAKE_LOCK_SUSPEND:这种锁会防止系统进入睡眠,这种锁可以具有WAKE_LOCK_AUTO_EXPIRE属性,具有这种属性的锁称为超时锁(timeout)。
●WAKE_LOCK_IDLE 这种锁不会影响系统的suspend,用于阻止系统持有锁的过程中进入low power的状态。
Android使用两条双向链表active_wake_locks[WAKE_LOCK_TYPE_COUNT]分别保存处于active 状态的suspend lock和idle lock;使用一条链表inactive_locks记录所有处于inactive状态的锁。
在系统启动的时候,会调用wakelocks_init函数来完成wakelock的初始化,但别的驱动程序也可以再单独创建自用的wakelock,这里初始化的是系统默认的wake lock以及该机制依赖的功能。
wakelocks_init函数做了以下事情:●初始化acitive_wake_locks链表●调用wake_lock_init初始化main_wake_lock, unknown_wakeup以及deleted_wake_locks(如果CONFIG_WAKELOCK_STAT被定义)三个WAKE_LOCK_SUSPEND型的锁●调用platform_device_register和platform_driver_register注册平台设备和驱动。
●创建suspend_work_queue工作队列,这会在wake_unlock解锁的时候用到。
wake_lock_init()函数初始化一个锁,就是初始化表示一个wakelock的数据结构struct wake_lock,并将其挂到inactive_locks链表上。
●加锁有两个函数:wake_lock(struct wake_lock *lock)和ake_lock_timeout(struct wake_lock*lock, long timeout),前者是没有指定过期时间的(除非显式调用wake_unlock否则永远锁住); 后者是有过期时间的(时间过期后,锁会解锁,即使没有显式调用wake_unlock)。
这两个函数内部都是通过调用wake_lock_internal()函数完成具体功能的。
wake_lock_internal()函数流程:●判断锁的类型是否有效,即是否为WAKE_LOCK_SUSPEND或WAKE_LOCK_IDLE某一种●如果定义了CONFIG_WAKELOCK_STAT, 则更新struct wake_lock里面的用于统计锁信息的成员变量●将锁从inactive_locks链表上取下,加到active_wake_locks链表上。
如果是超期锁则设置锁的flag|=WAKE_LOCK_AUTO_EXPIRE,否则取消WAKE_LOCK_AUTO_EXPIRE标志。
如果锁是WAKE_LOCK_SUSPEND型的,则继续下面的步骤。
●对于WAKE_LOCK_SUSPEND型的锁如果它是超期锁,则调用has_wake_lock_locked函数检查所有处于活动状态的WAKE_LOCK_SUSPEND锁(即在active_wake_locks链表上的WAKE_LOCK_SUSPEND锁,或者说当前被加锁了的WAKE_LOCK_SUSPEND锁),是否有超期锁已经过期,如果有则把过期超期锁从active_wake_locks上删除,挂到inactive_locks上。
同时它还检查链表上有没有非超期锁,如果有则直接返回-1,否则它最终返回的是所有超期锁过期时间的最大值●如果has_wake_lock_locked函数返回的是-1(表示当前活动锁有非超时锁)或者0(表示所有活动锁都是超时锁,且全已经超时),则删除expire_timer,并排队一个suspend工作到suspend_work_queue工作队列,最终系统会suspend其handler expire_wake_locks是实现超时锁机制的关键,定时器的expire时间被设置为当前所有处于活动状态的WAKE_LOCK_SUSPEND锁超时值的最大值,如果没有超时锁则设置stop 它。
当定时器expire的时候,会在其处理函数expire_wake_locks中调用has_wake_lock_locked 函数把所有过期的锁全部解锁,并排队一个suspend工作到suspend_work_queue工作队列,最终系统会suspend。
suspend函数完成suspend系统的任务,它是suspend_work这个工作的处理函数,suspend_workk排队到suspend_work_queue工作队列中,最终系统会处理这个work,调用其handler即suspend函数。
该函数首先sync文件系统,然后调用pm_suspend(request_suspend_state),接下来pm_suspend()就会调用enter_state()来进入linux的suspend流程。
解锁由wake_unlock函数实现。
该函数首先将该锁从active链表转移到inactive链表中。
如果是WAKE_LOCK_IDLE锁,就结束退出了。
如果是WAKE_LOCK_SUSPEND锁,则继续查看所有处于active状态并且具有自动过期属性的锁(超时锁),遍历找到最晚过期时间,然后修改expire_timer的到期时间(expire_timer到期后会调用suspend函数使系统进入suspend状态);否则,如果存在一个不具有auto-expire属性的锁(非超期锁),则会导致expire_timer 被stop(或者说不再处于active的工作状态)。
另外,如果检查的过程中发现所有锁均处于过期状态,则直接使用queue_work启动suspend过程。
userwakelock.c文件实现的是wakelock机制的sysfs 接口,用户可以通过这个接口操作锁,加锁或解锁。