wakeup events framework三大功能介绍

描述

  wakeup events framework 就包括 3 大功能:

  1. 解决内核空间同步问题(framework 的核心功能)

       2. 解决用户空间同步问题的情景1(wakeup count 功能)

       3. 解决用户空间同步问题的情景2(wake lock 功能)

  wakeup events framework architecture

  wakeup count 的功能

  wakeup count 的功能是 suspend 同步,实现思路是这样的:

  1)任何想发起电源状态切换的实体(可以是用户空间电源管理进程,也可以是内核线程,简称 C),在发起状态切换前,读取系统的 wakeup counts(该值记录了当前的 wakeup event 总数),并将读取的 counts 告知 wakeup events framework。

  2)wakeup events framework 记录该 counts 到一个全局变量中(saved_count)。

  3)随后 C 发起电源状态切换(如 STR),执行 suspend 过程。

  4)在 suspend 的过程中,wakeup events framework 照旧工作(直到系统中断被关闭),上报 wakeup events,增加 wakeup events counts。

  5)suspend 执行的一些时间点,会调用 wakeup events framework 提供的接口(pm_wakeup_pending),检查是否有 wakeup 没有处理。

  6)检查逻辑很简单,就是比较当前的 wakeup counts 和 saved wakeup counts(C 发起电源状态切换时的 counts),如果不同,就要终止 suspend 过程。

  wakelocks

  wakelocks 是一个有故事的功能。

  wakelocks 最初出现在 Android 为 linux kernel 打的一个补丁集上,该补丁集实现了一个名称为“wakelocks”的系统调用,该系统调用允许调用者阻止系统进入低功耗模式(如 idle、suspend 等)。同时,该补丁集更改了 Linux kernel 原生的电源管理执行过程(/kernel/power/main.c 中的 state_show 和 state_store),转而执行自定义的 state_show、state_store。

  这种做法是相当不规范的,它是典型的只求实现功能,不择手段。就像国内很多的 Linux 开发团队,要实现某个功能,都不去弄清楚 kernel 现有的机制、框架,牛逼哄哄的猛干一番。最后功能是实现了,可都不知道重复造了多少轮子,浪费了多少资源。

  kernel 的开发者是有原则的,不让这种机制合并到 kernel 分支,直到 kernel 自身的 wakeup events framework 成熟后,这种僵局才被打破。因为 Android 开发者想到了一个坏点子:不让合并就不让合并呗,我用你的机制(wakeup source),再实现一个就是了。至此,全新的 wakelocks 出现了。

  所以 wakelocks 有两个,早期 Android 版本的 wakelocks 几乎已经销声匿迹了。本文关注在新的 wakelocks 上(/kernel/power/wakelock.c)

  Android wakelocks

  但是,我们还是提一下 Android wakelocks 的功能,这样才能知道 kernel wakelocks 要做什么。Android wakelocks 提供的功能包括:

  1)一个 sysfs 文件:/sys/power/wake_lock,用户程序向文件写入一个字符串,即可创建一个 wakelock,该字符串就是 wakelock 的名字。该 wakelock 可以阻止系统进入低功耗模式。

  2)一个 sysfs 文件:/sys/power/wake_unlock,用户程序向文件写入相同的字符串,即可注销一个 wakelock。

  3)当系统中所有的 wakelock 都注销后,系统可以自动进入低功耗状态。

  4)向内核其它 driver 也提供了 wakelock 的创建和注销接口,允许 driver 创建 wakelock 以阻止睡眠、注销 wakelock 以允许睡眠。

  Kernel wakelocks

  1)允许 driver 创建 wakelock 以阻止睡眠、注销 wakelock 以允许睡眠:已经由 wakeup source 取代。

  2)当系统中所有的 wakelock 都注销后,系统可以自动进入低功耗状态:由 autosleep 实现。

  3)wake_lock 和 wake_unlock 功能:就是将 wakeup source 开发到用户空间访问。

  autosleep 的功能很直白,“系统没有事情在做”的时候,就将系统切换到低功耗状态。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分