系統睡眠狀態¶
- 版權:
© 2017 英特爾公司
- 作者:
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
睡眠狀態是整個系統的全域性低功耗狀態,在此狀態下使用者空間程式碼無法執行,並且系統整體活動顯著減少。
可支援的睡眠狀態¶
根據其配置和所執行平臺的能力,Linux 核心最多可支援四種系統睡眠狀態,包括休眠和最多三種系統掛起變體。核心可支援的睡眠狀態如下所示。
掛起到空閒¶
這是一種通用的、純軟體的、輕量級系統掛起變體(也稱為 S2I 或 S2Idle)。透過凍結使用者空間、暫停計時以及將所有 I/O 裝置置於低功耗狀態(可能比工作狀態下的功耗更低),它可以比執行時空閒狀態節省更多能源,從而使處理器在系統掛起時可以在其最深層的空閒狀態下花費時間。
系統透過帶內中斷從該狀態喚醒,因此理論上,任何在工作狀態下能產生中斷的裝置,也可以設定為 S2Idle 的喚醒裝置。
該狀態可用於不支援待機或掛起到記憶體的平臺,或者作為任何更深層系統掛起變體的補充以減少喚醒延遲。如果設定了CONFIG_SUSPEND核心配置選項,則始終支援該狀態。
待機¶
如果支援此狀態,它能提供適度但實際的節能效果,同時提供相對直接的返回工作狀態的轉換。沒有操作狀態丟失(系統核心邏輯保留電源),因此係統可以輕鬆地回到之前的狀態。
除了凍結使用者空間、暫停計時和將所有 I/O 裝置置於低功耗狀態(掛起到空閒也執行此操作)之外,在轉換到此狀態期間,非引導 CPU 會離線,並且所有低階系統功能都會暫停。因此,與掛起到空閒相比,它應該能節省更多能源,但喚醒延遲通常會大於該狀態。
能夠從該狀態喚醒系統的裝置集通常相對於掛起到空閒有所減少,並且可能需要依靠平臺來適當設定喚醒功能。
如果設定了CONFIG_SUSPEND核心配置選項並且平臺已向核心系統掛起子系統註冊了對其的支援,則支援此狀態。在基於 ACPI 的系統上,此狀態對映到 ACPI 定義的 S1 系統狀態。
掛起到記憶體¶
如果支援此狀態(也稱為 STR 或 S2RAM),它能顯著節能,因為系統中除記憶體外的一切都進入低功耗狀態,記憶體應置於自重新整理模式以保留其內容。進入待機時執行的所有步驟在轉換到 S2RAM 期間也會執行。根據平臺功能,可能會進行額外操作。特別是,在基於 ACPI 的系統上,核心在 S2RAM 轉換的最後一步將控制權交給平臺韌體 (BIOS),這通常會導致關閉一些不受核心直接控制的低階元件。
裝置和 CPU 的狀態儲存在記憶體中。所有裝置都已掛起並進入低功耗狀態。在許多情況下,進入 S2RAM 時所有外圍匯流排都會斷電,因此裝置必須能夠處理返回“開”狀態的轉換。
在基於 ACPI 的系統上,S2RAM 需要平臺韌體中一些最少的引導程式碼才能從中恢復系統。其他平臺也可能如此。
能夠從 S2RAM 喚醒系統的裝置集通常相對於掛起到空閒和待機有所減少,並且可能需要依靠平臺來適當設定喚醒功能。
如果設定了CONFIG_SUSPEND核心配置選項並且平臺已向核心系統掛起子系統註冊了對其的支援,則支援 S2RAM。在基於 ACPI 的系統上,它對映到 ACPI 定義的 S3 系統狀態。
休眠¶
此狀態(也稱為掛起到磁碟或 STD)提供了最大的節能效果,即使在缺乏對系統掛起的低階平臺支援的情況下也可以使用。但是,它需要底層 CPU 架構存在一些用於恢復系統的低階程式碼。
休眠與任何系統掛起變體都顯著不同。它需要三次系統狀態更改才能進入休眠,兩次系統狀態更改才能恢復。
首先,當觸發休眠時,核心會停止所有系統活動,並建立記憶體快照影像以寫入持久儲存。接下來,系統進入一個可以儲存快照影像的狀態,影像被寫入,最後系統進入目標低功耗狀態,其中幾乎所有硬體元件(包括記憶體)的電源都被切斷,除了有限的喚醒裝置集。
快照影像寫入完成後,系統可以進入特殊的低功耗狀態(如 ACPI S4),或者直接斷電。斷電意味著最小的功耗,並且允許此機制在任何系統上工作。但是,進入特殊的低功耗狀態可能會允許使用額外的系統喚醒方式(例如,按下鍵盤上的鍵或開啟筆記型電腦蓋)。
喚醒後,控制權交給平臺韌體,該韌體執行引導載入程式,引導載入程式啟動核心的新例項(控制權也可以直接轉到引導載入程式,具體取決於系統配置,但無論如何,它都會導致啟動核心的新例項)。核心的這個新例項(稱為恢復 核心)在持久儲存中尋找休眠影像,如果找到,則將其載入到記憶體中。接下來,系統中所有活動停止,恢復核心用影像內容覆蓋自身,並跳到儲存在影像中的原始核心中的特殊跳板區域(稱為影像 核心),這裡需要特殊的架構特定的低階程式碼。最後,影像核心將系統恢復到休眠前的狀態,並允許使用者空間再次執行。
如果設定了CONFIG_HIBERNATION核心配置選項,則支援休眠。但是,只有當給定 CPU 架構的支援包含用於系統恢復的低階程式碼時,才能設定此選項。
系統掛起和休眠的基本 sysfs 介面¶
電源管理子系統為使用者空間提供了一個統一的sysfs介面,用於系統睡眠,無論底層系統架構或平臺如何。該介面位於/sys/power/目錄中(假設sysfs掛載在/sys),它由以下屬性(檔案)組成
state此檔案包含一個字串列表,表示核心支援的睡眠狀態。將這些字串之一寫入此檔案會使核心開始將系統轉換為該字串所代表的睡眠狀態。
特別是,“disk”、“freeze”和“standby”字串分別代表休眠、掛起到空閒和待機睡眠狀態。“mem”字串根據下面描述的
mem_sleep檔案的內容進行解釋。如果核心不支援任何系統睡眠狀態,則此檔案不存在。
mem_sleep此檔案包含一個字串列表,表示支援的系統掛起變體,並允許使用者空間選擇與上述
state檔案中的“mem”字串關聯的變體。此檔案中可能存在的字串是“s2idle”、“shallow”和“deep”。“s2idle”字串始終代表掛起到空閒,並且按照慣例,“shallow”和“deep”分別代表待機和掛起到記憶體。
將列出的字串之一寫入此檔案,會導致其所代表的系統掛起變體與
state檔案中的“mem”字串關聯。當前與state檔案中的“mem”字串關聯的掛起變體字串顯示在方括號中。如果核心不支援系統掛起,則此檔案不存在。
disk此檔案控制休眠(掛起到磁碟)的操作模式。具體來說,它告訴核心在建立休眠影像後該怎麼做。
從中讀取會返回一個支援的選項列表,編碼為
平臺將系統置於特殊的低功耗狀態(例如 ACPI S4),以提供額外的喚醒選項,並可能允許平臺韌體在喚醒後採用簡化的初始化路徑。
僅當平臺提供特殊機制在建立休眠影像後將系統置於睡眠狀態時(例如,具有 ACPI 的平臺通常會這樣做)才可用。
關機關閉系統電源。
重啟重啟系統(主要用於診斷)。
掛起混合系統掛起。將系統置於透過上述
mem_sleep檔案選擇的掛起睡眠狀態。如果系統成功從該狀態喚醒,則丟棄休眠影像並繼續。否則,使用影像恢復系統先前的狀態。如果支援系統掛起,則此選項可用。
test_resume診斷操作。載入影像,就像系統剛從休眠中喚醒,並且當前執行的核心例項是恢復核心一樣,然後進行完整的系統恢復。
將上面列出的字串之一寫入此檔案,會導致選擇其所代表的選項。
當前選定的選項顯示在方括號中,這意味著當透過向
/sys/power/state寫入disk觸發休眠時,將建立並儲存影像後執行其所代表的操作。如果核心不支援休眠,則此檔案不存在。
image_size此檔案控制休眠影像的大小。
可以向其寫入一個表示非負整數的字串,該整數將用作影像大小的盡力而為的上限(以位元組為單位)。休眠核心將盡力確保影像大小不超過該數字,但如果無法實現,仍將建立休眠影像,並且其大小將盡可能小。特別是,向此檔案寫入“0”會導致休眠影像的大小最小。
從中讀取會返回當前影像大小限制,預設情況下,該限制設定為可用 RAM 大約 2/5。
pm_trace此檔案控制“PM 跟蹤”機制,該機制在重啟後將上次掛起或恢復事件點儲存在 RTC 記憶體中。它有助於更有效地除錯在系統掛起或恢復期間(這種情況更常見)由於裝置驅動程式故障導致的硬鎖定或重啟。
如果它包含“1”,則每個掛起/恢復事件點的指紋將依次儲存在 RTC 記憶體中(覆蓋實際的 RTC 資訊),因此如果在儲存後立即發生系統崩潰,它將倖存下來,並且以後可以用於識別導致崩潰的驅動程式。
它預設包含“0”,可以透過向其中寫入一個表示非零整數的字串來將其更改為“1”。
根據上述內容,有兩種方法可以讓系統進入掛起到空閒狀態。第一種是直接將“freeze”寫入/sys/power/state。第二種是將“s2idle”寫入/sys/power/mem_sleep,然後將“mem”寫入/sys/power/state。同樣,如果平臺支援待機狀態,也有兩種方法可以讓系統進入該狀態(在這種情況下寫入控制檔案的字串分別是“standby”或“shallow”以及“mem”)。然而,只有一種方法可以讓系統進入掛起到記憶體狀態(將“deep”寫入/sys/power/mem_sleep,將“mem”寫入/sys/power/state)。
預設的掛起變體(即無需向/sys/power/mem_sleep寫入任何內容即可使用的變體)是“deep”(在大多數支援掛起到記憶體的系統上)或“s2idle”,但可以透過核心命令列中的mem_sleep_default引數值來覆蓋。在某些具有 ACPI 的系統上,根據 ACPI 表中的資訊,即使原則上支援掛起到記憶體,預設值也可能是“s2idle”。