1. 程式人生 > >Linux電源管理(2)_Generic PM之基本概念和軟體架構

Linux電源管理(2)_Generic PM之基本概念和軟體架構

1. 前言

這裡的Generic PM,是蝸蝸自己起的名字,指Linux系統中那些常規的電源管理手段,包括關機(Power off)、待機(Standby or Hibernate)、重啟(Reboot)等。這些手段是在嵌入式Linux普及之前的PC或者伺服器時代使用的。在那個電腦科學的蠻荒時代,人類在摩爾定律的刺激下,孜孜追求的是計算機的計算能力、處理效能,因此並不特別關心Power消耗。

在這種背景下發展出來的Linux電源管理機制,都是粗放的、靜態的、被動的,具體請參考下面的介紹。

2. Generic PM在Linux作業系統中的表現形式

Linux作業系統中,和Generic PM有關的操作如下面圖片:

Generic PM在Linux作業系統中的表現形式

該圖片擷取自蝸蝸使用的“Linux ubuntu 2.6.32-38”系統,共有3部分組成:

第1部分是系統關機、重啟等操作的介面,共包含Hibernate、Restart、Shutdown三個操作選項;

2、3部分是“電源管理屬性”設定,所謂的電源管理屬性,可以配置系統在不同供電模式下(如AC Power、Battery等,由於蝸蝸的機器是PC機,因此就沒有電池供電的選項),處於Inactive狀態多久後,系統關閉Display,或者進入Sleep狀態。

本文將會圍繞上面提到的各個名詞,講述它們的意義、在核心中的實現方式。開始之前,先解釋一下這些詞彙的意義。

Shutdown,很好理解,就是關機的意思。同時意味著不再使用計算機

Restart,也很好理解,就是重啟系統的意思。重啟的過程,不再使用計算機

Hibernate,可翻譯為冬眠。

聽到“冬眠”這個詞,您是否眼前一亮?蝸蝸在“Linux電源管理(1)_整體架構”中解釋電源管理的概念的時候,提到過,動物冬眠就是大自然所設計的電源管理方式的一種。在動物界,冬眠是指動物們(通常針對溫血動物)通過降低體溫的方式而進入的類似昏睡的生理狀態,在這種狀態下,需要消耗的能量較少,從而可以達到省電(能量)的目的。

而在計算機界,設計師們也借用了“冬眠”的概念,在不需要使用計算機時

將它當前的所有現場(執行的程式、顯示器顯示的影象、正在播放的聲音等)儲存到一些斷電不會丟失的儲存器中(如硬碟中),然後將計算機關閉。重新開啟後,系統會從儲存器中將關閉前的現場讀取出來並恢復,此時從使用者的角度看,計算機就像沒有關閉過一樣。

如果把計算機界的“冬眠”搬到動物界,會是這樣的場景:一隻恐龍,邁著八字步,吃著香蕉,晃晃悠悠的走在樹林中。然後,無聊的孫猴子來了,喊了一聲“定!”,恐龍就定在那裡了。再然後,一萬年過去了,無聊的孫猴子又來了,喊了一聲“動!”,恐龍繼續邁著八字步,吃著香蕉,就像什麼事情都沒有發生一樣。

Sleep,睡眠。這個詞也是從生物界學來的。想象一下“睡眠”和“冬眠”的區別?“睡眠”睡的輕,隨時都可以醒來。在計算機中,Hibernate需要把現場儲存到斷電不丟失的儲存器中,並在醒來的時候讀回來,這些可能需要較長的時間(因為斷電不丟失儲存器的訪問速度都比較慢)。如果想快點,就把現場儲存在記憶體中就可以了,這就是Sleep。不過這是要付出代價的,記憶體要保持供電,這就要消耗能量,魚與熊掌不可兼得啊!

Auto Sleep,檢視上面圖片第3個部分,可以設定系統“處於Inactive狀態多久後,自動進入Sleep狀態”。比如我正在寫這篇文章,然後被老婆喊去跪搓衣板了,一跪兩個小時。這兩個小時內,計算機不再被使用,如果不進入Sleep狀態,將會消耗很多能量。為了避免這無謂的消耗,可以讓系統在符合條件時(如20分鐘不使用),自動睡下去。

Auto put display to Sleep,原理類似,只是操作的物件是Display(顯示器等)。

 

注:

不知讀者有沒有注意到,蝸蝸在解釋上面的詞彙時,一直在用紅色字型強調“計算機不再使用”。這就是Generic PM和Runtime PM的本質區別,即,在使用者的主觀意願上,是否需要暫停使用計算機(哪怕短短的一段時間)。

這也是Generic PM在傳統的計算機作業系統中被廣泛使用的原因,因為那個時候對計算機的使用大多是主動方式。而對當前的移動互聯來說,就非常不合時宜了,因為人們需要移動裝置實時線上、實時接收被動事件(如來電),也就不可能主觀地暫停使用(哪怕短短的一段時間)。這種最終需求的差異,會導致在軟體設計上有很大的差別,正因為如此,Runtime PM的出現和儘快成熟,才顯得格外重要。

3. Generic PM的軟體架構

在介紹完Generic PM的基本概念後,我們來看一下它在Linux核心中的整體實現,並抽象出簡單的軟體架構,以便再後續的文章中,對Generic PM的主要組成部分進行更為細緻的分析。具體如下:

Generic PM Architecture

根據上面的描述可知,Generic PM主要處理關機、重啟、冬眠(Hibernate)、睡眠(Sleep,在Kernel中也稱作Suspend)。在核心中,大致可以分為三個軟體層次:

API Layer,用於向用戶空間提供介面,其中關機和重啟的介面形式是系統呼叫(在新的核心中,關機介面還有一種新方式,具體講到的時候再說),Hibernate和Suspend的介面形式是sysfs。

PM Core,位於kernel/power/目錄下,主要處理和硬體無關的核心邏輯。

PM Driver,分為兩個部分,一是體系結構無關的Driver,提供Driver框架(Framework)。另一部分是具體的體系結構相關的Driver,這也是電源管理驅動開發需要涉及到的內容(圖中紅色邊框的模組)。

另外,電源管理是一個系統級的模組,因而會涉及到裝置模型、程序管理等等方方面面的內容,我們可以在後續具體的分析過程中,細細品味。