セグメンテーションフォールトとページフォールトの違いや関係は何だろうと思っていましたか?
セグメンテーション違反はセグメント化されたメモリモデルにのみ属しますか?
ページフォールトはページメモリモデルにのみ属しますか?
両方が「はい」の場合、x86やLinuxなどのほとんどのコンピューターシステムはセグメント化メモリモデルではなくページングメモリモデルを使用するため、GCC Cコンパイラがセグメンテーション違反エラーを報告することがあるのはなぜですか?
ありがとう、よろしく!
セグメンテーションフォールトとページフォールトの違いや関係は何だろうと思っていましたか?
セグメンテーション違反はセグメント化されたメモリモデルにのみ属しますか?
ページフォールトはページメモリモデルにのみ属しますか?
両方が「はい」の場合、x86やLinuxなどのほとんどのコンピューターシステムはセグメント化メモリモデルではなくページングメモリモデルを使用するため、GCC Cコンパイラがセグメンテーション違反エラーを報告することがあるのはなぜですか?
ありがとう、よろしく!
実際、これら2つのことは非常に異なります。セグメンテーション違反とは、プログラムが無効または不正なメモリアドレス(たとえば、0、または有効なポインタよりも大きい値)にアクセスしようとしたことを意味します。ページフォールトとは、ポインタが現在物理メモリにマップされていないアドレススペースのページにアクセスしようとするため、MMUが使用する前にディスクからページを取得する必要がある場合です。前者は違法な状態であり、プログラムは通常中止されます。後者は完全に正常であり、プログラムはそれについてさえ知りません。
「セグメント化」は、初期のx86プロセッサで使用されていた古い「セグメント化されたメモリモデル」とはまったく関係ありません。これは、メモリの一部またはセグメントを指すだけの以前の使用法です。
セグメンテーション違反は、メモリへのアクセスが許可されていない(存在しない、または禁止されている)場合に発生します。ほとんどの場合、null変数を逆参照するか、配列の最後から実行すると発生します。マップされているがロードされていないメモリにアクセスすると、ページフォールトが発生します。これらはエラーではなく、適切なページをメモリにロードする必要があることをオペレーティングシステムに通知します。