1. 序章
ユーザープログラムがメモリを割り当てたい場合、 オペレーティングシステム(OS) これを行うには、システムコールを実行します。 このようにして、OSは実行中のすべてのプロセス間でメモリを適切に管理できます。
それを超えて、OSは実装します 仮想メモリ メモリサイズの一部を一時的にハードドライブに移動できるようにすることでメモリサイズを拡張することを主な目的としています。
このメカニズムでは、特定のメモリアドレスが物理メモリにない場合があります。 そのための解決策は、物理アドレスの代わりに仮想アドレスを使用することです。
2. 仮想メモリ
仮想メモリの主なアイデアの1つは ページング。 これは基本的に、メモリを同じサイズ(通常は4KB)のページと呼ばれる部分に分割することで構成されます。
この分割がないと、すべての物理アドレスを仮想アドレスにマップするために、少なくとも同じ量のメモリが必要になることに注意してください。 代わりに、後で説明するように、仮想アドレスをページの物理アドレスに変換できます。
ページのアドレスと、それらが物理メモリに保存されているかハードドライブに保存されているかに関する情報は、ページテーブル構造に保持されます。
各ページテーブルエントリ(PTE)には、そのメモリページが物理メモリのどこに配置されているかを示す情報が含まれています。
ページテーブルには、そのメモリページを所有するプロセスに関する情報など、他のセキュリティ情報も表示されます。これは、プロセスが別のプロセスのメモリに書き込む必要がないためです。 ただし、この記事では、物理的なページ情報のみに焦点を当てましょう。
メモリ管理ユニット(MMU)は、アドレス変換を管理するハードウェアデバイスです。 このデバイスはCPUの一部です。 一方、OSは、ページをハードドライブに移動し、RAMに戻す役割を果たします。 翻訳プロセス中にそれらがどのように相互作用するかを見てみましょう。
3. 翻訳プロセス
次のように、メモリ位置に値を割り当てるための簡単な命令を含むプログラム(たとえば、C言語)があるとします。
a = 42;
OSにプログラムの実行を依頼し、CPUへの実行を処理します。 CPUがこの命令を読み取ると、MMUに要求します aの物理アドレス。
次に、MMUはアドレスを読み取り、ページ番号を示す部分を抽出します。 この仮想ページ番号を使用して、トランスレーションルックアサイドバッファ(TLB)にクエリを実行し、パフォーマンスの最適化のために、MMUチップ内にキャッシュされたページテーブルの一部で構成される物理ページ番号を取得します。
ページがTLBで見つからない場合、MMUはメモリ内の元のページテーブルに移動します。 取得したページテーブルエントリを使用して、MMUは物理アドレスを変換し、CPUがそのアドレスにアクセスできるようにします。
しかし、そのページがメモリに存在しない場合はどうなりますか? この場合、MMUは、ハードドライブからそのページを取得するOSによって処理されるページフォールト例外を発生させます。 これが発生すると、OSはページ置換アルゴリズムを使用して、最近使用されておらず、ハードドライブに移動できる別のページを判別します。
ここで、MMUがアドレスを変換できる場合に戻り、変換がどのように実行されるかを確認します。
4. 翻訳
前のセクションの例を思い出してください。ここでは、変数に値を割り当てたいと考えていました。 a、およびその仮想アドレスが0x00018004であると仮定します(単に印刷することで確認できます) &a)32ビットシステムの場合。
この仮想アドレスは2つの部分で読み取られます。1つはページテーブル内のPTEへのポインタであるページの番号であり、もう1つはそのページ内のアドレスのオフセットです。
4KBのページサイズで作業している場合、特定のページの最新の位置をアドレス指定するために12ビットが必要です。 したがって、オフセット部分は仮想アドレスの最初の12ビットで構成されます。
残りの20ビット(32ビットシステム)は、ページ番号を示すために使用されます。 この場合、最大1,048,576ページを使用できます。 その場合、仮想アドレスは次のようになります。
MMUがページ番号を抽出すると、値0x00018を取得し、TLBからこのページエントリを探します。 次に、それが物理ページ番号0x0020に変換されることがわかります。
この例では、オフセット部分は0x004であり、これは物理ページ番号に連結され、物理アドレス0x0020004に到達します。 仮想アドレスの各部分がどのように使用されて物理アドレスに変換されるかを以下で確認できます。
5. 結論
仮想メモリは、システムが物理RAMをはるかに超えてメモリを拡張できるようにする重要な機能であり、仮想アドレスと物理アドレス間の変換がこのメカニズムの鍵となります。 それを効率的に実現するために、ハードウェア(MMU)とソフトウェア(OS)の両方が連携して動作します。
変換自体は、メモリ内の仮想ページと物理ページ、およびページ内の各アドレスのオフセットを追跡するためにページテーブルを維持することに依存しています。
また、システムの実装方法によって異なるタイプのページテーブルが存在する可能性があることに注意することも重要です。 場合によっては、ページテーブルがディレクトリに階層的に編成されていることがあり、ページディレクトリの追加の解決が必要になることがあります。