web-dev-qa-db-ja.com

Linuxでセグメンテーション違反が発生するとどうなりますか

ハードウェアがセグメンテーション違反を起こすたびにLinuxカーネルが実行する手順は何ですか。今のところ、IDTを介して障害ハンドラーがそれを処理し、道路沿いのどこかでkern.log(dmesg)に障害に関するメッセージがあることを知っています。

私はハイパーバイザーを開発しているので、この質問をしています。ユーザースペースにセグメンテーション違反があると(システムをクラッシュさせるべきではありません)、システムがクラッシュします(クラッシュはkern.logのメッセージの後でのみ発生します)。したがって、segfaultが発生するたびにカーネルが実行することをたどることができれば、非常に役立ちます。

2
dmg
  1. Arch/x86/kernel/idt.c:152 --_page_fault_はIDTで使用されます
  2. Arch/x86/entry/entry_64.S:114 --_page_fault_は、マクロidtentryを使用して実装されたdo_page_fault()のラッパー関数として定義されています。
  3. Arch/x86/entry/entry_64.S:847 --idtentryマクロ
  4. Arch/x86/mm/fault.c:1562 --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 を使用して、私は本当に好きです:-)。

3
sourcejedi

ユーザースペースはカーネルによって管理および実行されるため、ユーザースペース内でカーネルレベルのセグメンテーション違反が発生すると、カーネルに影響します。

各システムは、ログの設定、カーネルの設定、およびsystemdを使用しているかどうかに応じて異なる動作をします(ただし、dmesgは通常メインのデバッグ/ログの場所です)

特定の状況で、どのプロセスがセグメンテーション違反を生成するかがわかっている場合は、straceまたはgdb appnameを使用して問題のあるプロセスをデバッグします。

https://wiki.archlinux.org/index.php/Step-by-step_debugging_guide このガイドには、セグメンテーション違反をデバッグする方法の詳細が記載されています

1
tiff4455