linux内核睡眠状态解析
1. 系統睡眠狀態
睡眠狀態是整個系統的全局低功耗狀態,在這種狀態下,用戶空間的代碼不能被執行并且整個系統的活動明顯被降低
1.1 被支持的睡眠狀態
取決于所運行平臺的能力和配置選項,Linux內核能支持四種系統睡眠狀態,包括休眠和多達三種系統掛起的變量;,支持的睡眠狀態如下:
1.1.1 休眠到空閑狀態(Suspend-to-Idle)
這是一種普通、純軟件、輕量級的系統掛起變量(也被稱為S2I或S2Idle)。與運行時空閑狀態相比,通過停止用戶空間程序的運行、暫停計時、將所有的輸入輸出設備設置為低功耗狀態能降低更多能耗,系統在休眠狀態下,處理器一直運行在深度空閑狀態。
系統被內部中斷喚醒,因此理論上任何在工作狀態下能產生中斷的設備也能針對S2Idle狀態被設置為喚醒設備。
這種狀態能被用在不支持待機或休眠到內存的平臺上,它能被用在更深的系統休眠變種中以減少進入正常工作狀態的延遲。
這種狀態在內核選項CONFIG_SUSPEND被設置的時候總是被支持。
1.1.2 待機狀態(Standby)
如果支持這種狀態,提供適度的但確實降低了功耗的方式,同時提供一種相對簡單的方式恢復到正常工作狀態,因此系統很容易地回到原來停止執行的地方繼續運行。
除了凍結用戶空間、暫停計時和將所有輸入輸出設備置于低功耗狀態(這些是在suspend to idle狀態做的),未啟動的cpu直接被置為脫機狀態,并且在轉換到此狀態的過程中所有的低級系統功能都被暫停。
因此,這種狀態相對suspend to idle狀態能節省更多的電力,但是切換到正常工作狀態的時間通常會更長。
相比suspend to idle狀態,能從這種狀態喚醒系統的設備集就少了很多,可能需要依賴平臺適當地設定喚醒功能
如果內核選項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.1platform 把系統置于超低功耗狀態(如ACPI S4),使額外的喚醒選項可用,并且可能允許在喚醒之后平臺固件做一個簡化的初始化。 2.3.2 shutdown 關掉系統。 2.3.3 reboot 重啟系統。 2.3.4 suspend 混合系統掛起。將系統置于由mem_sleep文件指定的掛起睡眠狀態。如果系統成功被從那種狀態喚醒,跳過休眠鏡像并繼續執行,否則使用鏡像恢復之前系統的狀態
2.3.5test_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 這里
總結
以上是生活随笔為你收集整理的linux内核睡眠状态解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些SAP S4CRM On-Premi
- 下一篇: 如何让Excel里显示的数字避免通过科学