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 的功能很直白,“系统没有事情在做”的时候,就将系统切换到低功耗状态。
全部0条评论
快来发表一下你的评论吧 !