2

これは純粋に学術的な質問ですが、プログラムがアクセスできないメモリへのアクセス要求が行われると、OS によってセグメンテーション違反がスローされることを理解しています。
私の質問は、メモリの変更はありますか、それとも OS はすべての不正な動作を防止しますか?

また、OS がメモリの破損を防止している場合は、プログラムを閉じるよりも、セグメンテーション違反をキャッチして回復を試みた方がよいのではないでしょうか (重要なプログラムと考えてください)。

4

2 に答える 2

3

不正な書き込みが検出された場合、ほぼ確実にハードウェアによって停止されます。アドレスが完全に無効な場合、他に何ができるかわからないため、ハードウェアは障害を発生させます (そこにはメモリがないため、破損することはありません)。読み取り専用としてマークされている場合、ハードウェアは書き込みブロックして障害を発生させる必要がありますが、それはハードウェアに依存します (他の動作を確認するには、かなり専門的なシステムを使用します)。

ただし、不正書き込みが検出されない場合があります。つまり、ハードウェアは違いを見分けることができず、わざわざ言及することもありません。これは、ハードウェアがページ (通常は 4kB の大きさ) で動作するためですが、データ構造がすべてそれらのページ境界で開始および停止するわけではないためです。有効なメモリの末尾とページの末尾の間にスペースが残っている場合、そのスペースへの書き込みは保護されません。

また、書き込みは、アプリケーション所有しているが、アプリケーションがビジネス書き込みを行っていないメモリへの書き込みである可能性があります。たとえば、アプリケーションと同じシステム権限の下でライブラリ コードによって操作されるヒープ内のデータ構造がありますが、(ライブラリではなく) アプリケーションがそれに書き込もうとした場合、それは明らかな不運の兆候です。ハードウェアは必ずしも違いを認識できるとは限らないため、障害は発生しません。

トラップして回復しようとすることについては... アプリケーションが実行に適した状態であることはめったにありません。検出できるすべての書き込みに対して、クラックをすり抜けた書き込みがさらに多く存在し、検出されない破損を引き起こし、問題をさらに悪化させている可能性があります。最初の障害アクセスが検出され、メモリが破損していない場合でも、通常、アプリケーションが代わりに何をすべきかを判断する方法はありません。

アプリケーションの続行を許可すると、システムに害を及ぼすまで (すべての CPU を使い果たす、ファイルにガベージを書き込む、画面にガベージを描画する、公共の場所に機密情報をコピーするなど)、おそらくより多くの障害が発生し、次第にナンセンスな動作が発生します。 .)。逆に、それを殺して既知の状態から再起動すると、より予測可能な動作になるはずです。

余談として; ハードウェア レベルで障害を検出して続行することは、実際には OS によってサイレントに行われますが、特定の条件下でのみ行われます。最初は、少量のメモリのみがアプリケーションに割り当てられます。アプリケーションがまだマッピングされていないものを参照すると、ハードウェアは (上記のように) 障害を発生させますが、OS は状況を検査し、アクセスがアプリケーションが使用できるメモリであるかどうかを判断します。もしそれが間違いだったら。前者の場合、ハードウェアを再構成してメモリを正しい場所にマップし、アプリケーションが何も起こらなかったかのように続行できるようにします。

于 2013-07-12T14:00:01.760 に答える
2

簡単な回答: はい、メモリが変更される前にセグメンテーション違反がスローされます。

長い答えは、仮想メモリおよび/またはメモリ保護の内部の仕組みに入ります。メモリは複数のブロックに分割されていると考えることができます。オペレーティング システムは、ブロックごとに、実行なし、書き込みなし、読み取りなしなどのいくつかの属性を設定できます。

これらの属性は、メモリ保護ユニット (MPU) またはMMUによって解析され、実際のアクセスが行われる前にチェックされます。試行されたアクセスがセットアップの制限に違反した場合、MMU は実行を停止し、オペレーティング システムに状況を処理するよう信号を送ります。

その後、オペレーティング システムは通常、このシグナルの原因となっているプロセスを停止します。

このメカニズムはページベースであることを知っておくことが重要です。これは、「範囲外の配列」や同様の効果などをキャッチできないことを意味します。これは非常に粗粒度のツールであり、例のコード ページの整合性を維持するのに役立ちます。

于 2013-07-12T10:38:22.457 に答える