Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 電源管理之android系統suspend to disk的實現(二)

電源管理之android系統suspend to disk的實現(二)

編輯:關於Android編程

4、Linux Suspend 的流程

相關的文件下面是文件的路徑:android4.0/kernel/kernel/power/

接下來讓我們詳細的看一下Linux是怎麼休眠/喚醒的:

(1)用戶對於/sys/power/state的讀寫會調用到main.c中的state_store(),用戶可以寫入constchar * const pm_state[] 中定義的字符串,比如"mem","standby","disk","on".

(2)然後state_store()會首先檢測是不是為disk,如若是disk則調用hibernate();否則調用enter_state(),它們首先會檢查一些狀態參數,然後同步文件系統.。

(3)准備, 凍結進程

當進入到suspend_prepare()中以後,它會給suspend分配一個虛擬終端來輸出信息,然後廣播一個系統要進入suspend的Notify,關閉掉用戶態的helper進程,然後一次調用suspend_freeze_processes()凍結所有的進程,這裡會保存所有進程當前的狀態,也許有一些進程會拒絕進入凍結狀態,當有這樣的進程存在的時候,會導致凍結失敗,此函數就會放棄凍結進程,並且解凍剛才凍結的所有進程。

(4)讓外設進入休眠

現在,所有的進程(也包括workqueue/kthread)都已經停止了,內核態人物有可能在停止的時候握有一些信號量,所以如果這時候在外設裡面去解鎖這個信號量有可能會發生死鎖,所以在外設的suspend()函數裡面作lock/unlock鎖要非常小心,這裡建議設計的時候就不要在suspend()裡面等待鎖.而且因為suspend的時候,有一些Log是無法輸出的,所以一旦出現問題,非常難調試。

(5)然後kernel在這裡會嘗試釋放一些內存。

(6)最後會調用suspend_devices_and_enter()來把所有的外設休眠,在這個函數中,如果平台注冊了suspend_pos(通常是在板級定義中定義和注冊),這裡就會調用suspend_ops->begin(),然後driver/base/power/main.c中的device_suspend()->dpm_suspend()會被調用,他們會依次調用驅動的suspend()回調來休眠掉所有的設備。

注:suspend_ops是板級的電源管理操作,通常注冊在文件arch/xxx/mach-xxx/pm.c中。

(7)當所有的設備休眠以後suspend_enter()調用suspend_ops->prepare()會被調用,執行device_prepare這個函數通常會作一些准備工作來讓板機進入休眠.接下來Linux,在多核的CPU中的非啟動CPU會被關掉,通過注釋看到是避免這些其他的CPU造成racecondion,接下來的以後只有一個CPU在運行了,核心設備的停止。

(8)接下來suspend_enter()會被調用,這個函數會關閉archirq,調用device_power_down(),它會調用suspend_late()函數,這個函數是系統真正進入休眠最後調用的函數,通常會在這個函數中作最後的檢查.如果檢查沒問題,接 下來休眠所有的系統設備和總線,並且調用suspend_pos->enter()來使CPU進入省電狀態,這時候,就已經休眠了,代碼的執行也就停在這裡了。

5、Linux Resume流程

這裡只對suspend to mem的resume做介紹,對於disk的suspend和android很類似,我將會進行作圖解釋。下面就進行解釋:

如果在休眠中系統被中斷或者其他事件喚醒,接下來的代碼就會開始執行,這個喚醒的順序是和休眠的循序相反的,所以系統設備和總線會首先喚醒,使能系統中斷,使能休眠時候停止掉的非啟動CPU,以及調用suspend_ops->finish(),而且在suspend_devices_and_enter()函數中也會繼續喚醒每個設備,使能虛擬終端,最後調用suspend_ops->end().在返回到enter_state()函數中的,當suspend_devices_and_enter()返回以後,外設已經喚醒了,但是進程和任務都還是凍結狀態,這裡會調用suspend_finish()來解凍這些進程和任務,而且發出Notify來表示系統已經從suspend狀態退出,喚醒終端.到這裡,所有的休眠和喚醒就已經完畢了,系統繼續運行了.

個人觀點,有問題請斧正!!

轉載請注明出處:http://blog.csdn.net/wang_zheng_kai


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved