linux到底在何時panic

2021-09-21 04:10:05 字數 1357 閱讀 9132

遇到核心panic,我們很無奈,我們總是以為核心自動的檢查出了錯誤,然後panic了,可事實上,panic是乙個函式,需要顯式呼叫的,panic機制固然是一種檢查核心正常的好機制,可是其背後隱藏了大量核心開發者的心血,核心開發者必須知道什麼情況下核心屬於不正常狀態,然後顯式呼叫panic,如果此時不呼叫panic的話,說實話,系統還是會繼續執行的,然而結果會真的「不可預料」,在遇到惶恐之事件的時候,最好的辦法就是呆在原地,也就是panic。

對於純程式設計師來講,特別是習慣於使用「庫」的程式設計師來講,他們總是認為肯定「底層」會捕獲錯誤的,唯一的例外是c語言的malloc/free,用malloc/free來闡述panic機制應該再好不過了。malloc的記憶體當然要在不使用的時候free掉,然而即使你free了,這個記憶體對於作業系統來講可能還是可用的,也就是說在頁表中還是具有對映的,只是對於程式來講,它已經不能再使用了。作業系統和程式並不站在乙個層次考慮問題,作業系統比程式更底層,由於設計原因它只提供機制,因此它並不知道記憶體的實際用處,它對記憶體訪問的約束是很小的,只要求頁表中有對映即可,然而程式卻對記憶體的使用有著更多的依賴,且這種依賴並不為核心所知,因此應用程式必須自己管理記憶體的使用。

對於panic的機制而言,由於它是核心的機制,因此也不能指望更底層的機制發現錯誤並呼叫它,而是需要自己呼叫。更底層的無非就是cpu硬體了,對於cpu而言,它的約束更少,它只是順序得從物理記憶體中取得乙個指令,然後執行之,僅此而已,至於是什麼指令它不管。如果它取出的不是指令,cpu會觸發乙個異常,異常號為6,在作業系統初始化的時候需要設定這個異常處理程式:

set_trap_gate(6,&invalid_op);

這也許是cpu提供的最後的措施了,你完全可以在6號異常的處理函式中什麼都不做。接下來cpu只管不斷取出指令不斷執行。試想一種情況,如果panic函式所在的記憶體被清零了,會發生什麼?panic還會呼叫嗎?注意,cpu的hlt指令並不能使cpu停止執行,若想其停止執行,必須借助外部的電源電路。而且也不要覺得在作業系統中輸入reboot之後系統就會重啟,因此就認為cpu有所謂的復位功能,其實cpu並沒有復位,而僅僅跳轉到了計算機剛啟動時實模式的某乙個位址中去了。

c126c156 t panic

我們根據linux的記憶體對映模型,知道panic的實體地址是0x126c156,於是我們執行下面的操作:

dd if=/dev/zero of=/dev/mem bs=1 count=128 seek=0x126c156

然後寫乙個module,在init函式中直接呼叫panic,這樣我們在insmod的時候,核心會報段錯誤,因此即使你設定了kernel.panic=1,也不要指望系統在panic後1秒後重啟,因為系統根本就不會panic了,panic已經沒個球了。

正如應用程式設計師需要嚴守malloc/free一樣,核心的編寫者必須明確何時應該panic。

羅永浩到底在忙活啥

任何一次創業都必須要有遠大而高尚的目標。這是指引我們一次次摔倒又爬起來向前的旗幟。搞新東方英語培訓,講講gre課程,給更多人搭建實現夢想的階梯,是挺好乙個事。又在搞電子煙,暈死。為了創業而創業,很難有什麼前途和錢途。人工智慧會改變每個人的思維方式,成為人們的副腦,給整個社會帶來翻天覆地的變化,熨平知...

Xen的idle domain到底在幹啥

xen的4.之後,引入了tasklet的概念,以下以xen 4.10為具體例子,分析xen如何進入idle domain的 raise softirq schedule softirq schedule void 注意,如果next是idle domain的話,原來的sched timer是不被se...

Xen的idle domain到底在幹啥

xen的4.之後,引入了tasklet的概念,以下以xen 4.10為具體例子,分析xen如何進入idle domain的 raise softirq schedule softirq schedule void 注意,如果next是idle domain的話,原來的sched timer是不被se...