仮想メモリとページングファイル
対象プロダクト:Windows全般
カテゴリー:アーキテクチャ
仮想メモリとは
仮想メモリは一言で言えば同時に実行されている複数のアプリケーションがコンピュータの物理メモリを共有できるようにするための機構です。
※仮想メモリと仮想8086モードとはまったく関係ありません。
仮想メモリはオペレーティングシステムの完全な管理下で管理されます。
そのため、アプリケーション側からは、物理メモリと仮想メモリの区別はできません。
アプリケーションにとっては仮想メモリも物理メモリも1つのメモリ領域です。
仮想メモリはコンピュータの物理メモリ(RAM)とハードディスク上の Windows スワップファイルから構成されます。
RAM とスワップファイルの間でプログラムセグメントとデータセグメントを出し入れしながら、オペレーティングシステムは利用可能な全メモリを管理します。
仮想メモリの仕組み
例えばコードセグメント上の命令を実行する場合、そのセグメントは RAM 上にロードされていなければならず、逆に他のコードセグメントは必要になるまでディスクのスワップファイル上に移動しておくことができます。
また、ディスクとのデータ転送を行う場合、データセグメント内のディスクデータ用のバッファ領域部分が RAM 上になければなりません。
もし、セグメントが RAM 上にない場合、オペレーティングシステムは対応するセグメントディスクリプタの P ビットをクリアし、セグメントがない事を記録します。
そしてそのセグメントにアクセスしようとした場合、i386 系プロセッサはセグメント不在割り込みを発生させ、問題が発生したことをオペレーティングシステムに通知します。
そしてオペレーティングシステムは存在しないセグメントを RAM の利用可能領域にロードし、割り込みを発生させたプログラムの実行を再開させます。
ページングファイル
i386 系プロセッサはページングによる仮想メモリの管理を強力にサポートします。
そのため、オペレーティングシステムはメモリの割り当て、再割り当て、スワッピングをページ単位で行うことができます。
メモリのページサイズは 4KB であり、各メモリセグメントは1つ以上のページから構成されます。
オペレーティングシステムは初期化処理時にプロセッサをプロテクトモードに切り換え、次にページング機能を有効にします。
一旦有効にされたページング機能はオペレーティングシステムをシャットダウンするまで働き続けます。
なお、データを仮想メモリから RAM 上に移動することをページイン、逆にデータを RAM 上から仮想メモリに移動することをページアウトと呼びます。
ページングによる仮想メモリアドレスのデコード
ページングによる仮想メモリアドレスのデコードは 32bit リニアアドレスで管理、実行されます。
この 32bit アドレスは次の3つのフィールドに分けられます。
- 22~31bit ページテーブルディレクトリのインデックス
- 12~21bit ページテーブルのインデックス
- 0~11bit ページオフセット
また、実行中のプログラム用のページテーブルディレクトリのアドレスは CR3 と呼ばれる CPU 内の特殊なレジスタに格納されます。
ページテーブルディレクトリ、ページテーブルには、ページテーブルインデックス、ページアドレス以外にフラグビット用の領域が用意されています。
用意されているフラグビットは以下になります。
- Dビット プログラムがメモリページの内容を変更すると、必ずプロセッサは対応するページテーブルのDビットをセットします。
- Aビット 読み込み、書き込み、実行などによりページが参照された場合、プロセッサは対応するページテーブルの対応するエントリのAビットをセットします。
- Pビット ページテーブルあるいはページテーブルが指すメモリページが実際に物理メモリ(RAM)上に存在する時のみ、Pビットがセットされます。
- U/Sビット U/Sビットは i386 系プロセッサの保護機能の一部になります。
- R/Wビット R/Wビットはそのメモリページへのアクセス権を持つプログラムが、そのページを書き換える事ができるかを示します。
そしてページをメモリから削除し、空間を開放した際、オペレーティングシステムはDビットを参照し、そのページをディスクに書き出す必要があるかどうかを判断します。
仮想メモリマネージャはページをメモリから削除してもよいかどうかを判断するためにAビットを参照します。
そしてプロセッサはPビットを基に、プログラムが存在しないページやページテーブルを参照しようとした際に、ページ不在割り込みを発生させ、次にオペレーティングシステムは該当ページを RAM 上にロードし、そのページを必要としたプログラムの実行を再開させます。
このビットがセットされていない場合、そのメモリページはスーパーバイザー用のページである事を示します。
もしユーザーレベルのプログラムがU/Sビットがセットされたページにアクセスした場合、一般保護違反エラーが発生します。
このビットがセットされている場合、ページの内容を書き換える事ができます。
通常、プログラムコードが格納されているページはこのビットはセットされておらず、読み出し専用ページとして設定されています。
公開日時:2011年11月25日 23:50:25