天天看點

kernel panic 和 kernel Oops

1. Kernel panic

核心錯誤(Kernel panic)是指作業系統在監測到内部的緻命錯誤,并無法安全處理此錯誤時采取的動作。這個概念主要被限定在Unix以及類Unix系統中;對于MicrosoftWindows系統,等同的概念通常被稱為藍屏當機。

作業系統核心中處理Kernel panic的子程式(在AT&T派生類以及BSD類Unix中,通常為panic())通常被設計用來向控制台輸出錯誤資訊,向磁盤儲存一份核心記憶體的轉儲,以便事後的調試,然後等待系統被手動重新開機,或自動重新開機。

作業系統試圖讀寫無效或不允許的記憶體位址是導緻核心錯誤的一個常見原因。核心錯誤也有可能在遇到硬體錯誤或作業系統BUG時發生。

Linux kernel panic有标志性的log列印,可以作為是否發生panic的搜尋關鍵字:

Kernel panic - not syncing: Fatal exception

2. Oops

對于Linux核心來說,Oops就意外着核心出了異常,此時會将産生異常時CPU的狀态,出錯的指令位址、資料位址及其他寄存器,函數調用的順序甚至是棧裡面的内容都列印出來,然後根據異常的嚴重程度來決定下一步的操作:殺死導緻異常的程序或者挂起系統。

最典型的異常是在核心态引用了一個非法位址,通常是未初始化的野指針Null,這将導緻頁表異常,最終引發Oops。

linux系統足夠健壯,能夠正常的反應各種異常。異常通常導緻目前程序的死亡,而系統依然能夠繼續運轉,但是這種運轉都處在一種不穩定的狀态,随時可能出問題。對于中斷上下文的異常及系統關鍵資源的破壞,通常會導緻核心挂起,不再響應任何事件。

3. 核心的異常級别

3.1 Bug

Bug是指那些不符合核心的正常設計,但核心能夠檢測出來并且對系統運作不會産生影響的問題,比如在原子上下文中休眠。

3.2 Oops

程式在核心态時,進入一種異常情況,比如引用非法指針導緻的資料異常,數組越界導緻的取指異常,此時異常處理機制能夠捕獲此異常,并将系統關鍵資訊列印到序列槽上,正常情況下Oops消息會被記錄到系統日志中去。

Oops發生時,程序處在核心态,很可能正在通路系統關鍵資源,并且擷取了一些鎖,當程序由于Oops異常退出時,無法釋放已經擷取的資源,導緻其他需要擷取此資源的程序挂起,對系統的正常運作造成影響。通常這種情況,系統處在不穩定的狀态,很可能崩潰。

3.3 Panic

當Oops發生在中斷上下文中或者在程序0和1中 ,系統将徹底挂起(重新開機),因為中斷服務程式異常後,将無法恢複,這種情況即稱為核心panic。另外當系統設定了panic标志時,無論Oops發生在中斷上下文還是程序上下文,都将導緻核心Panic。由于在中斷複位程式中panic後,系統将不再進行排程,Syslogd将不會再運作,是以這種情況下,Oops的消息僅僅列印到序列槽上,不會被記錄在系統日志中。

4. 總結:

kernel panic一般會造成系統重新開機,而Oops不一定會引起系統重新開機,隻是殺死相關程序。

  • 非中斷上下文的oops隻是oops;
  • 中斷上下文oops要panic;
  • 如果設定了panic_on_oops,任何oops都是panic。

繼續閱讀