15

大まかに言えば、カーネル (または CPU) は、プロセスが許可されていないメモリ位置にアクセスしようとしたことをどのように認識し、MMU と呼ばれる謎のハードウェアがそれをどのように支援するのか疑問に思っています。

特に: MMU は OS カーネルのメモリ管理モデル (ページング、メモリ ゾーン、プロセス アドレス空間など) にとらわれないように思えます (Linux と Windows のページはまったく同じではないと思います。例。間違っていたら訂正してください)。しかし、CPU は現在のコードが location にアクセスできるかどうかをどのように判断しますxか? そして、これをカーネルにどのように通知しますか?

4

2 に答える 2

13

これはおそらく、ここで完全に満足のいく回答をするには大きすぎるトピックです。仮想メモリ実装の背後にあるハードウェアについて説明している論文/記事/書籍を検索することをお勧めします (x86、x86_64、sparc などの間には大きな違いがあるため、おそらく特定のアーキテクチャから始めます)。

ただし、簡単に言えば、ハードウェアがページ テーブルを通じてこれを処理するということです。MMU が処理を要求されるすべてのメモリ アクセスは、ページ テーブル構造を通じて検証されます。要求されているアドレスを含むページを記述するページ テーブル エントリが、要求されているアクセスの種類 (読み取り/書き込み/実行/...) を許可するようにマークされていない場合、ハードウェアは、Linux が最終的に「セグメンテーション フォールト」と呼ぶトラップを生成します。 . 他の OS では別の名前が付けられています (一般保護違反など)。次に、OS カーネルは、障害の理由と、それに対して何かできるかどうかを判断する必要があります (多くのトラップは、カーネルによって処理され、ディスクから新しいページをスワップインしたり、新しい空のページをマップしたりします。ヌルポインター逆参照、カーネルができる最善のことは、アプリケーションにそれを投げて「

于 2012-12-18T16:10:38.183 に答える
8

MMU は、ページング モデルの実装のハードウェア部分になるように (カーネルによって設定されたロジックおよび/またはオプション ビットの設計によって) 構成されます。

MMU は通常、論理アドレスをマッピングされた物理アドレスに変換する必要があります。要求された論理アドレスに対応する物理アドレスがないためにそれができない場合、カーネルでハンドラー コードを実行する障害 (多くの場合、一種の割り込みとして) を生成します。

障害が、理論的に存在するもの (たとえば、マップされたファイルの一部) を要求しようとしたことであったが、現在は物理 RAM に存在しない場合、オペレーティング システムの仮想メモリ実装は、物理 RAM を割り当てて適切なディスク ブロックをコピーすることで問題を解決できます。それに。

しかし、それが存在しないものに対する要求である場合は、それを満たすことができず、プログラム フォールトとして処理する必要があります。

書き込みが許可されていない場所への書き込み要求も同様に処理されます。

私の頭の上では、実行可能でない情報を実行しようとする試みが MMU で検出されるのか、それとも CPU 自体で検出されるのかはわかりません。命令キャッシュが存在する場合、それにどのように適合するかによって、事態が複雑になる可能性があります。ただし、最終的な結果は同様です。つまり、カーネルが通常はプログラムの障害として処理する、不正な実行試行が発生したというカーネルの障害状態です。

要約すると、このモデルは、より単純なハードウェア レイヤーが、何か異常が発生したことをカーネルに通知し、ハードウェアが現在の構成を使用して単独で処理できないというものです。次に、オペレーティング システムは、試行されたことが発生する可能性があるかどうか、および発生する必要があるかどうかを判断します。そうである場合は、これを可能にするためにハードウェア構成を更新します。または、試行されたことが許可されるべきでない場合は、プログラムの障害が宣言されます。また、追加の可能性もあります。たとえば、仮想化レイヤーは、ハードウェアからの分離を維持しながら、要求された操作を文字通り実行するのではなく、エミュレートすることを決定できます。

于 2012-12-18T16:10:29.640 に答える