2012-02-09 5 views
1

x86のさまざまなsourcess Linuxによると、4つのセグメント(ユーザーコード、ユーザーデータ、カーネルコード、カーネルデータ)をすべて0x00000000と0xfffffに設定してセグメンテーションを取り除き、メモリアクセスを処理しようとしますページングレベルで。Linuxでセグメンテーションフォールトが発生する

この設定では、SIGSEGV(segfault)を入手するのはなぜ可能ですか?

ここではより広い "アクセス違反"で使用されるSIGSEGVがありますが、実際の原因はpagefaultですか?

答えて

2

あなたが言うように、SIGSEGVは「アクセス違反」として使用されています。
実際の原因は、現在のプロセスにマップされていないメモリへのポインタにアクセスしたことです。
これにはいくつかのバリエーションがあります(例:存在しないページ、存在しないセグメント、カーネルページ、読み取り専用ページへの書き込みなど)。それらはすべてSIGSEGVで終わります。

2

ページ違反は、バッキングメモリなしのページへのアクセスがある場合にのみセグメント違反になります。それ以外の場合、MMはディスクまたはスワップからページをロードしようとします。プロセスがNULLの逆参照などの愚かなプログラマーのエラーをキャッチするために保護されているため、プロセスがメモリーの最下部64KiBにアクセスしようとすると、セグメンテーション違反も起こります。

関連する問題