本系列將逐步介紹linux電源管理相關的知識,涉及到常見電源管理機制、linux電源管理機制、linux驅動中有關電源管理的相關接口、內核文檔中關於Linux電源管理架構文檔的分析。如下將以此來介紹相關內容,儘可能作到通俗易懂,條理清晰。html
電是如今社會的基礎設施,它點亮了整個世界。隨着移動互聯網的盛行,各類智能設備層出不窮,各類CPU和大屏幕,都在不斷折磨手機的電池,各類刺激的手遊,也在壓榨智能手機的電量。電池技術發展了這麼多年,在沒有新型儲能材料發現以前,考慮到總體的重量和發熱的可接受度,手機電池電量是不會有太大突破的。你們都知道Android是基於Linux開發的,要提升將來智能設備的續航時間,一方面須要提升電池容量,另外一方面,就要站在系統的視角上,像進程調度同樣,調度」電力」,在知足必定負載要求下,儘可能下降功耗,延遲設備使用時間。本篇文章將從下往上,依次介紹電源管理理念在Android智能手機上的設計與實現。linux
電源管理的對象是各類硬件設備驅動、系統框架中的各類應用調度等(這只是個人初步理解,有什麼不對的地方,請各位指教)。若是以平常生活爲例子來類比,一個成年人,每日三餐,就能夠全速工做一成天,吃飯就像充電同樣,先吃飯,再作事,體內葡萄糖等儲能物質就像電池同樣,在必定的能量供應下,幹越多的活,Boss越歡喜。只在須要馬兒跑時,才讓它吃草,這是電源管理的核心思想,它主要有兩點架構
1. 靈活的關閉暫時不使用的部分框架
2. 當須要從新使用那些已經關閉的部分,不能有長時間的等待,且切換狀態不能消耗太多能量。函數
電源管理使用的前提,是待控制的硬件支持節點功能,可以經過指令暫時關閉,操做系統須要支持電源管理,網站
在x86機器中,存在兩種電源管理方法,APM(Advanced Power Management,高級電源管理)和ACPI(Advanced Configuration and Power Interface ,高級配置和電源接口),這兩個標準不能同時容許在Linux上面,默認狀況下,Linux運行ACPI.須要注意,apm和acpi是互相沖突的兩個模塊,用戶在同一時間內只能加載其中之一操作系統
APM可讓設備處於Suspend(掛起狀態)或者Standby(待機狀態)和檢測電池容量,使用前提,須要BIOS和Linux核心支持,而且有apmd(APM的後臺服務程序)和apm等應用程序。它是基於BIOS的電源管理標準,提供了CPU和設備電源管理的功能,缺陷是對BIOS的過分依賴、新舊BIOS的兼容性、以及沒法判斷電源管理命令是由用戶發起仍是由BIOS發起,不適合新硬件的發展趨勢,爲了彌補APM的缺陷,人們提出了ACPI規範。.net
ACPI主要是將電源管理的主要執行者由BIOS轉換成操做系統,這樣能夠提供更大的靈活性以及可擴展性。ACPI除了APM的功能以外,還能夠單獨控制外設,有更加細粒化的節點控制。對於的應用程序有acpid和pmtools,下載連接在此設計
ACPI主要支持三種節點方式:orm
1. standby(S1模式),待機方式:顯示屏斷電,只是主機斷電,此時,敲任何鍵均可以恢復原來狀態
2. suspend to ram(STR,S3模式),掛起到內存,系統把當前信息儲存在內存中,只有CPU和內存等幾個關鍵部件,按電源鍵能夠恢復原來狀態
3. suspend to disk(STD,S4模式),掛起到硬盤,系統在關機前將當前數據先保存在內存中,再把內存寫入硬盤上的交換分區上,用戶下次按開機鍵開啓時,計算機直接從硬盤讀取數據,恢復原來狀態。
ACPI有六種工做狀態:
S0-->全部設備全開
S1-->只關閉CPU(中斷使能)
S2-->關閉CPU和總線時鐘
S5-->關機
在/sys/power目錄下
進入對於的模式,只往state輸入對於的狀態標誌位就能夠了。
因爲目前沒有從事有關低功耗方面的項目,因此只能是參考一下標準Linux休眠和喚醒機制分析(一~四)來理解,等之後有相關的機會,要抓緊深刻去體會。
struct platform_suspend_ops {
int (*valid)(suspend_state_t state);
int (*begin)(suspend_state_t state);
int (*prepare)(void);
int (*prepare_late)(void);
int (*enter)(suspend_state_t state);
void (*wake)(void);
void (*finish)(void);
void (*end)(void);
void (*recover)(void);
};
休眠喚醒的執行過程,依次是begin—>prepare—>prepare_late—>enter—>wake—>finish—>end.
休眠停留在enter函數中,喚醒和休眠是逆過程。
在Linux驅動層面,Linux電源管理子系統已經封裝好了統一的接口,各類類型的設備驅動只須要實現相關的接口函數,操做系統在它認爲合適的時候就會通知驅動完成這些操做。在通常設備驅動基礎之上,使用pm_register和pm_unregister進行註冊和註銷,使用pm_access進行休眠可行性檢測,使用pm_callback函數執行狀態通知後的回調響應,使用pm_dev_idle,用於檢測設備idle狀態機制。
對Android還不熟悉,只是知道它在標準的linux休眠喚醒的機制上,增長了early suspend和late resume兩種模式,具體分析待後續相關文章。
參考資料 :Linux acpi電源管理的高級應用
5 http://www.acpi.info:ACPI的官方網站,在上面能夠免費得到最新的ACPI規範。
6 http://acpi.sourceforge.net:Linux下支持ACPI項目網站。官方Linux內核中ACPI的版本實際上已經遠遠落後於最新的版本,由於linux穩定版中對任何新特性的加入都是很是當心謹慎的。你能夠從這裏下載最新的ACPI補丁。
7 Linux核心源代碼目錄:Documentation/power/,裏面有開發人員寫的一些關於電源管理在Linux上實現的文檔。