最近のシステムのほとんどは、メモリを 4 ~ 64 KB の大きさのページに分割し、しばしば 2 MB または 1 GB の大きさのいわゆる巨大ページを使用する機能もあります(両方の変形が可能な場合も多くあります)。 ページの変換は、変換ルックサイドバッファ(TLB)にキャッシュされます。 いくつかのシステム、主に古いRISCデザインは、ページ変換がTLBで見つからない場合、OSにトラップします。 ほとんどのシステムでは、ハードウェアベースのツリーウォーカーを使用しています。 ほとんどのシステムではMMUを無効にすることができますが、OSコードにトラップするときにMMUを無効にするものもあります。

VAXEdit

VAX ページは512バイトで、これは非常に小さいものです。 OSは複数のページをあたかも1つの大きなページであるかのように扱うことがあります。 例えば、VAX上のLinuxでは、8つのページをグループ化している。 したがって、システムは4KBのページを持っているように見える。 VAXでは、メモリを4つの固定目的領域に分割しており、それぞれ1GBの大きさになっています。 P0空間 ヒープなどのプロセス単位の汎用メモリに使用します。 P1 スペース (または制御スペース) これもプロセス単位で、通常はスーパーバイザ、エグゼクティブ、カーネル、ユーザー・スタック、その他オペレーティング・システムによって管理されるプロセス単位の制御構造に使用されます。 S0スペース(またはシステムスペース)は、すべてのプロセスに対してグローバルであり、ページングされているかどうかにかかわらず、オペレーティングシステムのコードとデータ(ページテーブルを含む)を格納します。 S1 スペース 未使用で「デジタルに予約」されているスペースです。

ページテーブルは大きな線形配列です。 通常、可能な範囲の両端でアドレスを使用する場合、これは非常に無駄なことですが、アプリケーション用のページテーブルは、それ自体がカーネルのページドメモリに格納されています。 したがって、事実上2レベルのツリーが存在し、アプリケーションは未使用のページテーブルエントリで多くのスペースを浪費することなく、疎なメモリレイアウトを持つことができる。 VAXのMMUは、アクセスされるビットを欠いているのが特徴です。 ページングを実装するOSは、効率的に動作させるためには、アクセスされたビットをエミュレートする何らかの方法を見つけなければなりません。 典型的には、OS は定期的にページをアンマップして、ページが存在しないフォールトを使用して OS にアクセス済みビットを設定させます。

ARMEdit

ARM アーキテクチャベースのアプリケーションプロセッサは、ARM の仮想メモリシステム・アーキテクチャで定義された MMU を実装しています。 現在のアーキテクチャでは、4 KB および 64 KB ページ、1 MB セクション、16 MB スーパー セクションを記述するための PTE が定義されており、レガシー バージョンでは 1 KB のタイニー ページも定義されています。 ARM では、4 KB および 64 KB ページを使用する場合は 2 レベルのページ テーブルを使用し、1 MB セクションおよび 16 MB セクションでは 1 レベルのページ テーブルのみを使用します。 PTE には、特権に基づく読み取り/書き込みアクセス許可、キャッシュ可能性情報、NX ビット、および非セキュア ビットが含まれます。

IBM System/360 Model 67、IBM System/370 および後継製品編集

1965 年 8 月に登場した IBM System/360 Model 67 には、動的アドレス変換 (DAT) ボックスという MMU が含まれていました。 これは、アクセスされたビットとダーティなビットをページ・テーブルの外に保存するという珍しい機能を備えています(すべてのS/360プロセッサの4ビット保護キーと一緒です)。 これらは仮想メモリではなく物理メモリを参照し、特別な目的の命令によってアクセスされる。 これにより、OSのオーバーヘッドが削減され、ページテーブルからアクセスされたビットとダーティビットを、より物理的なデータ構造に伝搬させる必要があるのです。 これは、後に準仮想化と呼ばれる OS レベルの仮想化を容易にします。

1972 年 8 月に開始された IBM System/370 は、当初 System/360 Model 67 の 32 ビット仮想アドレス空間ではなく 24 ビット仮想アドレス空間のみをサポートしましたが、同様の MMU を備えています。 また、アクセスされたビットとダーティビットをページテーブルの外に保存しています。 1983 年初頭、System/370-XA アーキテクチャは仮想アドレス空間を 31 ビットに拡張し、2000 年には 64 ビット z/Architecture が導入され、アドレス空間が 64 ビットに拡張されました; これらは引き続き、ページテーブルの外にアクセスされたビットとダーティビットを保存します。 TLBがミスした後、低レベルファームウェアのマシンコード(ここではPALcodeと呼ぶ)は、3レベルのツリー構造のページテーブルをウォークする。 アドレスは次のように分解される。 21ビットが未使用、10ビットがツリーのルートレベルのインデックス、10ビットがツリーのミドルレベルのインデックス、10ビットがツリーのリーフレベルのインデックス、13ビットがそのまま物理アドレスにパススルーされる。 フルリード/ライト/エグゼキュート許可ビットがサポートされています。

MIPSEdit

MIPSアーキテクチャは、TLBに1~64エントリをサポートしています。 TLBエントリ数は、合成前のCPUコンフィギュレーションで設定可能です。 TLBエントリーはデュアルです。 各TLBエントリは、ページマスクの一部ではない仮想アドレスの最下位ビットに応じて、仮想ページ番号(VPN2)を2つのページフレーム番号(PFN0またはPFN1)のいずれかにマッピングする。 このビットとページマスクビットは、VPN2には格納されない。 各TLBエントリは、それ自身のページサイズを持ち、それは1KBから256MBまでの4の倍数の任意の値とすることができる。 TLBエントリ内の各PFNは、キャッシュ属性、ダーティ、有効ステータスビットを持つ。 VPN2は、グローバルステータスビットと、グローバルステータスビットが0に設定されている場合に仮想アドレスTLBエントリのマッチングに参加するOS割り当てIDを有する。 PFNは、ページマスクビットを除いた物理アドレスを格納します。

TLBリフィル例外は、マップされた仮想アドレスに一致するエントリがTLB内に存在しない場合に生成されます。 TLB無効例外は、一致するものがあるが、エントリが無効とマークされている場合に生成されます。 TLB修正例外は、ストア命令がマップされたアドレスを参照し、一致するエントリーのダーティ・ステータスが設定されていない場合に生成されます。 TLB例外、ダブルフォールトTLB例外の処理中にTLB例外が発生した場合、独自の例外ハンドラにディスパッチされます。

MIPS32 および MIPS32r2 は32ビットの仮想アドレス空間および最大36ビットの物理アドレス空間をサポートします。 MIPS64 は最大 64 ビットの仮想アドレス空間と最大 59 ビットの物理アドレス空間をサポートしている。

Sun 1Edit

オリジナルの Sun 1 は、Motorola 68000 マイクロプロセッサを中心に構築されたシングルボードコンピュータで、1982 年に発表された。 CPU上で動作する複数のプロセスに対して、アドレス変換、メモリ保護、メモリ共有、メモリ割り当てを行うオリジナルのSun 1メモリ管理ユニットを搭載しています。 CPUからプライベートオンボードRAM、外部Multibusメモリ、オンボードI/O、Multibus I/OへのアクセスはすべてMMUを経由し、アドレス変換と保護が一律に行われる。 MMUはCPUボード上にハードウェアで実装されている。

MMUはコンテキスト・レジスタ、セグメント・マップ、ページ・マップから構成されている。 CPUからの仮想アドレスはセグメントマップによって中間アドレスに変換され、その中間アドレスはページマップによって物理アドレスに変換される。 ページサイズは2KB、セグメントサイズは32KBで、1セグメントあたり16ページとなる。 最大16個のコンテキストを同時にマッピングすることができる。 1つのコンテキストの最大論理アドレス空間は、1024ページまたは2MBです。

コンテキスト・レジスタは、CPU がすべての変換状態情報を再ロードすることなくプロセスを切り替えられるようにするため、マルチタスクのオペレーティング・システムにおいて重要である。 4 ビットのコンテキスト・レジスタは、スーパーバイザ制御でセグメント・マップの 16 セクションを切り替えることができ、これにより 16 コンテキストを同時にマッピングすることができます。 各コンテキストは独自の仮想アドレス空間を持っている。 異なるコンテキストのセグメントマップやページマップに同じ値を書き込むことで、仮想アドレス空間の共有やコンテキスト間の通信を行うことができる。 セグメント・マップをコンテキスト・キャッシュとして扱い、古くなったコンテキストを最も最近に使用されたベースで置き換えることにより、追加のコンテキストを処理することができます。 割り込みとトラップはコンテキストを切り替えないため、すべての有効な割り込みベクターは、有効なスーパバイザスタックと同様に、常にコンテキストのページ 0 にマップされる必要があります。 TLB ミスの後、標準の PowerPC MMU は 2 つの同時ルックアップを開始します。 1つのルックアップでは、4つまたは8つのデータブロックアドレス変換(DBAT)レジスタ、または4つまたは8つの命令ブロックアドレス変換レジスタ(IBAT)のうちの適切な1つにアドレスを一致させようと試みます。 BATレジスタは、256MBという大きなメモリのリニアチャンクをマップすることができ、通常OSがOSカーネル自身の使用するアドレス空間の大部分をマップするために使用される。 BAT 検索が成功すると、他の検索は停止して無視されます。

このファミリーのすべてのプロセッサで直接サポートされていない他の検索は、いわゆる「反転ページ テーブル」を介して行われ、TLB のオフチップ拡張としてハッシュ化されたものとして機能します。 まず、アドレスの上位4ビットを使って、16個のセグメントレジスタのいずれかを選択する。 その後、セグメントレジスタの24ビットがこの4ビットに置き換えられ、52ビットのアドレスが生成される。 セグメント レジスタの使用により、複数のプロセスが同じハッシュ テーブルを共有することができます。 そこで、8 ページのテーブル エントリのグループをスキャンして、一致するものを探します。 ハッシュの衝突が多いために一致するものがない場合、プロセッサはわずかに異なるハッシュ関数で再試行します。 これも失敗すると、CPUはOSにトラップし(MMUは無効)、問題を解決することができる。 OSはハッシュテーブルからエントリーを破棄して、新しいエントリーのためのスペースを確保する必要があります。 OSは新しいエントリをより通常のツリー型ページテーブルから生成するか、より低速でスペース効率のよいマッピング単位のデータ構造から生成することができる。 実行なし制御のサポートはセグメント レジスタにあり、256 MB の粒度につながります。

この設計の主な問題は、ハッシュ関数によるキャッシュのローカリティの低さです。 ツリーベースの設計では、隣接するページのページ テーブル エントリを隣接する場所に配置することにより、これを回避します。 PowerPC 上で動作するオペレーティング システムは、この問題を軽減するためにハッシュ テーブルのサイズを最小にすることがあります。 OS は、これに直面するのを遅らせるためにセグメント値の再利用を避けるか、またはプロセスごとのハッシュ テーブルに関連するメモリの浪費に悩まされることを選択するかもしれません。 G1チップはページテーブルエントリを検索しませんが、OSがソフトウェアで標準ハッシュテーブルを検索することを想定して、ハッシュを生成しています。 OSはTLBに書き込むことができます。 G2、G3、および初期のG4チップは、ハッシュテーブルを検索するためにハードウェアを使用しています。 最新のチップでは、OSがどちらの方法も選択できるようになっている。 9395>

IA-32 / x86Edit

x86 アーキテクチャは、OS コードでさえ完全なソフトウェア互換性を維持しながら、非常に長い時間をかけて進化してきました。 そのため、MMUは非常に複雑で、さまざまな動作モードが考えられます。 ここでは、従来の80386CPUとその後継機種(IA-32)の通常動作について説明します。

CPUは、主にメモリを4KBのページに分割しています。 古い 8088 や 80286 の MMU 設計の基本であるセグメント・レジスタは、最近の OS では使用されません。ただし、アプリケーションのスレッド固有データや OS カーネルの CPU 固有データへのアクセスは、FS および GS セグメント・レジスタを明示的に使用して行われます。 すべてのメモリ・アクセスは、実行するコードに応じて選択されるセグメント・レジスタを伴います。 セグメントレジスタはテーブルへのインデックスとして機能し、仮想アドレスに追加されるオフセットを提供する。 FSやGSを使用する場合を除いて、OSはオフセットが0になるようにします。

オフセットが追加された後、アドレスは32ビットより大きくならないようにマスクされます。 結果は、アドレスのビットが次のように分割されたツリー構造のページ・テーブルを介して検索されることがあります。 10ビットがツリーの分岐、10ビットが分岐の葉、そして最下位の12ビットが結果に直接コピーされます。 W^X 機能を持つ OpenBSD や Exec Shield または PaX パッチを適用した Linux など、一部のオペレーティングシステムでは、アドレス空間の変更可能な領域でコードを実行できないように、CS レジスタで指定するコードセグメントの長さを制限することもできます。

Pentium で導入された MMU のマイナーリビジョンは、ツリーの最下層をスキップすることにより、非常に大きな 4 MB ページを許可しました (これは、ページ階層の最初のレベルのインデックス付けに 10 ビットを残し、残りの 10+12 ビットは結果に直接コピーされます)。 Pentium Proで導入されたMMUのマイナーリビジョンでは、物理アドレス拡張(PAE)機能が導入され、3レベルのページテーブルに2+9+9ビットの36ビット物理アドレスが可能になり、下位12ビットが結果に直接コピーされるようになりました。 また、ツリーの最下層をスキップすることで大容量ページ(2MB)も利用できる(結果的に2レベルのテーブル階層では2+9ビット、残りの9+12ビットの最下位ビットが直接コピーされる)。 さらに、ページ属性テーブルでは、CPU 上の小さなテーブルでいくつかの上位ビットを調べることにより、キャッシュ可能性を指定できました。

No-execute サポートはもともとセグメント単位でしか提供されていなかったため、非常に使いにくいものとなっていました。 より最近の x86 チップは、PAE モードでページごとの非実行ビットを提供します。 上記の W^X, Exec Shield, PaX メカニズムは、NX ビットを持たないマシン x86 プロセッサのページ単位の非実行サポートを、性能低下と利用可能なアドレス空間の減少を伴うコードセグメントの長さの設定によってエミュレートしています。

x86-64Edit

Heterogeneous System Architecture (HSA) は、CPU、GPU、DSP のための統一仮想アドレス空間を生み出し、マッピングトリックとデータコピーを廃止します。

x86-64 は x86 の 64 ビット拡張で、386 以降のプロセッサ用のほぼすべてのオペレーティング システムで使用されているフラット メモリ モデルを採用し、セグメント化をほぼ完全に除去しています。 ロングモードでは、FS と GS セグメントを除き、すべてのセグメントオフセットは無視されます。 4 KB ページで使用する場合、ページテーブルツリーは 3 レベルではなく 4 レベルになります。

仮想アドレスは次のように分割されます。 未使用の 16 ビット、4 つのツリーレベルにそれぞれ 9 ビット (合計 36 ビット)、そして最下位の 12 ビットは結果に直接コピーされます。 2MBのページでは、ページテーブルは3レベルのみで、ページングに使用するビットが27ビット、オフセットが21ビットとなります。 一部の新しい CPU は、2 レベルのページングと 30 ビットのオフセットを持つ 1 GB ページもサポートしています。

CPUID を使用して、1 GB ページがサポートされているかどうかを判断することができます。 3 つのケースとも、最上位 16 ビットが 48 ビットと等しいこと、言い換えれば、下位 48 ビットが上位ビットに符号拡張されることが要求されます。 これは、後方互換性を損なうことなく、将来のアドレス可能な範囲の拡張を可能にするために行われます。 9395>

Unisys MCP Systems (Burroughs B5000)Edit

このセクションは、読者に混乱や不明な点がある可能性があります。 このセクションを明確にするためにご協力ください。 これについては、トークページで議論があるかもしれません。 (2020年9月)(このテンプレートメッセージを削除する方法とタイミングを学ぶ)

1961年のバロウズB5000は、MMUを持たないにもかかわらず、(アトラスの後に)仮想メモリをサポートした最初の商用システムです。 仮想メモリアドレスとメモリ保護というMMUの二つの機能を、異なるアーキテクチャのアプローチで提供しています

まず、仮想メモリアドレスのマッピングでは、MMUが必要ない代わりにMCPシステムはディスクリプタベースになっています。 割り当てられた各メモリ・ブロックには、そのブロックの特性(サイズ、アドレス、メモリ内に存在するかどうかなど)を記したマスター・ディスクリプタが与えられる。 読み書きのためにブロックにアクセスする要求がなされたとき、ハードウェアは記述子の存在ビット(pbit)を介してブロックの存在を確認します。 この場合、ブロックはディスクリプタの物理アドレスでアクセスできる。 pbitが0の場合、MCP(オペレーティング・システム)に対して、ブロックを存在させるための割り込みが発生する。 アドレスフィールドが0であれば、このブロックへの最初のアクセスであり、ブロックが確保される(init pbit)。 アドレスフィールドが0でない場合、それは以前にロールアウトされたブロックのディスクアドレスであるため、ディスクからブロックをフェッチし、pbitを1に設定し、物理メモリアドレスはメモリ内のブロックを指すように更新されます(別のpbit)。 このため、ディスクリプタはMMUシステムにおけるページテーブルエントリと等価となる。 システムの性能は、pbitの数によってモニターすることができる。 Init pbit は初期割り当てを示しますが、その他の pbit が多い場合はシステムがスラッシングしている可能性を示します。

したがって、すべてのメモリ割り当ては完全に自動であり (最新システムの特徴の 1 つ)、このメカニズム以外のブロック割り当ての方法は存在しないのです。 メモリブロックも自動的に破棄されるため、malloc や dealloc といった呼び出しは存在しない。 また、実際に参照されるまでブロックは確保されないので、この方式は遅延型である。 メモリがほぼ一杯になると、MCP は作業セットを調べ、圧縮を試み(システムはページングではなくセグメント化されているため)、読み取り専用セグメント(元のコピーから復元できるコードセグメントなど)を割り当て解除し、最後の手段として、ダーティデータセグメントをディスクにロールアウトさせるのです。 すべてのアクセスは記述子を介して行われるため、ハードウェアはすべてのアクセスが範囲内であること、書き込みの場合はプロセスが書き込み許可を持っていることを確認できます。 MCPシステムは本質的に安全であるため、このレベルのメモリ保護を提供するMMUは必要ない。 ディスクリプタはユーザプロセスに対して読み取り専用であり、システム(ハードウェアまたはMCP)によってのみ更新される可能性があります。 (タグが奇数のワードは読み取り専用で、ディスクリプタはタグが 5、コードワードは 3 です)

ブロックはプロセススタックのコピーディスクリプタを介してプロセス間で共有することができます。 したがって、あるプロセスには書き込み権限があり、他のプロセスには書き込み権限がないことがあります。 コードセグメントは読み取り専用であるため、リエントラントで、プロセス間で共有される。 コピーディスクリプタは20ビットのアドレスフィールドを持ち、マスターディスクリプタ配列中のマスターディスクリプタのインデックスを与えます。 これは、非常に効率的で安全なIPC機構を実装しています。 ブロックの状態が変化したときに更新が必要なのはマスター記述子だけなので、ブロックは簡単に再配置できます。

他の唯一の側面は性能で、MMU ベースのシステムと非 MMU ベースのシステムはどちらが良い性能を提供しますか。 MCP システムは、MMU を持つ標準的なハードウェア(例えば、標準的な PC)の上に実装されるかもしれません。 システム実装が何らかの方法でMMUを使用したとしても、これはMCPレベルでは全く見えません。

コメントを残す

メールアドレスが公開されることはありません。