硬體看守計時器

總覽

硬體監控計時器 (WDT) 是特殊的硬體,會在發生整個系統鎖定時重設系統。這類 API 經常在晶片系統 (SoC) 設計中採用,特別是以小型嵌入系統應用程式為目標的 SoC。這可做為系統設計的重要面向,因為它們可以觸發系統重新啟動,而系統完全在鎖定的系統上重新啟動,導致完全無法在系統發生無可比性的損害前管理重要業務工作 (例如主動式熱力管理)。此外,這些程式庫可在使用者未介入的情況下自動重設硬鎖定系統,有助於減輕嵌入系統的使用者體驗。沒有人希望能夠處理已鎖定的裝置,但如果最糟的情況是,系統更建議您自動重設裝置,而不是強迫使用者施加無回應系統,直到使用者決定裝置需要重新開機為止,而是必須實際拔除裝置電源才能復原。

一般來說,監控計時器計時器 (簡稱「觀察狗」或「WDT」) 是設為以特定速率計算,直到達到門檻計數為止。如果計數器在軟體重設前達到門檻,WDT 就會自動重新啟動,無預警地重新啟動系統。從軟體重設 WDT 的動作,通常是指「寵物」監視器。系統中硬體監控計時器的期間通常會比較長 (一秒以上),因為此機制是絕對最嚴重的故障情況。系統應該在守衛前一切正常且完全上鎖。

Zircon 中的用法

Zircon 中的 WDT (如有) 是用來保護系統的絕對最低等級。啟用後,在與核心層級計時器分開的 1/4 到 1/2 之間,名目在 1/4 到 1/2 之間是正常的動物。也就是說,它會在不受執行緒影響的硬性 IRQ 環境中拍攝寵物。不會因為執行緒權重、期限或任何其他排程器行為而有所變更,不得置放監控計時器。如要讓硬體監看員啟動並重新啟動系統,系統必須鎖定計時器,直到計時器 IRQ 無法運作的時間點。

如上所述,監控計時器是硬體專屬實體。無論 x64 或 ARM64 等架構是否存在,都能執行哪些操作,以及專門操作方法 (如有這類) 並非很常見。由於「寵物」作業的位置是 Zircon 核心絕對最低級別,因此核心是寵物狗,而非任何硬體專屬使用者模式驅動程式。

因此,系統啟動載入程式可正確設定監控器,並透過 ZBI 通知核心,包括 WDT 是否存在、是否已啟用、寵物頻率,以及寵物、啟用或停用頻率等重要詳細資料。執行 Zircon 的系統只有在系統啟動載入程式告知其功能以及其運作方式時,才會「具有」WDT。雖然系統啟動載入程式必須指示核心如何在出現及啟用時攜帶監控狗,但可能無法告知核心如何停用此功能。這可能是系統設計決定的結果,也可能是無法在核心中停用 WDT。

通常,系統啟動載入程式會先設定並啟用硬體 WDT,再將控制項轉移至核心。如此一來,如果核心在啟動期間完全鎖定,WDT 就會重設系統。從柵欄的另一側,核心會嘗試在啟動序列中盡早識別和 WDT 競爭。稍後,該函式會進入模式,在啟動階段開始時,讓狗進入定期寵物狗的模式,直到可以設定計時器為止。

在開發期間控管監控計時器的方法

大多數開發人員應該完全不需要使用監控計時器計時器,甚至知道現有的計時器。於正常作業期間觸發, 代表某種異常狀況但在某些情況下,開發人員可能會在調查錯誤或其他效能問題時,將嚴重中斷要求 (IRQ) 發出過多時間。在這類情況下,建議您瞭解有哪些選項可以控制監控計時器,而不會在不恰當的時機下鑽。

使用核心殼層擴充功能

如果您可以存取核心殼層,且系統穩定執行啟動至可存取核心殼層的點,就能夠使用殼層擴充功能操控 WDT。執行 k wdt help 以查看可用指令清單。執行 k wdt status,查看核心是否知道任何硬體 WDT,以及是否已啟用、是否啟用 WDT、正常寵物經期,以及計時器上次寵物多久。如有需要,您可以執行 k wdt disable 來停用監控計時器。只有在系統啟動載入程式已告知核心如何停用 WDT 時,您才能停用 WDT。

使用核心指令列

您可以傳遞核心指令列引數來控製手錶犬。您可以傳送 kernel.force-watchdog-disabled=true,指示核心在啟動期間盡早強制停用監控程式。如果問題導致監控狗在到達核心殼層的方便存取點之前觸發,這個方法就能派上用場。然而,只有在系統啟動載入程式已指示核心如何停用監控程式時,您才能採用這個選項。