linux核心睡眠狀態解析

2022-06-10 17:21:10 字數 3927 閱讀 6455

睡眠狀態是整個系統的全域性低功耗狀態,在這種狀態下,使用者空間的**不能被執行並且整個系統的活動明顯被降低

取決於所執行平台的能力和配置選項,linux核心能支援四種系統睡眠狀態,包括休眠和多達三種系統掛起的變數;,支援的睡眠狀態如下:

這是一種普通、純軟體、輕量級的系統掛起變數(也被稱為s2i或s2idle)。與執行時空閒狀態相比,通過停止使用者空間程式的執行、暫停計時、將所有的輸入輸出裝置設定為低功耗狀態能降低更多能耗,系統在休眠狀態下,處理器一直執行在深度空閒狀態。

系統被內部中斷喚醒,因此理論上任何在工作狀態下能產生中斷的裝置也能針對s2idle狀態被設定為喚醒裝置。

這種狀態能被用在不支援待機或休眠到記憶體的平台上,它能被用在更深的系統休眠變種中以減少進入正常工作狀態的延遲。

這種狀態在核心選項config_suspend被設定的時候總是被支援。

如果支援這種狀態,提供適度的但確實降低了功耗的方式,同時提供一種相對簡單的方式恢復到正常工作狀態,因此系統很容易地回到原來停止執行的地方繼續執行。

除了凍結使用者空間、暫停計時和將所有輸入輸出裝置置於低功耗狀態(這些是在suspend to idle狀態做的),未啟動的cpu直接被置為離線狀態,並且在轉換到此狀態的過程中所有的低階系統功能都被暫停。

因此,這種狀態相對suspend to idle狀態能節省更多的電力,但是切換到正常工作狀態的時間通常會更長。

相比suspend to idle狀態,能從這種狀態喚醒系統的裝置集就少了很多,可能需要依賴平台適當地設定喚醒功能

如果核心選項config_suspend被設定,那麼這種狀態就被支援,支援被帶有核心系統suspend子系統的平台註冊。

在基於acpi的系統中,這種狀態被對映為由acpi定義的s1系統狀態

如果支援這種狀態(也被稱為str/s2ram),它能明顯節能,因為在系統中,除了記憶體(記憶體被置於自重新整理模式來保持其中的內容),任何東西都被置於低功耗狀態,進入待機狀態被執行的所有操作在轉換到這種狀態下也同樣被執行,可能會根據平台的能力來執行其他操作。

特別的是,在基於acpi的系統上,在s2ram狀態切換的過程中,核心將控制權交給平台韌體(bios)作為最後的乙個步驟,通常導致關掉一些不被核心直接控制的更低階的元件。

裝置和cpu的狀態被儲存在記憶體中,所有的裝置被掛起並置於低功耗狀態,在許多場景下,在進入s2ram時所有的外圍匯流排掉電,因此裝置必需具備處理回退到正常狀態的能力。、

在基於acpi的系統上s2ram要求在平台韌體中有一些最小化啟動**來切換到正常工作狀態。在其它平台也可能是這種情況。

比起前兩種狀態,能從s2ram喚醒系統的裝置集通常能節約更多的電力,並且可能需要依賴平台適當地設定喚醒功能。

如果config_suspend被配置,那麼s2ram就被支援,支援被帶有核心系統suspend子系統註冊。在基於acpi的系統上,它被對映為由acpi定義的s3系統狀態。

這種狀態(也被稱為suspend-to-disk/std)提供最佳節能效果,甚至在不支援系統掛起的低階平台上也可以使用。然而,它要求為底層cpu架構提供一些喚醒系統的低階**

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

首先,當休眠被觸發的時候,核心停止所有的系統活動並且建立乙個記憶體快照寫入磁碟。

接下來,系統執行到快照映象能被儲存的狀態下,映象被寫入,最後系統進入目標低功耗狀態(除了一些喚醒裝置,幾乎所有硬體元件,包括記憶體都被斷電)。

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

在喚醒之後,控制權交給執行乙個啟動引導器(啟動乙個全新的核心例項)的平台韌體(控制權可能直接交給啟動引導器,取決於系統配置,但是它都會建立乙個將被啟動的核心例項)。新的核心例項(也被稱作恢復核心)尋找在磁碟中的休眠映象,如果被找到,就將映象載入到記憶體中

接下來,在系統中的所有活動被停止,恢復核心以映象的內容覆蓋自己,並且跳轉到儲存在映象中的原核心(也被稱為映象核心)所在的特殊蹦床區域,這是特殊架構相關的低階**被提供的區域。

最後映象核心恢復系統到預休眠狀態並且允許使用者空間程式再次被執行

如果config_hibernation選項被使能,那麼休眠功能就被支援。然而,這個選項只能在支援包括系統恢復的低階**的指定cpu架構被設定。

下面位於/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.5 test_resume

診斷操作。載入映象,就像是系統剛被從休眠狀態喚醒,當前執行的核心例項是乙個恢復核心並且接著是完整系統的恢復。

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

當前選中的選項被顯示在方框中,意味著由寫」disk"到/sys/power/state觸發的下一次休眠在建立和儲存映象之後由它指定的操作將被指定

如果核心不支援,這個檔案不顯示

根據以上內容,由兩種方式使系統進入掛起到空閒狀態。第乙個是直接寫"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.1 這

4.2 這裡 

Linux程序狀態解析

linux是乙個多使用者,多工的系統,可以同時執行多個使用者的多個程式,就必然會產生很多的程序,而每個程序會有不同的狀態。linux程序狀態 r task running 可執行狀態。只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,這些程序的task struct結構...

linux核心程式設計 可睡眠鎖之SRCU

linux核心程式設計 可睡眠鎖之srcu define srcu define srcu static static修飾的定義只能在該c檔案中使用,用於保護命名空間。如果乙個函式裡面使用了static,這是相當與乙個全域性變數,但是他的有效範圍只能在該函式內,其他地方不能使用。define and...

linux系統核心解析

在linux下有乙個目錄,即 usr src kernels 目錄,下面記載著乙個linux系統的核心檔案。linux核心 kernel 是整個作業系統的最底層,它負責整個硬體的驅動,以及提供各種系統所需的核心功能,包括防火牆機制 是否支援lvm或quota等檔案系統等等,如果核心不認識某個最新的硬...