本系列將逐步介紹linux電源管理相關的知識,涉及到常見電源管理機制、linux電源管理機制、linux驅動中有關電源管理的相關接口、內核文檔中關於Linux電源管理架構文檔的分析。以下將以此來介紹相關內容,盡量做到通俗易懂,條理清晰。
電是現在社會的基礎設施,它點亮了整個世界。隨着移動互聯網的盛行,各種智能設備層出不窮,各種CPU和大屏幕,都在不斷折磨手機的電池,各種刺激的手游,也在壓榨智能手機的電量。電池技術發展了這么多年,在沒有新型儲能材料發現之前,考慮到整體的重量和發熱的可接受度,手機電池電量是不會有太大突破的。大家都知道Android是基於Linux開發的,要提高未來智能設備的續航時間,一方面需要提高電池容量,另一方面,就要站在系統的視角上,像進程調度一樣,調度”電力”,在滿足一定負載要求下,盡量降低功耗,延遲設備使用時間。本篇文章將從下往上,依次介紹電源管理理念在Android智能手機上的設計與實現。
電源管理的對象是各種硬件設備驅動、系統框架中的各種應用調度等(這只是我的初步理解,有什么不對的地方,請各位指教)。如果以日常生活為例子來類比,一個成年人,一日三餐,就可以全速工作一整天,吃飯就像充電一樣,先吃飯,再做事,體內葡萄糖等儲能物質就像電池一樣,在一定的能量供應下,干越多的活,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規范。
ACPI主要是將電源管理的主要執行者由BIOS轉換成操作系統,這樣可以提供更大的靈活性以及可擴展性。ACPI除了APM的功能之外,還可以單獨控制外設,有更加細粒化的節點控制。對於的應用程序有acpid和pmtools,下載鏈接在此
ACPI主要支持三種節點方式:
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上實現的文檔。