Android suspend底層流程解析

剛做的一個項目,在Android上實現快速啓動,先將原理敘述如下,當用戶長按電源鍵,選擇“下次開機快速啓動”後,系統啓動hibernate to disk的流程:

1. Power manager使用命令"echo disk > /sys/power/state"啓動kernel suspend流程。其實Android進入省電模式(按鍵背景燈、屏幕關閉等)也是通過這種方式啓動的,命令是"echo mem > /sys/power/state"

2. 上面命令會調用Power driver kernel/main.c中的sysfs state屬性的state_store函數,在該函數中分別針對不同類型的suspend進行不同的處理。

3. 如果是suspend to disk會調用hibernate;

4. 如果是early suspend會調用request_suspend_state進行android的early suspend,它是android引入的新的省電機制,大致的動作就是通過suspend_work_queue調用early_suspend,該函數會調用early_suspend_handlers鏈表上每個節點的suspend方法,這些節點是各驅動在初始化時註冊進來的,節點也有從省電狀態進入正常狀態的resume方法,不同設備驅動實現各自的兩個函數,另外在每個節點也有對應level,該值決定了suspend、resume時的各節點被調用的順序。搜索整個driver,發現synaptics的touch screen,iMX的framebuffer,mddi,console等幾個驅動實現了early suspend機制。early_suspend函數最後會調用sys_sync,並釋放main_wake_lock。當wake lock的全部持有者都釋放後,會觸發linux 標準的suspend流程。

5. linux標準的suspend流程實現在kernel/power/suspend.c中enter_state函數,主要動作爲:1)凍結進程 2)調用所有設備的suspend方法 3)停用cpu從核 4)調用所有系統設備的suspend方法 5)主核休眠

該圖轉自MyArrow博客,http://blog.csdn.net/myarrow/article/details/8837756


下一篇詳細解釋hibernation的流程,很複雜,ready to go!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章