一起學習電腦如何睡眠S3

什麼是S3

如下圖,在你電腦的「關機」按鈕旁邊有個「睡眠」,這個睡眠狀態就是S3。S3又叫做Suspend to RAM,在S3狀態時,系統狀態保存在memory裡面,系統處於耗電很低的狀態,當你想要再次使用的時候,可以快速喚醒。

電腦是如何進入睡眠狀態又是如何被喚醒的呢?在本文中你將找到答案。

Sleeping狀態

ACPI提供了一種機制使系統在Working狀態(G0)和Sleeping狀態(G1)以及soft-off (G2)狀態之間轉換。

G1 Sleeping狀態下系統耗電較少,沒有程序在執行,如果有任何喚醒事件傳入系統會使系統快速恢復至G0工作狀態。Sleeping狀態分為四種:

S0:正常工作狀態,所有設備正常運轉。

S1:Sleeping with Processor Context Maintained,即Windows下的Standby。CPU停止工作,不執行任何指令,但是CPU,晶元組以及DRAM內容沒有遺失。此狀態可以快速恢復到工作狀態。

S2:比S1的睡眠狀態更深更省電,CPU停止工作,但是CPU和cache的內容已丟失。DRAM仍處於帶電狀態。

S3:又叫Suspend to RAM,功耗更低,內存信息得以保持,CPU, Cache, Chipset的內容均丟失。DRAM仍處於帶電狀態。

S4:又叫Suspend to Disk,功耗最低,喚醒需要的時間最長,所有設備都不再工作。Memory的資料被保存在Disk中。當系統收到喚醒信號後,首先從Disk中恢復memory。

S5即G2狀態,和S4狀態類似,但是OSPM不再保存任何內容,需要一個完整的啟動過程才能喚醒系統。

ACPI指定3 bit的二進位數對應於每個sleep type,比如:

Name(_S3, Package(4) {0x5, 0x0, 0, 0})

這個0x5就對應S3的sleep type。

OSPM執行_PTS control method,獲取SLP_TYPx,把SLP_TYPx數值寫入PM1_CNT(Power Management 1 control)的slp_typ域,並且slp_en置1就可以使系統進入相應的sleep type,寄存器的說明如下圖所示:

如果SLP_TYPx被寫入S3 Type,SLP_EN置1,則硬體需要做以下事情使系統剛進入S3狀態:1)使memory進入低功耗狀態。2)除了memory,把電源從其他設備移除。RTC 時鐘是系統中唯一在工作的時鐘。

S3啟動路徑

從前面的文章中我們已經知道,BIOS的作用是初始化Memory, Chipset, CPU等,最後載入OS loader,使系統處於Pre-OS Configuration狀態,同樣,S3啟動也需要初始化各種設備,使系統處於Pre-OS Configuration狀態。區別在於S3 Resume不需要像正常啟動那樣執行所有初始化程序就可以快速完成初始化的工作。

下圖描述了S3 啟動路徑和S5啟動路徑的區別以及他們之間的交互。

BIOS normal boot需要經過SEC, PEI, DXE, BDS這幾個過程,而S3 resume只需要經過SEC,PEI兩個階段。Normal boot時,系統配置信息會被保存到Non-Volatile Storage (NVS) 用於S3快速喚醒。對於沒有很高的安全性要求的數據,保存在UEFI variable里, 安全性要求高的數據保存在SMRAM 里以防黑客攻擊。

雖然這兩種啟動路徑都有PEI,他們在PEI階段做的事情其實是不同的。根據PEI Service的boot mode來判斷當前boot是normal boot還是S3 resume boot。PEIM在normal boot的時候會保存配置信息到NVS,這樣在S3 resume boot的時候PEIM就可以利用這些已知的配置信息快速完成初始化 。通常的做法是使用Hand-Off Block(HOB)把配置信息傳遞到DXE,DXE驅動再把這些信息保存到NVS。下圖描述了Normal boot和S3 Resume boot在PEI階段的工作流程:

舉個例子,BIOS在正常啟動(PEI Phase)的時候,Memory初始化的程序首先Detect Dimm,通過讀SPD獲取Memory的參數,利用讀到的參數來初始化Memory Controller,完成Memory Configuration。在以上過程中通過讀取或者計算得到的Memory參數利用HOB傳到DXE Phase,通過SaveMemoryConfig保存到UEFI Variable。這樣在S3喚醒時,就可以直接調用MrcParamsRestore從UEFI variable里獲取Memory參數,不需要再通過SMBUS讀SPD以及額外的計算,可以快速完成Memory初始化。正常啟動時會預留出一段Memory供S3 Resume使用。這段Memory的地址和大小也會保存在NV Variable里。

S3 Boot Script

Normal boot時DXE驅動程序完成了大部分的初始化工作,使系統進入Pre-OS Configuration狀態。然而在S3 resume啟動時引入DXE是非常不合適的,因為DXE Phase提供了大量服務,執行過程複雜,對內存需求大,並且從flash載入DXE也是很耗時的。因此,BIOS Framework提供了boot script機制使S3 Resume boot時避開DXE,極大的提高了喚醒效率。Framework boot script是用於描述一系列平台初始化操作的腳本,這些操作包括I/O, memory, PCI configuration等。Normal boot時,DXE驅動程序把平台配置信息記錄在boot script里(EFI_BOOT_SCRIPT_SAVE_PROTOCOL),boot script保存在NVS里。S3 resume boot過程中,執行boot script就可以恢復平台配置信息(EFI_PEI_BOOT_SCRIPT_EXECUTER_PPI)完成初始化工作 。比如,晶元組的配置可以看作是一系列Memory, I/O, PCI配置的操作,這些操作會被保存在boot script里用於S3 resume。處理器的初始化會相對複雜一些,包括:

1. 系統管理模式的基本配置

2. Microcode載入

3. 處理器初始化,MSR寄存器設置

4. 處理器cache屬性,MTRR寄存器設置

以上這些信息在Normal boot時以CPU S3 Script table的形式保存在SMRAM里,S3 Resume boot的相關程序從SMRAM里恢復CPU配置信息。具體請參考SiliconBroxtonSoCBroxtonSiPkgCpuLibraryPrivatePeiCpuS3Lib

和Normal boot不同,S3 Resume時DXE IPL PPI不去載入DXE階段的程序,而是找到S3 Resume PPI,轉交控制權。S3 Resume PPI執行Framework boot script table恢復平台配置,然後跳轉至OS waking vector,把控制權交給OS繼續完成S3 Resume。為了完成這些工作,S3 Resume PPI必須要知道以下信息:1)S3 boot script table的內存地址;2)指向ACPI table的RSDT用於找到OS waking vector;3)為S3 resume boot預留的memory地址。

結語

補充一些雜項:

1. Win7開始增加了一個混合睡眠模式。即S3和S4同時進行,先把信息寫到硬碟中的hiberfil.sys(系統休眠佔用的空間文件)文件中,再進行休眠。

在外部供電未終止的情況下,電腦會停留在休眠狀態。但是當外部供電終止後,則再次開機時則通過讀取hiberfil.sys文件進行恢複數據,即S4方式。比單純的睡眠模式更能防止斷電導致的數據丟失,而在外部供電正常的情況下比單純的休眠模式啟動速度更快。

2. 如何知道自己的電腦支持那種睡眠模式呢,有個powercfg工具,如圖:

從中我們可以看出我們支持那種Sx,和為什麼不支持某種Sx。大家還可以用它開關某個Sx。十分方便。

關於S3 Resume我們就講到這裡,下期再會。


推薦閱讀:

CPU省電的秘密(二):CStates
如何在ubuntu下重建被grub覆蓋的win10引導區?
UEFI 引導與 BIOS 引導在原理上有什麼區別?
UEFI+GPT與BIOS+MBR各自有什麼優缺點?
Win10下固態硬碟與機械硬碟混搭應該採取GPT還是MBR?

TAG:UEFI | 电脑DIY | 计算机科学 |