3

マップされていないアドレスに読み取り/書き込み/ジャンプした場合。

.text
    .global _start
_start:
     movl   $1,%edx
     jmp     *%edx

これにより、セグメンテーション違反が発生します。

マップされていないアドレスへの読み取り/書き込みを傍受し(どのように?)、「ユーザーモード」信号をスローするシステム(カーネル)の実際の部分は何ですか?

4

3 に答える 3

4

すべてがアーキテクチャ トラップ テーブルから流れます。これは通常、entry.S (x86 では entry_32 と entry_64.S の間で分割) と呼ばれ、適切なカーネルの C コードに入る前に、(構成に応じて) 多くのことを行うアセンブラー リンケージがあります。

そのため、無効なメモリ アクセスは page_fault または general_protection のいずれかを介して入力する必要があり、最終的に send_signal (kernel/signal.c) のユーザー空間にキューイングされる前に force_sig_info を実行することになります。

于 2009-06-24T11:34:06.233 に答える
0

「ブック E」ではない PowerPC チップ (組み込みシステム用の最近のチップなど) では、セグメンテーション違反は例外 0x300 (データ用) または 0x400 (命令用) で始まります。ユーザー/スーパーバイザー モード フラグはスーパーバイザーに設定されます。 MMU がオフになり、CPU がアドレス 0x300 または 0x400 にジャンプして、オペレーティング システムに制御を渡します。

于 2009-09-28T03:00:32.987 に答える
0

さまざまなアーキテクチャ用に実装されています。たとえば、x86 では、次の場所でソースを確認できます。

do_page_fault: linux/arch/x86/mm/fault.c  
于 2009-06-24T09:27:20.080 に答える