32
  1. セグメンテーションフォールトとページフォールトの違いや関係は何だろうと思っていましたか?

  2. セグメンテーション違反はセグメント化されたメモリモデルにのみ属しますか?

    ページフォールトはページメモリモデルにのみ属しますか?

    両方が「はい」の場合、x86やLinuxなどのほとんどのコンピューターシステムはセグメント化メモリモデルではなくページングメモリモデルを使用するため、GCC Cコンパイラがセグメンテーション違反エラーを報告することがあるのはなぜですか?

ありがとう、よろしく!

4

2 に答える 2

39

実際、これら2つのことは非常に異なります。セグメンテーション違反とは、プログラムが無効または不正なメモリアドレス(たとえば、0、または有効なポインタよりも大きい値)にアクセスしようとしたことを意味します。ページフォールトとは、ポインタが現在物理メモリにマップされていないアドレススペースのページにアクセスしようとするため、MMUが使用する前にディスクからページを取得する必要がある場合です。前者は違法な状態であり、プログラムは通常中止されます。後者は完全に正常であり、プログラムはそれについてさえ知りません。

「セグメント化」は、初期のx86プロセッサで使用されていた古い「セグメント化されたメモリモデル」とはまったく関係ありません。これは、メモリの一部またはセグメントを指すだけの以前の使用法です。

于 2011-08-05T01:53:58.690 に答える
11

セグメンテーション違反は、メモリへのアクセスが許可されていない(存在しない、または禁止されている)場合に発生します。ほとんどの場合、null変数を逆参照するか、配列の最後から実行すると発生します。マップされているがロードされていないメモリにアクセスすると、ページフォールトが発生します。これらはエラーではなく、適切なページをメモリにロードする必要があることをオペレーティングシステムに通知します。

于 2011-08-05T01:51:19.043 に答える