wakeup events framework 就包括 3 大功能:
1. 解決內(nèi)核空間同步問題(framework 的核心功能)
2. 解決用戶空間同步問題的情景1(wakeup count 功能)
3. 解決用戶空間同步問題的情景2(wake lock 功能)
wakeup events framework architecture
wakeup count 的功能
wakeup count 的功能是 suspend 同步,實現(xiàn)思路是這樣的:
1)任何想發(fā)起電源狀態(tài)切換的實體(可以是用戶空間電源管理進程,也可以是內(nèi)核線程,簡稱 C),在發(fā)起狀態(tài)切換前,讀取系統(tǒng)的 wakeup counts(該值記錄了當(dāng)前的 wakeup event 總數(shù)),并將讀取的 counts 告知 wakeup events framework。
2)wakeup events framework 記錄該 counts 到一個全局變量中(saved_count)。
3)隨后 C 發(fā)起電源狀態(tài)切換(如 STR),執(zhí)行 suspend 過程。
4)在 suspend 的過程中,wakeup events framework 照舊工作(直到系統(tǒng)中斷被關(guān)閉),上報 wakeup events,增加 wakeup events counts。
5)suspend 執(zhí)行的一些時間點,會調(diào)用 wakeup events framework 提供的接口(pm_wakeup_pending),檢查是否有 wakeup 沒有處理。
6)檢查邏輯很簡單,就是比較當(dāng)前的 wakeup counts 和 saved wakeup counts(C 發(fā)起電源狀態(tài)切換時的 counts),如果不同,就要終止 suspend 過程。
wakelocks
wakelocks 是一個有故事的功能。
wakelocks 最初出現(xiàn)在 Android 為 linux kernel 打的一個補丁集上,該補丁集實現(xiàn)了一個名稱為“wakelocks”的系統(tǒng)調(diào)用,該系統(tǒng)調(diào)用允許調(diào)用者阻止系統(tǒng)進入低功耗模式(如 idle、suspend 等)。同時,該補丁集更改了 Linux kernel 原生的電源管理執(zhí)行過程(/kernel/power/main.c 中的 state_show 和 state_store),轉(zhuǎn)而執(zhí)行自定義的 state_show、state_store。
這種做法是相當(dāng)不規(guī)范的,它是典型的只求實現(xiàn)功能,不擇手段。就像國內(nèi)很多的 Linux 開發(fā)團隊,要實現(xiàn)某個功能,都不去弄清楚 kernel 現(xiàn)有的機制、框架,牛逼哄哄的猛干一番。最后功能是實現(xiàn)了,可都不知道重復(fù)造了多少輪子,浪費了多少資源。
kernel 的開發(fā)者是有原則的,不讓這種機制合并到 kernel 分支,直到 kernel 自身的 wakeup events framework 成熟后,這種僵局才被打破。因為 Android 開發(fā)者想到了一個壞點子:不讓合并就不讓合并唄,我用你的機制(wakeup source),再實現(xiàn)一個就是了。至此,全新的 wakelocks 出現(xiàn)了。
所以 wakelocks 有兩個,早期 Android 版本的 wakelocks 幾乎已經(jīng)銷聲匿跡了。本文關(guān)注在新的 wakelocks 上(/kernel/power/wakelock.c)
Android wakelocks
但是,我們還是提一下 Android wakelocks 的功能,這樣才能知道 kernel wakelocks 要做什么。Android wakelocks 提供的功能包括:
1)一個 sysfs 文件:/sys/power/wake_lock,用戶程序向文件寫入一個字符串,即可創(chuàng)建一個 wakelock,該字符串就是 wakelock 的名字。該 wakelock 可以阻止系統(tǒng)進入低功耗模式。
2)一個 sysfs 文件:/sys/power/wake_unlock,用戶程序向文件寫入相同的字符串,即可注銷一個 wakelock。
3)當(dāng)系統(tǒng)中所有的 wakelock 都注銷后,系統(tǒng)可以自動進入低功耗狀態(tài)。
4)向內(nèi)核其它 driver 也提供了 wakelock 的創(chuàng)建和注銷接口,允許 driver 創(chuàng)建 wakelock 以阻止睡眠、注銷 wakelock 以允許睡眠。
Kernel wakelocks
1)允許 driver 創(chuàng)建 wakelock 以阻止睡眠、注銷 wakelock 以允許睡眠:已經(jīng)由 wakeup source 取代。
2)當(dāng)系統(tǒng)中所有的 wakelock 都注銷后,系統(tǒng)可以自動進入低功耗狀態(tài):由 autosleep 實現(xiàn)。
3)wake_lock 和 wake_unlock 功能:就是將 wakeup source 開發(fā)到用戶空間訪問。
autosleep 的功能很直白,“系統(tǒng)沒有事情在做”的時候,就將系統(tǒng)切換到低功耗狀態(tài)。
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19126瀏覽量
305302 -
Android
+關(guān)注
關(guān)注
12文章
3936瀏覽量
127418 -
接口
+關(guān)注
關(guān)注
33文章
8605瀏覽量
151197 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209539
發(fā)布評論請先 登錄
相關(guān)推薦
評論