Linux

每當Linux中出現段錯誤時會發生什麼

  • May 2, 2019

每當硬體引發段錯誤時,Linux 核心會執行哪些步驟。現在我知道,通過 IDT,故障處理程序會處理它,並且在路上的某個地方,kern.log (dmesg) 中有一條關於故障的消息。

我問這個問題是因為我正在開發一個管理程序,並且每當使用者空間中出現段錯誤(不應該使系統崩潰)時,系統就會崩潰(崩潰僅發生在 kern.log 中的消息之後)。因此,如果我可以追溯核心在遇到段錯誤時所做的事情,那將對我有很大幫助。

  1. arch/x86/kernel/idt.c:152 -page_fault在 IDT 中使用
  2. arch/x86/entry/entry_64.S:1143 -page_fault定義為 的包裝函式do_page_fault(),使用宏實現idtentry
  3. arch/x86/entry/entry_64.S:847 -idtentry
  4. 拱/x86/mm/fault.c:1562 -do_page_fault()

到達do_page_fault()後,您應該會看到可點擊的連結來瀏覽其餘程式碼。對於前四個步驟,您不能這樣做,因為 Elixir 不了解宏觀魔法。它也不懂彙編。

如果您需要查看任何其他陷阱,其他一些處理函式 ( do_*) 又由另一個宏x86/kernel/traps.c:281 DO_ERROR()定義。

記錄段錯誤消息的函式也在 fault.c: show_signal_msg()中。給你一點免費贈品。Elixir 通常不允許搜尋字元串,只能搜尋標識符。GitHub 也關閉了他們的程式碼搜尋。在任何情況下,如果不實際下載原始碼就很難搜尋此消息格式字元串,因為"%s%s[%d]: segfault at %lx ip %px sp %px error %lx"它不包含很多特定的單詞或片語:-)。

以上鍊接指向 v5.0 原始碼的特定行號。使用Elixir,我真的很喜歡 :-)。

引用自:https://unix.stackexchange.com/questions/516676