Linux
每當Linux中出現段錯誤時會發生什麼
每當硬體引發段錯誤時,Linux 核心會執行哪些步驟。現在我知道,通過 IDT,故障處理程序會處理它,並且在路上的某個地方,kern.log (dmesg) 中有一條關於故障的消息。
我問這個問題是因為我正在開發一個管理程序,並且每當使用者空間中出現段錯誤(不應該使系統崩潰)時,系統就會崩潰(崩潰僅發生在 kern.log 中的消息之後)。因此,如果我可以追溯核心在遇到段錯誤時所做的事情,那將對我有很大幫助。
- arch/x86/kernel/idt.c:152 -
page_fault
在 IDT 中使用- arch/x86/entry/entry_64.S:1143 -
page_fault
定義為 的包裝函式do_page_fault()
,使用宏實現idtentry
- arch/x86/entry/entry_64.S:847 -
idtentry
宏- 拱/x86/mm/fault.c:1562 -
do_page_fault()
到達
do_page_fault()
後,您應該會看到可點擊的連結來瀏覽其餘程式碼。對於前四個步驟,您不能這樣做,因為 Elixir 不了解宏觀魔法。它也不懂彙編。如果您需要查看任何其他陷阱,其他一些處理函式 (
do_*
) 又由另一個宏x86/kernel/traps.c:281DO_ERROR()
定義。記錄段錯誤消息的函式也在 fault.c: show_signal_msg()中。給你一點免費贈品。Elixir 通常不允許搜尋字元串,只能搜尋標識符。GitHub 也關閉了他們的程式碼搜尋。在任何情況下,如果不實際下載原始碼就很難搜尋此消息格式字元串,因為
"%s%s[%d]: segfault at %lx ip %px sp %px error %lx"
它不包含很多特定的單詞或片語:-)。以上鍊接指向 v5.0 原始碼的特定行號。使用Elixir,我真的很喜歡 :-)。