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 的功能很直白,“系統沒有事情在做”的時候,就將系統切換到低功耗狀態。
-
嵌入式
+關注
關注
5093文章
19178瀏覽量
307703 -
Android
+關注
關注
12文章
3945瀏覽量
127944 -
接口
+關注
關注
33文章
8694瀏覽量
151925 -
Linux
+關注
關注
87文章
11345瀏覽量
210403
發布評論請先 登錄
相關推薦
評論