從 Zircon 的角度來看,「暫停」有不同種類:系統暫停、工作排程暫停 (每個 CPU) 和平台專屬暫停 (每個 CPU),以及 CPU 空閒。
系統暫停狀態
這是系統範圍的狀態,使用者程式呼叫 zx_system_suspend_enter() 時會進入這個狀態。這個狀態的定義特徵是,所有 CPU 的工作執行作業都會暫停。也就是說,處於這個狀態時,不會執行任何使用者執行緒。不過,Zircon 的中斷處理常式和每個 CPU 的特殊「閒置電源執行緒」(Zircon 的一部分) 可能會繼續視需要執行。詳情請見下文。
進入這個狀態後,Zircon 會找出指定為喚醒向量 (ZX_INTERRUPT_WAKE_VECTOR) 的中斷,並確保只有這些中斷會使系統脫離這個狀態。
這個狀態是以工作排程暫停狀態為基礎 (請參閱下文)。如要讓系統進入這種狀態,每個 CPU 都必須進入工作排程暫停狀態。
工作排程暫停狀態
這是每個 CPU 的狀態。CPU 處於這種狀態時,只有特殊的「閒置電源執行緒」可以執行工作。這項工作負責管理狀態轉換、視需要喚醒系統,以及將 CPU 設為平台專屬的暫停狀態,或設為 CPU 閒置狀態 (如果沒有平台專屬的暫停狀態)。
平台專屬停權狀態
這是由平台層定義的 CPU 狀態 (例如「PC」或「一般 ARM」)。目前僅 arm64 架構支援此狀態,且僅適用於 QEMU 和 Sorrel。
在 Sorrel 上,這個狀態是透過 PSCI CPU_SUSPEND 實作 (請參閱下文)。
進入平台專屬暫停狀態時,Zircon 不會嘗試遮罩或停用硬體中斷 (例如 SPI)。如果特定裝置在進入這個狀態前,已設定為在某些事件發生時產生中斷 和,且這些事件在這個狀態下發生,系統就會產生中斷,CPU 也會離開這個狀態。
接著,CPU 的處理常式會執行,並判斷中斷是否為喚醒向量。如果中斷 是喚醒向量,CPU 的閒置電源執行緒就會開始將所有 CPU 移出工作排程暫停狀態,並將系統移出系統暫停狀態。如果中斷不是喚醒向量,閒置電源執行緒會立即重新進入平台專屬的暫停狀態。
PSCI CPU_SUSPEND
這是 CPU 透過發出 CPU_SUSPEND PSCI 呼叫進入的狀態。在 Sorrel 上,這個呼叫有兩種風味。其中一種變體是將呼叫 CPU 設為暫停狀態。另一種風味是將最後一個未暫停的 CPU 放入暫停狀態,並關閉 AP 複合體。也就是進入 AP Power Collapse。
處於這種狀態時,中斷 CPU 會導致 CPU 繼續執行 (即離開這種狀態)。
CPU 閒置
這並非真正的暫停狀態。只要 CPU 沒有其他更重要的工作,就會進入這個狀態。CPU 會暫停執行作業、進入低功耗狀態,並等待中斷發生,或是等待其他 CPU 要求繼續執行作業。在 arm64 和 riscv64 上,這項操作是透過 WFI 指令完成。在 x64 上,我們使用 MWAIT 或 HLT。CPU 可能在上述任何暫停狀態期間進入這個狀態,但這個狀態並非與系統暫停或工作排程暫停狀態相關。