盡管內核代碼的大部分 bug 以 oops 消息結束, 有時候它們可能完全掛起系統. 如果系 統掛起, 沒有消息打印. 例如, 如果代碼進入一個無限循環, 內核停止調度,[15]15 並且系 統不會響應任何動作, 包括魔術 Ctrl-Alt-Del 組合鍵. 你有 2 個選擇來處理系統掛起-
- 或者事先阻止它們, 或者能夠事后調試它們.
你可阻止無限循環通過插入 schedule 引用在戰略點上. schedule 調用( 如你可能猜到 的 )調度器, 因此, 允許別的進程從當前進程偷取 CPU 數據. 如果一個進程由於你的驅 動的 bug 而在內核空間循環, schedule 調用使你能夠殺掉進程在跟蹤發生了什么之后.
你應當知道, 當然, 如何對 schedule 的調用可能創造一個附加的重入調用源到你的驅動, 因為它允許別的進程運行. 這個重入正常地不應當是問題, 假定你在你的驅動中已經使用 了合適的加鎖. 然而, 要確認在你的驅動持有一個自旋鎖的任何時間不能調用 schedule.
如果你的驅動真正掛起了系統, 並且你不知道在哪里插入 schedule 調用, 最好的方式是 加入一些打印消息並且寫到控制台(如果需要, 改變 console_loglevel 值).
有時候系統可能看來被掛起, 但是沒有. 例如, 這可能發生在鍵盤以某個奇怪的方式保持 鎖住的時候. 這些假掛起可通過查看你為此目的運行的程序的輸出來檢測. 一個你的顯示 器上的時鍾或者系統負載表是一個好的狀態監控器; 只要他繼續更新, 調度器就在工作.
對許多的上鎖一個必不可少的工具是"魔術 sysrq 鍵", 在大部分體系上都可用. 魔鍵 sysrq 是 PC 鍵盤上 alt 和 sysrq 鍵組合來發出的, 或者在別的平台上使用其他特殊鍵 (詳見 documentation/sysrq.txt), 在串口控制台上也可用. 一個第三鍵, 與這 2 個一 起按下, 進行許多有用的動作中的一個:
r 關閉鍵盤原始模式; 用在一個崩潰的應用程序( 例如 X 服務器 )可能將你的鍵盤搞成 一個奇怪的狀態.
k 調用"安全注意鍵"( SAK ) 功能. SAK 殺掉在當前控制台的所有運行的進程, 給你一個 干凈的終端.
s 進行一個全部磁盤的緊急同步.
u umount. 試圖重新加載所有磁盤在只讀模式. 這個操作, 常常在 s 之后馬上調用, 可 以節省大量的文件系統檢查時間, 在系統處於嚴重麻煩時.
b boot. 立刻重啟系統. 確認先同步和重新加載磁盤. p 打印處理器消息.
t 打印當前任務列表. m 打印內存信息.
實際上, 多處理器系統仍然在其他處理器上調度, 甚至一個單處理器的機器可能重新調度, 如果內核搶占被使能.
然而, 對於大部分的通常的情況( 單處理器不使能搶占), 系統一起停止調度.
有別的魔術 sysrq 功能存在; 完整內容看內核源碼的文檔目錄中的 sysrq.txt. 注意魔 術 sysrq 必須在內核配置中顯式使能, 大部分的發布沒有使能它, 因為明顯的安全理由. 對於用來開發驅動的系統, 然而, 使能魔術 sysrq 值得為它自己建立一個新內核的麻煩. 魔術 sysrq 可能在運行時關閉, 使用如下的一個命令:
echo 0 > /proc/sys/kernel/sysrq
如果非特權用戶能夠接觸你的系統鍵盤, 你應當考慮關閉它, 來阻止有意或無意的損壞. 一些以前的內核版本缺省關閉 sysrq, 因此你需要在運行時使能它, 通過向同樣的
/proc/sys 文件寫入 1.
sysrq 操作是非常有用, 因此它們已經對不能接觸到控制台的系統管理員可用. 文件
/proc/sysrq-trigger 是一個只寫的入口點, 這里你可以觸發一個特殊的 sysrq 動作, 通過寫入關聯的命令字符; 接着你可收集內核日志的任何輸出數據. 這個 sysrq 的入口 點是一直工作的, 即便 sysrq 在控制台上被關閉.
如果你經歷一個"活掛", 就是你的驅動粘在一個循環中, 但是系統作為一個整體功能正常, 有幾個技術值得了解. 經常地, sysrq p 功能直接指向出錯的函數. 如果這個不行, 你還 可以使用內核剖析功能. 建立一個打開剖析的內核, 並且用命令行中 profile=2 來啟動 它. 使用 readprofile 工具復位剖析計數器, 接着使你的驅動進入它的循環. 一會兒后, 使用 readprofile 來看內核在哪里消耗它的時間. 另一個更高級的選擇是 oprofile, 你 可以也考慮下. 文件 documentation/basic_profiling.txt 告訴你啟動剖析器所有需要 知道的東西.
在追逐系統掛起時一個值得使用的防范措施是以只讀方式加載你的磁盤(或者卸載它們). 如果磁盤是只讀或者卸載的, 就沒有風險損壞文件系統或者使它處於不一致的狀態. 另外 的可能性是使用一個通過 NFS, 網絡文件系統, 來加載它的全部文件系統的計算機, 內核 的"NFS-Root"功能必須打開, 在啟動時必須傳遞特殊的參數. 在這個情況下, 即便不依靠 sysrq 你也會避免文件系統破壞, 因為文件系統的一致有 NFS 服務器來管理, 你的設備 驅動不會關閉它.