2009-06-24 3 views
3

私は、読み込み/書き込み/飛ばしたアドレス、すなわち、linux: "本当の"セグメンテーションフォルトハンドラはどこですか?

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

これはセグメンテーション違反を引き起こします。

システム(カーネル) の実際の部分は、マップされていないアドレスへの読み取り/書き込みをインターセプトするものですか?( ) "ユーザーモード"シグナルをスローしますか?

+1

ハードウェアサポートがあり、おそらくhttp://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protectionここでは、割り込みハンドラを探すべきでしょうか? – wds

答えて

4

すべてがアーキテクチャのトラップテーブルから流れ。これは通常entry.Sと呼ばれ(entry_32とentry_64.Sの間のx86上で分割されます)、適切なカーネルのCコードに入る前にいくつかのこと(configに依存します)を行うアセンブラリンケージを持っています。

無効なメモリアクセスは、page_faultまたはgeneral_protectionのどちらかを使用して入力する必要があります。最後にsend_signal(kernel/signal.c)のユーザースペースにキューイングされる前にforce_sig_infoが終了する可能性があります。

0

これは、異なるアーキテクチャ向けに実装されています。 は例えば、x86上で、あなたがでソースをチェックすることができます。

do_page_fault: linux/arch/x86/mm/fault.c 
+1

ページフォールトとセグメンテーションフォールトは全く異なるものです。 – SoapBox

0

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

関連する問題