マップされていないアドレスに読み取り/書き込み/ジャンプした場合。
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
これにより、セグメンテーション違反が発生します。
マップされていないアドレスへの読み取り/書き込みを傍受し(どのように?)、「ユーザーモード」信号をスローするシステム(カーネル)の実際の部分は何ですか?
マップされていないアドレスに読み取り/書き込み/ジャンプした場合。
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
これにより、セグメンテーション違反が発生します。
マップされていないアドレスへの読み取り/書き込みを傍受し(どのように?)、「ユーザーモード」信号をスローするシステム(カーネル)の実際の部分は何ですか?
すべてがアーキテクチャ トラップ テーブルから流れます。これは通常、entry.S (x86 では entry_32 と entry_64.S の間で分割) と呼ばれ、適切なカーネルの C コードに入る前に、(構成に応じて) 多くのことを行うアセンブラー リンケージがあります。
そのため、無効なメモリ アクセスは page_fault または general_protection のいずれかを介して入力する必要があり、最終的に send_signal (kernel/signal.c) のユーザー空間にキューイングされる前に force_sig_info を実行することになります。
「ブック E」ではない PowerPC チップ (組み込みシステム用の最近のチップなど) では、セグメンテーション違反は例外 0x300 (データ用) または 0x400 (命令用) で始まります。ユーザー/スーパーバイザー モード フラグはスーパーバイザーに設定されます。 MMU がオフになり、CPU がアドレス 0x300 または 0x400 にジャンプして、オペレーティング システムに制御を渡します。
さまざまなアーキテクチャ用に実装されています。たとえば、x86 では、次の場所でソースを確認できます。
do_page_fault: linux/arch/x86/mm/fault.c