kernel panic 和 kernel Oops
1.?Kernel panic
內(nèi)核錯(cuò)誤(Kernel panic)是指操作系統(tǒng)在監(jiān)測到內(nèi)部的致命錯(cuò)誤,并無法安全處理此錯(cuò)誤時(shí)采取的動(dòng)作。這個(gè)概念主要被限定在Unix以及類Unix系統(tǒng)中;對(duì)于MicrosoftWindows系統(tǒng),等同的概念通常被稱為藍(lán)屏死機(jī)。
操作系統(tǒng)內(nèi)核中處理Kernel panic的子程序(在AT&T派生類以及BSD類Unix中,通常為panic())通常被設(shè)計(jì)用來向控制臺(tái)輸出錯(cuò)誤信息,向磁盤保存一份內(nèi)核內(nèi)存的轉(zhuǎn)儲(chǔ),以便事后的調(diào)試,然后等待系統(tǒng)被手動(dòng)重啟,或自動(dòng)重啟。
操作系統(tǒng)試圖讀寫無效或不允許的內(nèi)存地址是導(dǎo)致內(nèi)核錯(cuò)誤的一個(gè)常見原因。內(nèi)核錯(cuò)誤也有可能在遇到硬件錯(cuò)誤或操作系統(tǒng)BUG時(shí)發(fā)生。
Linux kernel panic有標(biāo)志性的log打印,可以作為是否發(fā)生panic的搜索關(guān)鍵字:
Kernel panic - not syncing: Fatal exception
?
2.?Oops
對(duì)于Linux內(nèi)核來說,Oops就意外著內(nèi)核出了異常,此時(shí)會(huì)將產(chǎn)生異常時(shí)CPU的狀態(tài),出錯(cuò)的指令地址、數(shù)據(jù)地址及其他寄存器,函數(shù)調(diào)用的順序甚至是棧里面的內(nèi)容都打印出來,然后根據(jù)異常的嚴(yán)重程度來決定下一步的操作:殺死導(dǎo)致異常的進(jìn)程或者掛起系統(tǒng)。
最典型的異常是在內(nèi)核態(tài)引用了一個(gè)非法地址,通常是未初始化的野指針Null,這將導(dǎo)致頁表異常,最終引發(fā)Oops。
linux系統(tǒng)足夠健壯,能夠正常的反應(yīng)各種異常。異常通常導(dǎo)致當(dāng)前進(jìn)程的死亡,而系統(tǒng)依然能夠繼續(xù)運(yùn)轉(zhuǎn),但是這種運(yùn)轉(zhuǎn)都處在一種不穩(wěn)定的狀態(tài),隨時(shí)可能出問題。對(duì)于中斷上下文的異常及系統(tǒng)關(guān)鍵資源的破壞,通常會(huì)導(dǎo)致內(nèi)核掛起,不再響應(yīng)任何事件。
?
3. 內(nèi)核的異常級(jí)別
3.1?Bug
Bug是指那些不符合內(nèi)核的正常設(shè)計(jì),但內(nèi)核能夠檢測出來并且對(duì)系統(tǒng)運(yùn)行不會(huì)產(chǎn)生影響的問題,比如在原子上下文中休眠。
3.2?Oops
程序在內(nèi)核態(tài)時(shí),進(jìn)入一種異常情況,比如引用非法指針導(dǎo)致的數(shù)據(jù)異常,數(shù)組越界導(dǎo)致的取指異常,此時(shí)異常處理機(jī)制能夠捕獲此異常,并將系統(tǒng)關(guān)鍵信息打印到串口上,正常情況下Oops消息會(huì)被記錄到系統(tǒng)日志中去。
Oops發(fā)生時(shí),進(jìn)程處在內(nèi)核態(tài),很可能正在訪問系統(tǒng)關(guān)鍵資源,并且獲取了一些鎖,當(dāng)進(jìn)程由于Oops異常退出時(shí),無法釋放已經(jīng)獲取的資源,導(dǎo)致其他需要獲取此資源的進(jìn)程掛起,對(duì)系統(tǒng)的正常運(yùn)行造成影響。通常這種情況,系統(tǒng)處在不穩(wěn)定的狀態(tài),很可能崩潰。
3.3?Panic
當(dāng)Oops發(fā)生在中斷上下文中或者在進(jìn)程0和1中 ,系統(tǒng)將徹底掛起(重啟),因?yàn)橹袛喾?wù)程序異常后,將無法恢復(fù),這種情況即稱為內(nèi)核panic。另外當(dāng)系統(tǒng)設(shè)置了panic標(biāo)志時(shí),無論Oops發(fā)生在中斷上下文還是進(jìn)程上下文,都將導(dǎo)致內(nèi)核Panic。由于在中斷復(fù)位程序中panic后,系統(tǒng)將不再進(jìn)行調(diào)度,Syslogd將不會(huì)再運(yùn)行,因此這種情況下,Oops的消息僅僅打印到串口上,不會(huì)被記錄在系統(tǒng)日志中。
?
4. 總結(jié):
kernel?panic一般會(huì)造成系統(tǒng)重啟,而Oops不一定會(huì)引起系統(tǒng)重啟,只是殺死相關(guān)進(jìn)程。
-
非中斷上下文的oops只是oops;
-
中斷上下文oops要panic;
-
如果設(shè)置了panic_on_oops,任何oops都是panic。
總結(jié)
以上是生活随笔為你收集整理的kernel panic 和 kernel Oops的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPU-Z 2.04 版本更新:支持一大
- 下一篇: 《流浪地球2》周边众筹超3500万 商家