1

セグメンテーション フォールトが発生するたびに、常にページ フォールトが発生するのでしょうか。

Linux カーネル コードの経験がある方なら、ここでもコードを教えていただけますか?

私はすでに見ました:セグメンテーション違反とページ違反

4

2 に答える 2

8

ページフォールト (別名 #PF) は、セグメンテーション フォールト (存在しないページで一部のデータをアドレス指定する、適切なレベルの権限なしで保護されたページからデータを読み書きしようとする、非実行ページからコードをフェッチする、など) の一般的な原因です。 ..)。

ただし、セグメンテーション違反は、他のいくつかのまれな理由で発生する可能性があります。たとえば、要求された現在の特権レベル(CPL) なしで特権命令を実行しようとするとします。このサンプルを確認してください:

% cat segfault.c && gcc segfault.c -o segfault
int     main(void)
{
  __asm__("invd");

  return 0;
}

% ./segfault
Segmentation fault

このサンプルでは、​​segfaultはメモリとは関係ありません。invd命令は特権命令です (CPL が ring0 の場合のみ実行可能)したがって、ユーザー空間から実行することはできません。この命令を実行すると、一般保護違反(別名 #GP) 例外が発生します。カーネルは例外をキャッチし、問題のあるプログラムに kill シグナルを送信します。

于 2012-06-08T13:14:10.997 に答える
0

セグメンテーション違反は、次の状況でも発生する可能性があります。

a) パッチを適用することによってのみ修正できる、バグのあるプログラム/コマンド。

b) C プログラミングで配列の末尾を超えて配列にアクセスしようとしたときにも表示されることがあります。

c) chrooted jail 内では、これは重要な共有ライブラリ、構成ファイル、または /dev/ エントリが欠落している場合に発生する可能性があります。

d) 場合によっては、ハードウェアまたは障害のあるメモリまたはドライバーも問題を引き起こす可能性があります。

e) すべてのコンピュータ機器に対して推奨される環境を維持します (過熱によってもこの問題が発生する可能性があります)。

ページ フォールトが発生する理由:

a) 仮想メモリアドレスにアクセスしようとしています

b)命令オペランド/命令アドレス

c)リードデータ/ライトデータ、またはフェッチ命令

d) ページが「存在しない」可能性があります

e)ページが「読めない」可能性があります</p>

f) ページが「書き込み不可」である可能性があります</p>

g) ページが「表示されない」可能性があります</p>

于 2012-06-08T12:37:07.643 に答える