web-dev-qa-db-ja.com

セグメンテーション違反とページフォールト

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

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

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

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

ありがとう、よろしく!

26
Tim

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

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

29

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

9
c4757p