TL

多段ページテーブルの構造(4/5レベルページング)

巨大な64bitアドレス空間を、なぜ数KBの表で表せるのか。x86-64の4/5レベルページングのインデックス分割とエントリ構造、巨大ページ、メモリ消費を構造で読み解けます。

応用ページテーブルx86-645レベルページングヒュージページ仮想記憶最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.x86-64は仮想アドレスの上位ビットを9bitずつ切り出し、各段512エントリ・1ページ4KBの表を木構造で連結して物理アドレスを引く。
  • 2.4レベルは48bit(256TB)、CR4のLA57で有効化する5レベルは57bit(128PB)の仮想空間を覆い、最上位段が1つ増えるだけで構造は同じ。
  • 3.中間段のエントリのPSビットを立てると、その段を葉として2MBや1GBの巨大ページに直結でき、表の段数とメモリ消費を削減できる。

単段では破綻する理由

仮想記憶のアドレス変換は、仮想ページ番号を物理フレーム番号へ写像する作業です。素朴には「仮想ページ番号で引ける1枚の配列」で済みますが、64bit 空間ではこれが成立しません。

4KB ページ(オフセット 12bit)で仮想アドレスを 48bit 使う場合、ページ番号は 36bit、エントリ数は 2 の 36 乗 = 約 687 億になります。1エントリ 8 バイトとして約 512GB の連続領域が、しかもプロセスごとに必要です。実際に触るのは空間のごく一部なのに、未使用分まで先に確保する設計は破綻します。

そこでページ番号を複数のフィールドに分割し、表を木構造にします。使う範囲だけ下位の表を割り当てればよく、疎なアドレス空間を省メモリで表現できます。これが多段ページテーブルです。

インデックスの分割:なぜ9bitずつなのか

x86-64 の 4 レベルページングは、48bit の仮想アドレスを次のように切ります。

仮想アドレス(48bit 使用、4KBページ)
[47:39] PML4   [38:30] PDPT   [29:21] PD   [20:12] PT   [11:0] オフセット
   9bit          9bit          9bit         9bit         12bit

各インデックスが 9bit なのは偶然ではありません。1段あたり 2 の 9 乗 = 512 エントリ、各エントリ 8 バイトなので、1つの表が 512 × 8 = 4096 バイト、ちょうど 1 ページに収まります。表自体もページとして管理でき、物理メモリのどの空きフレームにも置けるため、表の確保がページ割り当てと同じ仕組みで完結します。9bit という分割幅は、この「表=1ページ」を成立させる必然的な値です。

なお 48bit 目より上位([63:48])は使われず、最上位ビットの符号拡張(カノニカル形式)が要求されます。違反するアドレスはアクセス前にフォルトになります。

段の名前

4段の表は上から PML4(Page Map Level 4)、PDPT(Page Directory Pointer Table)、PD(Page Directory)、PT(Page Table)と呼びます。最上位の物理ベースは CR3 レジスタが指し、コンテキストスイッチのたびに CR3 を切り替えることでプロセスごとのアドレス空間を切り替えます。

エントリの構造

各表のエントリ(PTE 等)は 8 バイト固定で、上位側に次段の表または物理フレームの**物理アドレス(の上位ビット)**を、下位側に制御ビットを詰めます。主なビットはこうです。

ビット名前意味
bit 0P(Present)0なら未割り当て。参照するとページフォルト
bit 1R/W0は読み取り専用、1は書き込み可
bit 2U/Sユーザーモードからアクセス可か(カーネル領域の保護)
bit 5A(Accessed)参照されると1。置換アルゴリズムが利用
bit 6D(Dirty)書き込まれると1。書き戻し要否の判定に利用
bit 7PS(Page Size)中間段で1なら、その段を葉として巨大ページに直結
bit 63XD/NX1なら実行禁止。データ領域でのコード実行を防ぐ

物理アドレスを格納するフィールドが上位ビットなのは、4KB 境界に整列した表やフレームの下位 12bit が常に 0 だからです。その空いた下位 12bit に制御ビットを同居させる設計で、エントリ 1 つに「次へのポインタ」と「属性」を同梱しています。

MMU はウォーク中に各段でこれらを検査し、P が 0、権限違反、XD 違反などがあればページフォルトを発生させて OS に委ねます。アドレス変換とウォークの全体像はMMUとTLBの内部で扱っています。

5レベルページングの拡張

48bit(256TB)の空間でも巨大ですが、超大容量メモリのサーバーでは足りなくなります。そこで段を1つ増やしたのが5レベルページングです。

仮想アドレス(57bit 使用、4KBページ)
[56:48] PML5   [47:39] PML4   [38:30] PDPT   [29:21] PD   [20:12] PT   [11:0]
   9bit          9bit          9bit          9bit         9bit         12bit

最上位に PML5 を 1 段足すだけで、仮想アドレスは 57bit(128PB)まで広がります。下位 4 段の構造・エントリ形式は 4 レベルと同一で、CR3 は PML5 を指すようになります。有効化は CR4 レジスタの LA57 ビットで行い、OS が起動時に設定します。LA57 はシステム全体の設定で、プロセスごとに段数を切り替えるものではありません。互換性のため Linux では 5 レベルを有効にしても既定で 47bit 以下の領域だけを割り当て、明示的に要求したプロセスにのみ 47bit を超える広大な空間を渡す運用が一般的です。

ウォーク回数は1回増える

段が増えるとテーブルウォークの最悪メモリ参照回数も増えます。4レベルは最悪4回、5レベルは最悪5回の物理メモリアクセスが1変換に乗ります。TLB ヒット時は段数に関係なくウォークを丸ごと省けるため、5レベルでも TLB が効けば実害は小さく抑えられます。

巨大ページ:段を途中で打ち切る

中間段のエントリの PS ビットを立てると、MMU はそこを「葉」とみなし、それ以下の表をウォークしません。残りのインデックスとオフセットをまとめて、より大きなページ内オフセットとして扱います。

通常(4KB)  : PML4 → PDPT → PD → PT → 4KBフレーム
2MB巨大ページ: PML4 → PDPT → PD(PS=1) → 2MBフレーム   (PTを省略)
1GB巨大ページ: PML4 → PDPT(PS=1) → 1GBフレーム        (PD・PTを省略)

PD で打ち切ると、本来 PT が担う 9bit + オフセット 12bit = 21bit がオフセットになり、ページサイズは 2 の 21 乗 = 2MB です。PDPT で打ち切れば 30bit、すなわち 1GB ページになります。巨大ページの効果は二段階です。

  • 表のメモリ削減:末端の表(PT など)が不要になり、ページテーブル自体の消費が減る。
  • TLB リーチの拡大:1 つの TLB エントリが覆う範囲が広がり、TLB ミスとウォークの頻度が下がる。
巨大ページの代償

巨大ページは整列と連続性の要求が厳しく、物理メモリの断片化が進むと確保に失敗しやすくなります。また 1GB ページ 1 枚をスワップやコピーオンライトの対象にすると粒度が荒く、ごく一部の書き込みでも大きな単位で処理が走ります。用途に応じた使い分けが前提です。

メモリ消費を構造で見る

多段化の本質は「実際に使う範囲の表だけを割り当てる」点にあります。最小構成では、1 ページだけをマップするのに各段 1 枚ずつの表で足ります。

1ページ(4KB)だけをマップする最小コスト(4レベル)
  PML4 1枚 + PDPT 1枚 + PD 1枚 + PT 1枚 = 4枚 × 4KB = 16KB の表
  → 4KB のデータのために 16KB の表(疎なら割高だが定数で収まる)

重要なのは、この表の枚数がマップ範囲の広さではなく、触れた領域の散らばり方で決まることです。連続した領域なら 1 枚の PT(512 エントリ = 2MB 分)を多数のページで共有でき、表のオーバーヘッドは薄まります。逆にアドレス空間に飛び飛びでマップすると、各箇所で別々の下位表が要り、表が増えます。

連続2MBをマップ : PT 1枚(512エントリ)で 512ページを収容 → 表は実質1枚分
飛び飛び512ページ: 配置次第で PT が最大512枚に分散 → 表が大幅増
試験のポイント

「9bit 分割は表を 1 ページ(512×8=4KB)に収めるための設計」「4レベル=48bit、5レベル=57bit、最上位段が増えるだけ」「PS ビットで中間段を葉にし 2MB/1GB の巨大ページに直結」「CR3 が最上位段を指し、切替で空間を切り替える」の4点が頻出です。エントリは常に 8 バイトで、上位に物理アドレス・下位に属性ビットが同居する点も押さえてください。

まとめ

  • x86-64 は仮想アドレスの上位を 9bit ずつ切り出し、各段 512 エントリ・1 ページの表を木構造に連結して物理アドレスを引く。
  • 4レベルは 48bit、5レベルは LA57 で 57bit を覆い、最上位段が 1 つ増える以外は構造もエントリ形式も同じ。
  • エントリは 8 バイトで、上位に物理アドレス、下位に P/R/W/U/S/A/D/PS/NX などの属性を同梱する。
  • PS ビットで中間段を葉にすると 2MB/1GB の巨大ページに直結し、表のメモリと TLB ミスを減らせる。
  • 表の消費はマップ範囲の広さではなく散らばり方で決まり、連続配置ほど下位表を共有できて割安になる。

ウォークと TLB の詳細はMMUとTLBの内部、フォルト時の挙動はページングとスワップ、変換機構の応用はメモリマップトファイルも合わせてどうぞ。

OS Article

多段ページテーブルの構造(4/5レベルページング)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

ページテーブル

比較で見る軸

難易度: advanced / カテゴリ: OS / タグ数: 5

導入後に効く点

4レベルは48bit(256TB)、CR4のLA57で有効化する5レベルは57bit(128PB)の仮想空間を覆い、最上位段が1つ増えるだけで構造は同じ。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
OS
タグ数
5

判断チェックリスト

  • 自社の用途が「ページテーブル / x86-64」に近いか確認する。
  • 強みである「x86-64は仮想アドレスの上位ビットを9bitずつ切り出し、各段512エントリ・1ページ4KBの表を木構造で連結して物理アドレスを引く。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ページテーブルx86-645レベルページングヒュージページ仮想記憶ページテーブルx86-645レベルページング
参考: 公式情報