ページング入門

ゼロから、IA-32 アーキテクチャを勉強してみる。っと言っても intel のサイトのドキュメントを読んでまとめるだけ。
http://www.intel.com/products/processor/manuals/index.htm

IA-32 アーキテクチャのメモリ管理は「セグメンテーション」と、「ページング」の 2つの部分から構成される。

  • セグメンテーション: 論理アドレス(セグメントディスクリプタ + オフセット)からリニアアドレスへの変換
  • ページング:リニアアドレスから物理アドレスへの変換ページングは CR0 レジスタの PG(bit 31) が 1 の場合にのみ使用される(保護モードのときだけ?)。ページングは、メモリ内の paging structures で行われる。

以下、ページングに関してもう少し。

物理メモリは、IA-32 アーキテクチャでは、通常 4KB 単位で管理される。その管理単位は page と呼ばれる(4KB 毎にリニアアドレスと物理アドレスマッピングされる)。page のベースアドレスがわかれば、page 内の物理アドレスは、Page の ベースアドレス + オフセットで求まる。IA-32 アーキテクチャではリニアアドレスは、通常? 32 bit で構成される(プロセッサのモード次第では 64 bitになる)。以下、リニアアドレスが 32 bit で構成されている場合について述べる。

ページング処理(リニアアドレスから物理アドレスへの変換)は、paging structures によって行われる。paing structures は、階層構造をしており、下記から構成される。

CR3 は、変換対象のリニアアドレス空間を切り替える度に、適切なアドレスを設定する必要がある。つまり、CPU で動作するプロセスを変更するときに行う。

リニアアドレスの各ビットは、下記のように使用される。


dddddddddd tttttttttt oooooooooooo
31 22 21 12 11 0

d: Page Directory 内から Page Table を選択する際の index
t: Page Table 内から page を選択する際の index
o: page のベースアドレスに対するオフセット。

以下が自分が解釈する簡単な流れ。

  1. CR3 から Page Directory の物理アドレスを得る
  2. Page Directory から Page Table の物理アドレスを得る。リニアアドレスの [31:22] が Page Directory からエントリを選択するときに index として使用される。
  3. Page Table から Page のベースアドレスを得る。リニアアドレスの [21:12] が Page Table からエントリを選択するときに index として使用される。
  4. Page のベースアドレスにリニアアドレスの [11:0] を加えて、物理アドレスを得る。


ちなみに、IA-32e Mode で動作している場合は、リニアアドレスは64 bit になる。このとき、Paging Structures さらに PML4 Table、および Page Directory Pointer Table が追加され、CR3 は PML4 Table のアドレスを指すことになる。

PML4 TablePage: Page Directory Pointer Table の物理アドレスの配列
Page Directory Pointer Table: Page Directory の物理アドレスの配列

リニアアドレスから物理アドレスへの変換方法は、32 bit のときと基本的には同じだが、2 階層増えることになる。

  • 32 bit: CR3 → Page Directory → Page Table → 物理アドレス
  • 64 bit: CR3 → PML4 → Page Directory Pointer Table → Page Directory → Page Table → 物理アドレス

また、この場合リニアアドレスの各ビットは以下のように使用される。


nnn...nnn ppppppppp uuuuuuuuu ddddddddd ttttttttt oooooooooooo
63 48 47 39 38 30 29 21 20 12 11 0

n: 使用されない
p: PML4 Table から Page Directory Pointer Table を
選択する際の index
u: Page Directory Pointer Table から Page Directory を
選択する際の index
d: Page Directory 内から Page Table を選択する際の index
t: Page Table 内から page を選択する際の index
o: page のベースアドレスに対するオフセット