作業系統核心

核心恐慌(kernel panic,與 oops)

當一個普通程式撞上致命錯誤時,核心只是把那一個行程殺掉,系統其餘部分照常運作——一個記憶體區段錯誤被圍堵住了。但核心正是那個負責圍堵的程式;它之上沒有任何東西能捕捉它自己的致命錯誤。核心恐慌就是當核心偵測到一個嚴重到無法安全繼續的問題時所發生的事——於是它不冒著悄悄損壞磁碟資料的風險,而是刻意停下一切。這是核心在說:「我再也無法信任這臺機器的狀態;現在停機比繼續下去更安全。」

有兩個相關的詞值得區分。在 Linux 裡,oops 是一份嚴重核心錯誤的報告——核心撞上一個臭蟲(往往是核心程式碼內一次壞的指標解參考),印出一份診斷傾印(暫存器、一份顯示它如何走到那裡的呼叫堆疊追蹤、出錯的指令),並試圖撐下去,或許只殺掉受影響的工作。恐慌則是更硬的停止:錯誤無法復原——或一個 oops 發生在太關鍵、無法跛行越過之處——所以核心印出它的診斷,然後把整個系統停掉。在 Windows 上同樣的理念是著名的「藍白當機畫面」;在 macOS 上它是一次強制重開機的核心恐慌。恐慌印出的診斷對除錯極為寶貴,這正是為何核心可以被設定去捕捉它(透過 kdump 做當機傾印)以供事後分析。

為何理解這件事重要:恐慌並不是一個讓你惱火的隨機故障——它通常是一個刻意、防禦性的抉擇。核心寧可大聲地停機,也不願帶著損壞的內部狀態繼續、悄悄毀掉你的檔案系統。所以對恐慌的正確反應是讀它的訊息:它幾乎總是指向起因(某個特定驅動、追蹤裡某個特定函式)。而更深一層的重點繫回信任邊界:因為核心以完整特權執行、其上又無安全網,任何一個核心內元件的單一臭蟲——包括單體核心裡一個有臭蟲的驅動——都能讓整臺機器恐慌,這正是微核心試圖藉由把驅動隔離進可重啟的使用者模式伺服器來圍堵的那種脆弱。

核心程式碼解參考一個壞指標 -> oops:印出暫存器與呼叫堆疊追蹤(哪個函式、哪個驅動),可能只殺掉那個工作。若無法復原或在關鍵路徑 -> 恐慌:印出傾印,然後把整個系統停掉。kdump 可把它存下來供分析。

oops 報告一個核心臭蟲、也許跛行繼續;恐慌是無法復原的停止。印出的呼叫堆疊追蹤是查明起因的第一條線索。

恐慌通常是刻意的故障保護,而非隨機的小故障:核心刻意停機,而非冒著以不受信任的內部狀態損壞你資料的風險。永遠去讀那份呼叫堆疊追蹤——它指向出錯的函式或驅動。並記住其結構性起因:以完整特權執行、其上又無安全網,一個核心內的臭蟲就能拖垮整臺機器。

又稱
panicoopsBlue Screen of Death (BSOD)kernel crash核心當機藍白當機畫面