linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构
Linux電源管理(2)_Generic PM之基本概念和軟件架構
作者:wowo 發布于:2014-5-13 19:24
分類:電源管理子系統
1. 前言
這里的Generic PM,是蝸蝸自己起的名字,指Linux系統中那些常規的電源管理手段,包括關機(Power off)、待機(Standby or Hibernate)、重啟(Reboot)等。這些手段是在嵌入式Linux普及之前的PC或者服務器時代使用的。在那個計算機科學的蠻荒時代,人類在摩爾定律的刺激下,孜孜追求的是計算機的計算能力、處理性能,因此并不特別關心Power消耗。
在這種背景下發展出來的Linux電源管理機制,都是粗放的、靜態的、被動的,具體請參考下面的介紹。
2. Generic PM在Linux操作系統中的表現形式
Linux操作系統中,和Generic PM有關的操作如下面圖片:
該圖片截取自蝸蝸使用的“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主要處理關機、重啟、冬眠(Hibernate)、睡眠(Sleep,在Kernel中也稱作Suspend)。在內核中,大致可以分為三個軟件層次:
API Layer,用于向用戶空間提供接口,其中關機和重啟的接口形式是系統調用(在新的內核中,關機接口還有一種新方式,具體講到的時候再說),Hibernate和Suspend的接口形式是sysfs。
PM Core,位于kernel/power/目錄下,主要處理和硬件無關的核心邏輯。
PM Driver,分為兩個部分,一是體系結構無關的Driver,提供Driver框架(Framework)。另一部分是具體的體系結構相關的Driver,這也是電源管理驅動開發需要涉及到的內容(圖中紅色邊框的模塊)。
另外,電源管理是一個系統級的模塊,因而會涉及到設備模型、進程管理等等方方面面的內容,我們可以在后續具體的分析過程中,細細品味。
原創文章,轉發請注明出處。蝸窩科技,www.wowotech.net。
評論:
qkpidan
2019-12-06 13:55
生日:
MAGIC2???? 28.12.1969
MAGIC2A???? 5.12.1996
MAGIC2B??16.04.1998
MAGIC2C?? 20.11.2000
henry
2019-10-30 20:10
勘誤:
STR: suspend to RAM
STD: suspend to Disk
2019-10-28 13:52
猛一查STD和STR還查不到,一想:
STD:sleep to disk
STR:sleep to ram
recome
2018-11-05 14:23
不知道你們還維護不? user端,我看打開/sys/power/autosleep??這端口,并且write 寫值就可以了,但是在內核中搜索沒有看見創建節點的程序,還有就是write的接口實現。
recome
2018-11-05 14:52
@recome:一般的驅動在內核中創建了節點,和讀寫操作,但是在內核中沒有找到,請問一下,這是怎么創建的呢?
recome
2018-09-26 17:57
請問一下,autosleep 函數裏面沒有時間參數,那麼,怎麼知道多長時間sleep呢?
2018-09-26 18:45
@recome:kernel的autosleep是“事件”驅動的,不是“時間”驅動。
簡單的說,沒事兒的時候,就睡,有事兒就醒,不管“白天還是黑夜”。
2018-02-01 11:28
看到上面Hibernate的解釋,應該就是和虛擬機系統的掛起一樣
周末花褲衩
2017-09-21 20:17
wowo大神,能介紹一下什么是early suspend/late resume機制嗎
2017-09-22 09:10
@周末花褲衩:early suspend/late resume是之前android使用的、已經過時了的一個技術,我們不會再花時間去介紹它啦……
edwin
2015-09-01 11:03
wowo,請教一下在新的內核中已經不再使用early suspend/late resume 機制了,那么以前用此機制來實現的驅動suspend/resume功能現在用什么取代呢?
2015-09-01 12:26
@edwin:應該使用Runtime PM。
2015-06-27 11:02
小白弱問一下,體系結構無關和相關的driver分別是對應哪個目錄?
體系結構無關的Driver,提供Driver框架(Framework),是指的/drivers/base/power/*?
體系結構相關的driver,是指soc外面的外設嗎?
謝謝!
2015-06-27 15:54
@koala:是的,你說的很正確~~~
2015-04-30 22:20
站在代碼外邊分析問題。高屋建瓴。
1 2
發表評論:
昵稱
郵件地址 (選填)
個人主頁 (選填)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下screen版本,在Linu
- 下一篇: linux shell 网盘,linux