linux內核睡眠狀態解析

1. 系統睡眠狀態

  睡眠狀態是整個系統的全局低功耗狀態,在這種狀態下,用戶空間的代碼不能被執行而且整個系統的活動明顯被下降html

  1.1 被支持的睡眠狀態 

      取決於所運行平臺的能力和配置選項,Linux內核能支持四種系統睡眠狀態,包括休眠和多達三種系統掛起的變量;,支持的睡眠狀態以下:架構

 

      1.1.1 休眠到空閒狀態(Suspend-to-Idle)

          這是一種普通、純軟件、輕量級的系統掛起變量(也被稱爲S2I或S2Idle)。與運行時空閒狀態相比,經過中止用戶空間程序的運行、暫停計時、將全部的輸入輸出設備設置爲低功耗狀態能下降更多能耗,系統在休眠狀態下,處理器一直運行在深度空閒狀態。ide

          系統被內部中斷喚醒,所以理論上任何在工做狀態下能產生中斷的設備也能針對S2Idle狀態被設置爲喚醒設備。ui

          這種狀態能被用在不支持待機或休眠到內存的平臺上,它能被用在更深的系統休眠變種中以減小進入正常工做狀態的延遲。spa

          這種狀態在內核選項CONFIG_SUSPEND被設置的時候老是被支持。命令行

      1.1.2 待機狀態(Standby)

          若是支持這種狀態,提供適度的但確實下降了功耗的方式,同時提供一種相對簡單的方式恢復到正常工做狀態,所以系統很容易地回到原來中止執行的地方繼續運行。code

          除了凍結用戶空間、暫停計時和將全部輸入輸出設備置於低功耗狀態(這些是在suspend to idle狀態作的),未啓動的cpu直接被置爲脫機狀態,而且在轉換到此狀態的過程當中全部的低級系統功能都被暫停。orm

          所以,這種狀態相對suspend to idle狀態能節省更多的電力,可是切換到正常工做狀態的時間一般會更長。htm

          相比suspend to idle狀態,能從這種狀態喚醒系統的設備集就少了不少,可能須要依賴平臺適當地設定喚醒功能blog

          若是內核選項CONFIG_SUSPEND被設定,那麼這種狀態就被支持,支持被帶有核心繫統suspend子系統的平臺註冊。

          在基於ACPI的系統中,這種狀態被映射爲由ACPI定義的S1系統狀態

      1.1.3 掛起到內存(Suspend-to-RAM)

          若是支持這種狀態(也被稱爲STR/S2RAM),它能明顯節能,由於在系統中,除了內存(內存被置於自刷新模式來保持其中的內容),任何東西都被置於低功耗狀態,進入待機狀態被執行的全部操做在轉換到這種狀態下也一樣被執行,可能會根據平臺的能力來執行其餘操做。

          特別的是,在基於ACPI的系統上,在S2RAM狀態切換的過程當中,內核將控制權交給平臺固件(BIOS)做爲最後的一個步驟,一般致使關掉一些不被內核直接控制的更低級的組件。

          設備和cpu的狀態被保存在內存中,全部的設備被掛起並置於低功耗狀態,在許多場景下,在進入S2RAM時全部的外圍總線掉電,所以設備必需具有處理回退到正常狀態的能力。、

          在基於ACPI的系統上S2RAM要求在平臺固件中有一些最小化啓動代碼來切換到正常工做狀態。在其它平臺也多是這種狀況。

          比起前兩種狀態,能從S2RAM喚醒系統的設備集一般能節約更多的電力,而且可能須要依賴平臺適當地設定喚醒功能。

          若是CONFIG_SUSPEND被配置,那麼S2RAM就被支持,支持被帶有核心繫統suspend子系統註冊。在基於ACPI的系統上,它被映射爲由ACPI定義的S3系統狀態。

      1.1.4 休眠(Hibernation)

          這種狀態(也被稱爲Suspend-to-Disk/STD)提供最佳節能效果,甚至在不支持系統掛起的低級平臺上也可使用。然而,它要求爲底層cpu架構提供一些喚醒系統的低級代碼

          休眠狀態與任何系統掛起的變種都明顯不同。它須要三種系統狀態都改變的狀況下才能將系統置於休眠狀態,兩種系統狀態改變才能使系統恢復到正常運行狀態。

          首先,當休眠被觸發的時候,內核中止全部的系統活動而且建立一個內存快照寫入磁盤。

          接下來,系統運行到快照鏡像能被保存的狀態下,鏡像被寫入,最後系統進入目標低功耗狀態(除了一些喚醒設備,幾乎全部硬件組件,包括內存都被斷電)。

          一旦快照被寫入,系統可能進入一種超低功耗狀態(好比ACPI S4),也可能簡單的將本身斷電。斷電意味着最小功耗,它容許這種機制工做在任何系統之上。然而進入超低功耗可能容許使用額外的系統喚醒方式(如:鍵盤上的按鍵或打開筆記本上蓋)

          在喚醒以後,控制權交給運行一個啓動引導器(啓動一個全新的內核實例)的平臺固件(控制權可能直接交給啓動引導器,取決於系統配置,可是它都會建立一個將被啓動的內核實例)。新的內核實例(也被稱做恢復內核)尋找在磁盤中的休眠鏡像,若是被找到,就將鏡像加載到內存中

          接下來,在系統中的全部活動被中止,恢復內核以鏡像的內容覆蓋本身,而且跳轉到存儲在鏡像中的原內核(也被稱爲鏡像內核)所在的特殊蹦牀區域,這是特殊架構相關的低級代碼被提供的區域。

          最後鏡像內核恢復系統到預休眠狀態而且容許用戶空間程序再次被運行

          若是CONFIG_HIBERNATION選項被使能,那麼休眠功能就被支持。然而,這個選項只能在支持包括系統恢復的低級代碼的指定cpu架構被設置。

2. 基本的系統掛起休眠sysfs接口

  下面位於/sys/power目錄下的文件能被用在用戶空間來對睡眠狀態進行控制。

  2.1 state

這個文件包含一個表明被內核支持的睡眠狀態的字符串列表。寫字符串中的任何一個都會導致內核開始轉換系統到由字符串所表明的睡眠狀態,控制系統的睡眠狀態。

特別是,字符串"disk","freeze" 和"standby"表示休眠,掛起到空閒和待。睡眠狀態,個別的字符串「mem"被解釋爲根據下文提到的mem_sleep文件內容進行處理。

若是內核不支持任何系統睡眠狀態,這個文件不會顯示。

  2.2 mem_sleep
   這個文件包含一個表示支持系統掛起變量的字符串列表,而且容許用戶空間選擇與」mem"相關的變量,控制系統掛起的操做模式。

這個字符串可能在這個文件中顯示爲"s2idle","shallow"和「deep"。字符串"s2idle"老是表明掛起到空閒,而且按照慣例,」shallow"和"deep"表明待機和掛起到內存。

將列出來的字符串中的其中一個寫到這個文件都會導致由它表明的系統掛起變量與state文件中的「mem"字符串相關聯。表明當前與在state文件中的」mem「字符串相關聯的掛起變量被列在方框裏。

  2.3 disk
   這個文件包含一個表明不一樣操做的字符串列表,在休眠鏡像被保存以後這些操做被執行,控制系統掛起到磁盤的操做模式。可能的選項以下:
   2.3.1  platform
      把系統置於超低功耗狀態(如ACPI S4),使額外的喚醒選項可用,而且可能容許在喚醒以後平臺固件作一個簡化的初始化。
    2.3.2 shutdown
      關掉系統。
   2.3.3 reboot
      重啓系統。
   2.3.4 suspend 
      混合系統掛起。將系統置於由mem_sleep文件指定的掛起睡眠狀態。若是系統成功被從那種狀態喚醒,跳過休眠鏡像並繼續執行,不然使用鏡像恢復以前系統的狀態
   2.3.5 test_resume
      診斷操做。加載鏡像,就像是系統剛被從休眠狀態喚醒,當前運行的內核實例是一個恢復內核而且接着是完整系統的恢復。

寫這些列出來的字符串中的一個將會導致相應的選項被選中。

當前選中的選項被顯示在方框中,意味着由寫」disk"到/sys/power/state觸發的下一次休眠在建立和保存鏡像以後由它指定的操做將被指定

若是內核不支持,這個文件不顯示

3. 總結

  根據以上內容,由兩種方式使系統進入掛起到空閒狀態。第一個是直接寫"freeze"到/sys/power/state。第二個是寫「s2idle"到/sys/power/mem_sleep,而後寫"mem"到/sys/mem/state。

  一樣地,若是那種狀態被平臺支持,有兩種方式使系統進入待機狀態(在那種情形下,相應的寫到控制文件中的字符串是"standby"或」shallow"和「mem")。

  然而,只有一種方式使系統進入掛起到內存狀態(寫"deep"到/sys/power/mem_sleep,而後寫"mem" 到/sys/power/state)。

  默認的掛起變量(如:不寫任何東西到/sys/pwer/mem_sleep)要麼是」deep"(在大多數支持掛起到內存的系統上),要麼是「s2idle」,可是它能經過在命令行指定「mem_sleep_default」參數而被覆蓋。

  在一些基於ACPI的系統上,取決於ACPI表種的系統,即便掛起到內存被支持,默認也多是「s2idle"

 

 

4. 參考資料

  4.1

  4.2 這裏 

相關文章
相關標籤/搜索