連載6回目では、OSのメモリー管理の概要について話したが、今回はより詳しくWindowsのメモリー管理について解説しよう。だが本題に入る前に、まずはWindowsが動作するx86 CPUが持つ「仮想記憶機構」について解説しておく必要があるだろう。
次期Windowsである「Windows 8」にはARM版も登場する予定だし、過去の「Windows NT」では、RISCプロセッサー向けが提供されていたこともあった。そもそもNTは当初、インテルの「i860」プロセッサー用として開発されたという経緯もある。しかし、現在はほぼすべてのWindowsがx86(64bit版のx64)上で動作しているので、Windowsの仮想記憶=x86の仮想記憶として解説する。
2段階の変換テーブルを使って
物理メモリーの位置を示すx86
x86はプログラムやデータを、「セグメント」という単位で扱う。セグメントはメモリー内の連続した範囲のことで、32bitモードではセグメントレジスターに格納された値がメモリー上の「セグメントセレクタ」を指定し、さらにセグメントセレクタがセグメントの開始位置やサイズを指定している。セグメントレジスターは「コードセグメント」(CS)や、「スタックセグメント」(SS)、およびデータ用のDS、ES、FS、GSの6種類がある。セグメントの単位は64KBか4GBの2種類があり、それぞれ16bitオフセット、32bitオフセットを利用する。
32bit Windowsでは「基本フラット・モデル」と呼ばれるメモリーモデルを採用する(図1)。このモデルでは、セグメントの位置やサイズを設定する「セグメントディスクリプタ」により、仮想メモリー全体の4GBをひとつのセグメントとして管理している。そのため仮想メモリー空間内のすべてのアドレスは、32bitの単純なアドレス(リニアアドレス)で表現できる。
このような構造を採用したのは、「他のアーキテクチャーとの兼ね合い」という理由もあった。x86のセグメントは扱いが面倒な部分もあり、これに依存してしまうプログラムを作ると、他機種への移植が困難になる。そのため仮想メモリー空間全体を、ひとつのセグメントとして扱うようにしたわけだ。
x86は物理メモリーを、4KBの「ページ」の集まりとして管理する。仮想記憶でのメモリーの割り当て単位はこの4KBであり、メモリーをスワップアウトするような場合には、ページ単位で扱う。
前述したリニアアドレスは仮想メモリー空間内のアドレスなので、実際のメモリーにアクセスするには、これを物理メモリーアドレスに変換する。仮想メモリー空間はプロセスごとに独立しているため、プロセスごとに仮想アドレスと物理アドレスの対応は異なる。
仮想メモリーアドレスを物理メモリーアドレスに変換するには、「アドレス変換」と呼ばれるCPU内の機構を使う。その際にリニアアドレスは、上位から10bit、10bit、12bitに区切って使われる。まずはCPU内のCR3レジスター(PDBR、ページディレクトリベースレジスターとも呼ぶ)が「ページディレクトリテーブル」と呼ばれるメモリー内の表の開始位置を指し示す。リニアアドレスの上位10bitは、このページディレクトリテーブル内のエントリの位置を示す(図2)。
ページディレクトリテーブルの各エントリには、ページテーブルの開始位置が記録されている。リニアアドレス中位10bitは、このページテーブル内のエントリを位置を示す。そしてページテーブルの各エントリは、ようやくページの物理アドレスを示す。リニアアドレスの下位12bit(12bitでは4096=4KB内の1byteを指定できる)は、ページ内のオフセットとなる。
こうして2段階のテーブルを参照することで、物理メモリー内にあるページを指し示すことができる。ページテーブルは20bitでページを指定するため、下位12bitのオフセットと合わせて、32bit(4GB)の物理メモリーを指定できる。つまり4KBのページを100万個指定できるわけだ。

この連載の記事
- 第13回 ARM版Windows 8実現の布石となったWindows 7の「MinWin」
- 第12回 アプリがWindowsの機能を使うには? APIとDLLの仕組み
- 第11回 マルチコアCPUの消費電力はスケジューリングで変わる?
- 第10回 AMD FX向けにパッチで修正 スケジューラーが抱える難題
- 第9回 マルチコアCPUを賢く使いこなす スケジューリングの秘密
- 第8回 意味の違いがわかる? タスクとプロセスとスレッド
- 第6回 メモリー不足を根本的に解決する64bit OSの仕組み
- 第5回 Windows 8でMetro Styleアプリを動かす「WinRT」
- 第4回 Windowsを動かすデバイスドライバーの仕組み 前編
- 第3回 OSの仕事はハードウェアをアプリから「隠す」こと?
- この連載の一覧へ