原文:
Linux電源管理(2)_Generic PM之基本概念和軟件架構
1. 前言
Linux系統中那些常規的電源管理手段,包括關機(Power off)、待機(Standby or Hibernate)、重啟(Reboot)等。這些手段是在嵌入式Linux普及之前的PC或者服務器時代使用的。在那個計算機科學的蠻荒時代,人類在摩爾定律的刺激下,孜孜追求的是計算機的計算能力、處理性能,因此并不特別關心Power消耗。
在這種背景下發展出來的Linux電源管理機制,都是粗放的、靜態的、被動的,具體請參考下面的介紹。
2. 常規的電源管理在Linux操作系統中的表現形式
Linux操作系統中,常規的電源管理的有關操作如下面圖片:
第1部分是系統關機、重啟等操作的界面,共包含Hibernate、Restart、Shutdown三個操作選項;
第2、3部分是“電源管理屬性”設置,所謂的電源管理屬性,可以配置系統在不同供電模式下(如AC Power、Battery等,由于蝸蝸的機器是PC機,因此就沒有電池供電的選項),處于Inactive狀態多久后,系統關閉Display,或者進入Sleep狀態。
本文將會圍繞上面提到的各個名詞,講述它們的意義、在內核中的實現方式。開始之前,先解釋一下這些詞匯的意義。
Shutdown,很好理解,就是關機的意思。同時意味著不再使用計算機。
Restart,也很好理解,就是重啟系統的意思。重啟的過程,不再使用計算機。
Hibernate,可翻譯為冬眠。
2.1 Hibernate
聽到“冬眠”這個詞,您是否眼前一亮?動物冬眠就是大自然所設計的電源管理方式的一種。在動物界,冬眠是指動物們(通常針對溫血動物)通過降低體溫的方式而進入的類似昏睡的生理狀態,在這種狀態下,需要消耗的能量較少,從而可以達到省電(能量)的目的。
而在計算機界,設計師們也借用了“冬眠”的概念,在不需要使用計算機時,將它當前的所有現場(執行的程序、顯示器顯示的圖像、正在播放的聲音等)保存到一些斷電不會丟失的存儲器中(如硬盤中),然后將計算機關閉。重新開啟后,系統會從存儲器中將關閉前的現場讀取出來并恢復,此時從使用者的角度看,計算機就像沒有關閉過一樣。如果把計算機界的“冬眠”搬到動物界,會是這樣的場景:一只恐龍,邁著八字步,吃著香蕉,晃晃悠悠的走在樹林中。然后,無聊的孫猴子來了,喊了一聲“定!”,恐龍就定在那里了。再然后,一萬年過去了,無聊的孫猴子又來了,喊了一聲“動!”,恐龍繼續邁著八字步,吃著香蕉,就像什么事情都沒有發生一樣。
2.2 Sleep
Sleep,睡眠。這個詞也是從生物界學來的。想象一下“睡眠”和“冬眠”的區別?“睡眠”睡的輕,隨時都可以醒來。在計算機中,Hibernate需要把現場保存到斷電不丟失的存儲器中,并在醒來的時候讀回來,這些可能需要較長的時間(因為斷電不丟失存儲器的訪問速度都比較慢)。如果想快點,就把現場保存在內存中就可以了,這就是Sleep。不過這是要付出代價的,內存要保持供電,這就要消耗能量,魚與熊掌不可兼得啊!
2.3 Auto Sleep
Auto Sleep,可以設置系統“處于Inactive狀態多久后,自動進入Sleep狀態”。比如我正在寫這篇文章,然后被老婆喊去跪搓衣板了,一跪兩個小時。這兩個小時內,計算機不再被使用,如果不進入Sleep狀態,將會消耗很多能量。為了避免這無謂的消耗,可以讓系統在符合條件時(如20分鐘不使用),自動睡下去。
Auto put display to Sleep,原理類似,只是操作的對象是Display(顯示器等)。
3.常規的電源管理的軟件架構
根據上面的描述可知,常規的電源管理主要處理關機、重啟、冬眠(Hibernate)、睡眠(Sleep,在Kernel中也稱作Suspend)。在內核中,大致可以分為三個軟件層次:
API Layer,用于向用戶空間提供接口,其中關機和重啟的接口形式是系統調用(在新的內核中,關機接口還有一種新方式,具體講到的時候再說),Hibernate和Suspend的接口形式是sysfs。
PM Core,位于kernel/power/目錄下,主要處理和硬件相關的核心邏輯。
PM Driver,分為兩個部分,一是體系結構相關的Driver,提供Driver框架(Framework)。另一部分是具體的體系結構相關的Driver,這也是電源管理驅動開發需要涉及到的內容(圖中紅色邊框的模塊)。
另外,電源管理是一個系統級的模塊,因而會涉及到設備模型、進程管理等等方方面面的內容,我們可以在后續具體的分析過程中,細細品味。