フラットメモリモデルと保護メモリモデルの違いは? VxWorks はフラット メモリ モデルをサポートしていますが、Linux もフラット メモリ モデルをサポートしていますか?
1 に答える
理にかなった答えを出すために、まずいくつかの概念を復習しましょう。
最近のほとんどのプロセッサには、さまざまな目的で使用されるメモリ管理ユニット (MMU) があります。
目的の 1 つは、仮想アドレス (CPU が「認識する」アドレス) と物理アドレス (チップが実際に接続されている場所) をマッピングすることです。これをアドレス変換と呼びます。
もう 1 つの目的は、特定の仮想メモリ ロケーションのアクセス属性を設定することです (メモリが読み取り/書き込み、読み取り専用、またはアクセス不可など)。
MMU を使用すると、プロセッサの仮想アドレスが物理アドレスと同じである (つまり、アドレス変換を使用しない) 「ユニティ マッピング」と呼ばれるものを持つことができます。たとえば、プロセッサが 0x10000 にアクセスする場合、物理的な位置 0x10000 にアクセスしています。
「フラット」メモリ モデルは通常、CPU がアクセスする仮想アドレスが一意であるという事実を指します。したがって、32 ビット CPU の場合、最大 4G のアドレス空間に制限されます。
仮想メモリと物理メモリの間のユニティ マッピングを参照するために最も頻繁に使用されます (必ずというわけではありません)。
対照的に、ワークステーションの世界では、ほとんどのオペレーティング システム (Linux/Windows) が「オーバーラップ」メモリ モデルを使用しています。たとえば、Windows で起動するプログラム (プロセス) の開始アドレスは 0x10000 です。
ウィンドウでアドレス 0x10000 から 10 個のプロセスをすべて実行するにはどうすればよいですか?
これは、各プロセスが MMU を使用して仮想アドレス 0x10000 を異なる物理アドレスにマップするためです。P1 には 0x10000 = 0x10000 があり、P2 には 0x10000 = 0x40000 などがあります...
RAM では、プログラムは異なる物理アドレスにありますが、CPU 仮想アドレス空間は各プロセスで同じように見えます。
私の知る限り、Windows と標準 Linux は常にオーバーラップ モデルを使用しています (つまり、フラット モデルはありません)。uLinux またはその他の特別なカーネルがフラット モデルを持つ可能性があります。
現在、保護は、フラット モデルと保護モデルとは何の関係もありません。ほとんどのオーバーラップ モデル OS は、あるプロセスが別のプロセスに影響を与えないように (つまり、メモリに書き込みを行わないように)、保護を使用します。
VxWorks 6.x とリアルタイム プロセスの導入により、フラット メモリ モデルであっても、個々の RTP は保護を使用して相互 (およびカーネル アプリ) から保護されます。
RTP を使用せず、vxWorks カーネルですべてを実行する場合、保護は使用されません。
では、保護はどのように機能するのでしょうか (VxWorks RTP であれ、他の OS プロセスであれ)。基本的に、RTP/プロセスは、コード、データ、ヒープ、およびその他のさまざまなメモリ位置を含む特定の範囲の (仮想) アドレスを持つ「メモリ バブル」内に存在します。
RTP/プロセスがバブル外のメモリ位置にアクセスしようとすると、MMU が例外を生成し、OS (またはシグナル ハンドラ) が呼び出されます。一般的な結果は、セグメント違反/バス例外です。
しかし、プロセスがメモリ バブルから逃れられない場合、プロセスはどのようにしてパケットをイーサネット ポートに送信できるでしょうか。これはプロセッサのアーキテクチャによって異なりますが、基本的には、ユーザー側 (RTP) ソケット ライブラリ (たとえば) が「システム コール」を作成します。これは、CPU をカーネル空間とスーパーバイザ モードに切り替える特別な命令です。この時点で、ある種のデバイス ドライバー (通常はカーネルに常駐) が実行され、データがハードウェア デバイスにプッシュされます。それが完了すると、システム コールが返され、ユーザー コードを実行する RTP/プロセス空間に戻ります。
OS は、すべての MMU プログラミング、システム コール処理などを処理します。これは、アプリケーションからは見えません。