このエントリーをはてなブックマークに追加

仮想メモリとページングファイル

対象プロダクト: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ビットをセットします。
    そしてページをメモリから削除し、空間を開放した際、オペレーティングシステムはDビットを参照し、そのページをディスクに書き出す必要があるかどうかを判断します。
  • Aビット
  • 読み込み、書き込み、実行などによりページが参照された場合、プロセッサは対応するページテーブルの対応するエントリのAビットをセットします。
    仮想メモリマネージャはページをメモリから削除してもよいかどうかを判断するためにAビットを参照します。
  • Pビット
  • ページテーブルあるいはページテーブルが指すメモリページが実際に物理メモリ(RAM)上に存在する時のみ、Pビットがセットされます。
    そしてプロセッサはPビットを基に、プログラムが存在しないページやページテーブルを参照しようとした際に、ページ不在割り込みを発生させ、次にオペレーティングシステムは該当ページを RAM 上にロードし、そのページを必要としたプログラムの実行を再開させます。
  • U/Sビット
  • U/Sビットは i386 系プロセッサの保護機能の一部になります。
    このビットがセットされていない場合、そのメモリページはスーパーバイザー用のページである事を示します。
    もしユーザーレベルのプログラムがU/Sビットがセットされたページにアクセスした場合、一般保護違反エラーが発生します。
  • R/Wビット
  • R/Wビットはそのメモリページへのアクセス権を持つプログラムが、そのページを書き換える事ができるかを示します。
    このビットがセットされている場合、ページの内容を書き換える事ができます。
    通常、プログラムコードが格納されているページはこのビットはセットされておらず、読み出し専用ページとして設定されています。

公開日時: 2011年11月25日  23:50:25

このエントリーをはてなブックマークに追加
Windowsサブシステム(User、Kernel、GDI)とサンクレイヤ | ブートローダーの表示が英語になり文字化けした場合の修復方法

Windows技術情報の一覧に戻る

「アーキテクチャ」に関する他の技術情報
技術情報のカテゴリ

このページのトップに戻る