內核錯誤

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
init傳送SIGSEGV使其退出,導致FreeBSD中發生的內核錯誤。

內核錯誤(英語:Kernel Panic)是指作業系統在監測到內部的致命錯誤,且無法安全處理此錯誤時採取的動作。這個概念主要被限定在Unix以及類Unix系統中;對於Microsoft Windows系統,等同的概念通常被稱為藍畫面死機

作業系統內核中處理Kernel panic的子程式(在AT&T衍生類以及BSD類Unix中,通常稱為panic())通常被設計用來向控制台輸出錯誤資訊,向磁碟儲存一份內核記憶體的轉儲,以便事後的除錯,然後等待系統被手動重新引導,或自動重新引導。該程式提供的技術性資訊通常是用來幫助系統管理員或者軟件開發者診斷問題的。

作業系統試圖讀寫無效或不允許的記憶體地址是導致內核錯誤的一個常見原因。內核錯誤也有可能在遇到硬件錯誤或作業系統BUG時發生。在不同情況中,作業系統可以在記憶體訪問違例發生時繼續執行。然而,系統處於不穩定狀態時,作業系統通常會停止工作以避免造成破壞安全和數據損壞的風險,並提供錯誤的診斷資訊。

內核錯誤在早期的Unix系統中被引入,顯示了在Unix與Multics在設計哲學上的主要差異之一。Multics的開發者Tom van Vleck曾引述了一段在這個問題上與Unix開發者Dennis Ritchie的討論:

我提醒Dennis說,我在Multics中寫的近半數代碼都是錯誤恢復代碼。他說:「我們不需要這些。我們有稱為panic的子程式,如果發生了錯誤就可以呼叫這個函數,使得系統崩潰,然後你可以在大廳裏面大叫:『嘿,重新啟動機器』。」[1]

原始的panic()函數從UNIX第五版開始到基於VAX的UNIX 32V期間幾乎沒有變化,只是輸出一條錯誤資訊,然後就使系統進入NOP的無窮迴圈中。當改進UNIX的基礎代碼的時候,panic()函數也有所改進,可以向控制台輸出多種格式的除錯資訊。

Mac OS X[編輯]

Mac OS X v10.6 Snow Leopard中,當進入內核錯誤後,會在畫面上出現一個有英語法語德語西班牙語日語的死機畫面,被多數麥金塔電腦用戶稱為「五國語言死機」,簡稱「五國」。同時,除錯資訊被儲存在NVRAM中,並會在重新啟動時寫出紀錄檔檔案。

出現這樣的問題除了是作業系統上的問題,絕大多數是擴充記憶體出現問題,但亦有可能是其他硬件出現問題。此畫面亦多發生於黑蘋果安裝過程中。通常重新開機即可解決問題,但有時候必須被送去維修才可以解決問題。

Mac OS X v10.310.5版本中,死機畫面沒有西班牙語,只包含英語、法語、德語及日語四種語言,因此被稱為「四國語言死機」,簡稱「四國」,由於使用時間較長,可能是多數用戶習慣的名稱。

OS X v10.8 Moutain Lion和之後的版本,除了原有的英語、法語、德語、西班牙語及日語外,又增加簡體中文的語系。

Linux內核oops[編輯]

在Linux上,oopsLinux內核的行為不正確,並產生了一份相關的錯誤紀錄檔。許多類型的oops會導致內核錯誤,即令系統立即停止工作,但部分oops也允許繼續操作,以保證系統的穩定性。這個概念只代表一個簡單的錯誤

當內核檢測到問題時,它會列印一個oops資訊然後終止全部相關行程。oops資訊可以幫助Linux內核工程師除錯,檢測oops出現的條件,並修復導致oops的程式錯誤。

Linux官方內核文件中提到的oops資訊被放在內核原始碼Documentation/oops-tracing.txt[2]。通常klogd是用來將oops資訊從內核快取中提取出來的,然而,在某些系統上,例如最近的Debian發行版中,rsyslogd代替了klogd,因此,缺少klogd行程並不能說明log檔案中缺少oops資訊的原因。

若系統遇到了oops,一些內部資源可能不再可用。即使系統看起來工作正常,非預期的副作用可能導致活動行程被終止。內核oops常常導致內核錯誤,若系統試圖使用被禁用的資源。

Kernelloops提到了一種用於收集和提交oops到其網站的軟件[3] 。Kerneloops.org同時也提供oops的統計資訊[4]

參見[編輯]

參考文獻[編輯]

外部連結[編輯]