ハードウェアがセグメンテーション違反を起こすたびにLinuxカーネルが実行する手順は何ですか。今のところ、IDTを介して障害ハンドラーがそれを処理し、道路沿いのどこかでkern.log(dmesg)に障害に関するメッセージがあることを知っています。
私はハイパーバイザーを開発しているので、この質問をしています。ユーザースペースにセグメンテーション違反があると(システムをクラッシュさせるべきではありません)、システムがクラッシュします(クラッシュはkern.logのメッセージの後でのみ発生します)。したがって、segfaultが発生するたびにカーネルが実行することをたどることができれば、非常に役立ちます。
page_fault
_はIDTで使用されますpage_fault
_は、マクロidtentry
を使用して実装されたdo_page_fault()
のラッパー関数として定義されています。idtentry
マクロdo_page_fault()
do_page_fault()
に到達すると、残りのコードをナビゲートするためのクリック可能なリンクが表示されます。 Elixirはマクロの魔法を理解していないため、これらの最初の4つのステップではそれを行うことはできません。また、アセンブリを理解していません。
他のトラップを調べる必要がある場合は、他のハンドラー関数(_do_*
_)の一部が別のマクロ x86/kernel/traps.c:281DO_ERROR()
。
Segfaultメッセージをログに記録する関数もfault.cにあります: show_signal_msg() 。あなたのための少しの景品。 Elixirは一般に文字列の検索を許可せず、識別子のみを検索します。 GitHubはコード検索もシャットダウンしました。いずれにせよ、_"%s%s[%d]: segfault at %lx ip %px sp %px error %lx"
_には特定の単語やフレーズが多く含まれていないため、実際にソースコードをダウンロードせずにこのメッセージ形式の文字列を検索することは困難です:-)。
上記のリンクは、v5.0ソースコードの特定の行番号へのリンクです。 Elixir を使用して、私は本当に好きです:-)。
ユーザースペースはカーネルによって管理および実行されるため、ユーザースペース内でカーネルレベルのセグメンテーション違反が発生すると、カーネルに影響します。
各システムは、ログの設定、カーネルの設定、およびsystemdを使用しているかどうかに応じて異なる動作をします(ただし、dmesgは通常メインのデバッグ/ログの場所です)
特定の状況で、どのプロセスがセグメンテーション違反を生成するかがわかっている場合は、strace
またはgdb appname
を使用して問題のあるプロセスをデバッグします。
https://wiki.archlinux.org/index.php/Step-by-step_debugging_guide このガイドには、セグメンテーション違反をデバッグする方法の詳細が記載されています