Linuxでセグフォルトが発生するたびにどうなりますか?

Linuxでセグフォルトが発生するたびにどうなりますか?

ハードウェアでセグフォルトが発生するたびに、Linuxカーネルはどのような手順を実行しますか?これで、エラーハンドラがIDTを介してそれを処理し、kern.log(dmesg)のどこかにエラーに関するメッセージがあることがわかりました。

私がこの質問をする理由は、ハイパーバイザーを開発しており、ユーザースペースにセグフォルトが発生するたびに(システムがクラッシュしてはいけません)、システムがクラッシュするためです(クラッシュはkern.logのメッセージの後にのみ発生します)。したがって、セグフォルトが発生したときにカーネルが何をしているのかを追跡することができれば、多くの役に立ちます。

ベストアンサー1

  1. アーチ/x86/kernel/idt.c:152page_fault-IDTの場合
  2. アーチ/x86/アイテム/entry_64.S:1143- で定義されたラッパーpage_fault関数do_page_fault()、マクロを使用して実装されていますidtentry
  3. アーチ/x86/アイテム/entry_64.S:847idtentry- マクロ
  4. アーチ/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ソースコードの特定の行番号にリンクするリンクです。使用万病薬、私は本当に好き:-)。

おすすめ記事