歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux到底在何時panic

Linux到底在何時panic

日期:2017/2/28 16:16:20   编辑:Linux教程

遇到內核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並沒有復位,而僅僅跳轉到了計算機剛啟動時實模式的某一個地址中去了。

現在先在/proc/kallsyms中找到panic的地址:

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。

Copyright © Linux教程網 All Rights Reserved