プロセッサが仮想メモリをサポートするには、MMU(メモリ管理ユニット)チップが必要ですか?)
ソフトウェアでMMU=機能をエミュレートすることは可能ですか?(パフォーマンスに大きな影響を与える可能性があることを私は認識しています)。
MMUを含むシステムをエミュレートするすべてのシステムエミュレータは、ソフトウェアでMMUを効果的にエミュレートするため、前述の質問に対する答えは「はい」です。ただし、仮想メモリにはメモリアクセス制御を強制する何らかの方法、または少なくともアドレス変換が必要であるため、制御されるソフトウェアを実行するCPUの完全なソフトウェアエミュレーションが必要です。 、またはハードウェアの支援が必要です。
したがって、おそらくMMUのないシステムを構築し、ポート [〜#〜] qemu [〜#〜] にシステムを構築し、不足している部分を追加して仮想メモリを実際に役立つようにすることができます(eg、ホストシステムでのスワップのサポートを追加)、およびゲストオペレーティングシステムで期待されるすべての保護を使用して、QEMUでMMUが必要なオペレーティングシステムを実行します( QEMUバグ)。
仮想メモリを提供するために使用されるMMUなしの「エミュレーション」の1つの実際の古い例は、8ビットシステムでコードとデータをページングおよびスワップできる Z-machine です。 70年代後半と80年代前半に。これは、基盤となる実際のプロセッサで仮想プロセッサをエミュレートすることで機能しました。このようにして、インタプリタは実行中のプログラムが「見る」メモリレイアウトを完全に制御し続けます。
実際には、MMUは少なくともオペレーティングシステムレベルで仮想メモリのサポートに必要です。示されているように MMU-less kernel? MMUのないシステムで実行できるようにLinuxカーネルを構築することは可能ですが、結果の構成は非常に珍しく、非常に特殊なユースケース(特に悪意のあるソフトウェアがない場合)にのみ適しています。仮想カーネルを必要とする多くのシナリオをサポートしない場合がありますメモリ(スワップ、mmap
...)。
それは、まさに仮想メモリと呼ばれるものに依存します。興味深いモデルは、古いWin16モデルです(Windows NTではなく、古いWindows 3.xで最もよく知られています)。そのモデルでは、GlobalLock
とGlobalUnlock
、LocalLock
とLocalUnlock
関数がありました。これらは、仮想メモリの協調的な手動管理の形式でした。これは(アプリケーション)ソフトウェアで行われたため、MMUは必要ありませんでした。また、メモリは、ロックされていないメモリをディスクに交換できるという意味で仮想でした。
ただし、Win16モデルでは、異なるプロセス間の保護はありません。別のプロセスがメモリにデータを残した場合、それを上書きすることができます。これは基本的な制限ではありません。最近の高速SSDでは、実行されていないプロセスをメモリから完全に削除し、妥当な時間内に削除することができます。
swap物理メモリとの間のプロセスを実行できるソフトウェアがある場合は、ハードウェアMMUは必要ありません。
これは、初期のマルチタスクオペレーティングシステムの動作モードでした。常にメモリに常駐しているプロセスは1つだけであり、タイムスライスが期限切れになると、そのプロセス全体がスワップアウトされます(大規模なプロセスで問題になることがわかります)。現在実行中のプロセスから見たメモリの内容は、他のプロセスから見たメモリの内容と同じではなく、それぞれにアドレス空間の独自のビューがあります。
いくつかのハードウェアサポートが役立ちます-OS独自の使用のための「保護された」メモリ領域の概念(たとえば、MSBが設定されたすべてのアドレスはスーパーバイザモードでのみアクセス可能)および使用中の最高のアドレスを示す「ブレーク」値ですが、メモリ管理ハードウェアは仮想メモリの絶対要件ではありません。それはそれを達成するための特に効果的な方法に過ぎません。
実行する元の商用マシンVMにはMMUがありませんでした–彼らはプロセッサにVMを組み込んでいました。私の現在の考えMMUは、VMを非VMプロセッサの上に置くための単なる後付けです。VMは、マンチェスター大学で開発され、バロウズの設計者は、それを含める–当時は非常に革新的ですが。
Burroughs B5000(現在のUnisys MCPマシン)は、メモリ境界を強制するメモリ記述子を使用していました–境界の外に出て、プログラムがダンプされます(境界を尊重することは、Nice社会の基本ですが、一部の特権は乱用されるため、境界を強制する必要があります)。
ディスクリプタは、メモリアドレス、ブロック長、およびデータタイプを保持しますが、重要なPビットまたはプレゼンスビットも保持します。 pビットは、ブロックがメモリ内にあることを示します。ゼロのpビットは、ブロックがマスストレージ上にあり、アドレスが、元のプログラム(コードまたはデータ)またはVM(ロールアウトされたデータ)内のストレージアドレスであることを意味します。 。
これらのマシンは、階層メモリモデルを実装しています。 MMUは、ユーザーオブジェクトをフラットメモリにマップする必要があるフラットメモリの欠点を補うようです。 J.K. IliffeはこのモデルでICLマシンも設計しました:
http://www.computerconservationsociety.org/resurrection/res74.htm#f
https://en.wikipedia.org/wiki/Burroughs_large_systems
これらのマシンと現在のほとんどのマシンの違いは、CPUアーキテクチャだけでなく、完全なシステムアーキテクチャに対応していることです。
したがって、MMUは必要ないだけでなく、MMUがなくてもシステムの方が適しているようです。