趙婉芳
摘 要:本文主要針對LINUX嵌入式系統的電源管理部分,分析了目前存在的主要的電源管理技術,重點研究了LINUX系統中當系統處于空閑狀態時負責電源管理的CPUIDLE模塊結構特點以及接口核心編碼,對基于LINUX系統的電源管理研究有一定的參考意義。
關鍵詞:LINUX系統;CPUIDLE模塊;接口
中圖分類號:TP368 文獻標識碼:A 文章編號:1671-2064(2017)22-0019-01
隨著移動互聯技術的發展,越來越多的便攜式移動終端被鏈接入網,對于移動終端的待機時長,安全性和穩定性提出了更高的要求,由于便攜式終端具有移動性強,體積小的特點,主要選擇使用電池供電,因此如何對具有電能消耗的嵌入式系統進行動態電源規劃管理,使得電池的壽命延長,最大限度的提升電能的使用率是該領域的研究熱點之一。
1 電源管理技術
目前電源管理技術主要分為靜態電源管理和動態電源管理兩種方式。靜態電源管理(SPM)主要使用在PC機端,目前有兩個工業標準,分別是高級電源管理APM和高級配置和電源管理接口ACPI,在兩個標準中都對靜態電源管理的實現進行了詳細的狀態定義。靜態電源管理的基本思想是把系統看作一個有限狀態機,其中包括多種工作狀態,每種工作狀態對應一個參數集合,這個參數集合表示的是該工作狀態下的功耗和性能參數等。系統可以根據自身的負載情況在各個工作狀態之間進行切換,也可以由用戶根據自身需要進行某個工作狀態的設置。當系統空閑,零負載或者負載比較小的時候,系統就會控制設備進入低性能狀態或者低功耗狀態,當系統請求較多,負載較高時,系統就會控制設備進入高性能狀態或者高功耗狀態。系統主要的四個狀態為:正常運行態,待機態,掛起態,深度休眠態。
動態電源管理(DPM)則廣泛應用于嵌入式移動終端設備,是一種系統級的功耗控制技術。動態電源管理的基本思想是設想系統由多個部件組成,每個部件可以有多種工作狀態,每種工作狀態對應著不同的電壓和時鐘頻率,因此有著不同的功率消耗。動態電源管理主要依據系統運行時各部件的具體負載情況,調整設備進入適合的功耗狀態,以此來節省功耗。由于動態管理系統隨時在繁忙和空閑等工作狀態之間進行切換,在進入和退出工作狀態時會帶來一定的延時,因此,如果狀態切換太過頻繁,帶來的延時會抵消節省功耗帶來的益處,降低系統性能。所以在動態電源管理中,最重要的是選擇好正確的管理策略,取得功耗和延時及性能之間的最佳平衡點。動態電源管理策略通常分為四種類型:(1)超時策略;(2)貪婪策略;(3)基于隨機過程策略;(4)預測策略。
2 CPUIDLE模塊
Linux系統中,支持CPU電源管理的模塊主要分為CpuIdle和cpufreq兩個模塊,當系統處于空閑狀態時主要由cpuidle framework來負責管理這種空閑狀態時的電源功耗,當 CPU活躍時,則由cpufreq模塊來負責管理電源的使用。在Linux內核中,cpuidle架構位于“drivers/cpuidle”文件夾中,分別包含三個模塊,分別為:cpuidle core:負責實現cpuidle framework的整體框架;cpuidle governors:負責管理方案的選?。?cpuidle drivers:定義每一個狀態的功耗和延遲分別是多少并負責idle機制的實現,即:如何進入idle狀態,什么條件下會退出,等等。以上三個模塊再結合位于kernel sched中的cpuidle entry,共同完成cpu的空閑管理,CpuIdle模塊的軟件結構如圖1所示。
在cpuidle架構中最重要的就是cpuidle governor部分,它負責具體電源管理方案的選取,因此電源管理是否有效,關鍵在于governor的配置使用。在當前的系統內核中CpuIdle模塊主要有兩個governor部件,分別為ladder governor和menu governor,它們分別使用于不同的系統中。對于現在的大部分系統,由于電源管理的原因以及延遲容忍度的處理,大多系統都是使用menu governor來選擇一個合適的空閑狀態。在menu governor工作過程中,其綜合考慮并計算系統切換不同狀態時所花費的功耗以及帶來的延遲容忍程度,最終來選擇所要進入的空閑狀態,因此該部分是cpuidle模塊中電源管理的核心部分,如何使用該部分成為系統處于空閑狀態是時能否達到最佳節能目的關鍵。
3 governor接口
Governor的使用是通過接口程序來實現的,cpuidle_ governor結接口程序通過cpuidle core使用struct cpuidle_ governor結構抽象得到,以下是governor的標準接口程序:
struct cpuidle_governor {
char name[CPUIDLE_NAME_LEN];
struct list_head governor_list;
int (*init) (struct cpuidle_device *dev);
void (*exit) (struct cpuidle_device *dev);
void (*scan) (struct cpuidle_device *dev);
int (*select) (struct cpuidle_device *dev);
void (*reflect) (struct cpuidle_device *dev);
struct module *owner;
};
其中,由cpuidle調用init()方法來初始化控制器;
調用exit()方法可以退出控制器;
scan()方法用于重新檢測設備所處的狀態。這樣能保證及時獲取到狀態的變化;
select() 方法在系統進入空閑狀態之前被調用,該方法根據當前系統的運行狀況,以及各個idle state的特性,選擇一個決策;
cpuidle_register_governor()方法和cpuidle_unregister _governor()方法用于注冊或注銷一個cpuidle governor;
reflect()是個回調函數,通過該函數告知governor,系統上一次所處的空閑狀態是哪一個(即系統從哪一個state回來)。
4 結語
隨著物聯網的發展,對于終端電源的能耗將要求越來越高,電源管理將會成為行業發展的關鍵點。本文主要分析了目前存在的靜態和動態電源管理技術,研究了LINUX系統中當系統處于空閑狀態時負責電源管理的CPUIDLE模塊結構特點以及接口核心編碼,對基于LINUX系統的電源管理方面研究有一定的參考意義。
參考文獻
[1]鄒思軼.嵌入式Linux設計與應用[M].北京:清華大學出版社,2001.
[2]許海燕,付炎.嵌入式系統技術和應用[M].北京:機械工業出版社,2002.