ハードウェアでセグフォルトが発生するたびに、Linuxカーネルはどのような手順を実行しますか?これで、エラーハンドラがIDTを介してそれを処理し、kern.log(dmesg)のどこかにエラーに関するメッセージがあることがわかりました。
私がこの質問をする理由は、ハイパーバイザーを開発しており、ユーザースペースにセグフォルトが発生するたびに(システムがクラッシュしてはいけません)、システムがクラッシュするためです(クラッシュはkern.logのメッセージの後にのみ発生します)。したがって、セグフォルトが発生したときにカーネルが何をしているのかを追跡することができれば、多くの役に立ちます。
ベストアンサー1
- アーチ/x86/kernel/idt.c:152
page_fault
-IDTの場合 - アーチ/x86/アイテム/entry_64.S:1143- で定義されたラッパー
page_fault
関数do_page_fault()
、マクロを使用して実装されていますidtentry
- アーチ/x86/アイテム/entry_64.S:847
idtentry
- マクロ - アーチ/x86/mm/fault.c:1562-
do_page_fault()
そこに到達すると、残りのdo_page_fault()
コードをナビゲートできるクリック可能なリンクが表示されます。 Elixirはマクロの魔法を理解していないため、最初の4つのステップではこれを行うことはできません。また、アセンブリを理解していません。
異なるトラップをチェックする必要がある場合は、異なるdo_*
マクロによって異なるハンドラ関数()が定義されています。x86/カーネル/traps.c:281 DO_ERROR()
。
分割エラーメッセージを記録する関数もFault.cにあります。ショーシグナルメッセージ()。ここにあなたのための小さな無料があります。 Elixirは通常の文字列検索を許可せず、識別子のみを検索できます。 GitHubはコード検索も終了しました。とにかく、このメッセージフォーマット文字列には"%s%s[%d]: segfault at %lx ip %px sp %px error %lx"
特定の単語やフレーズがたくさん含まれていないので、実際にソースコードをダウンロードしないと検索するのは難しいです。
上記のリンクは、v5.0ソースコードの特定の行番号にリンクするリンクです。使用万病薬、私は本当に好き:-)。