メインコンテンツへスキップ
  1. Posts/

仮想アドレスはどのように物理アドレスになるのか? MMU、TLB、ページテーブル、page fault

NineKoo9
著者
NineKoo9
目次

このドキュメントは疑問に思っていた点をAIエージェントとの対話を通じて整理したメモです。仮想アドレスが物理アドレスに変換されるフローを基準に、MMU、TLB、ページテーブル、page faultを整理します。

仮想アドレスはどのように物理アドレスになるのか?
#

TLB / MMU / OSメモリ管理者(MMS)


目次
#

  1. MMUとTLBの役割と違い
  2. ページングシステムとページテーブルの問題
  3. TLBの詳細説明
  4. Context SwitchとTLB
  5. MMU vs TLBの比較まとめ
  6. OSメモリ管理者(MMS)

1. MMUとTLBの役割と違い
#

全体像 — ハードウェア構造
#

CPU
┌─────────────────────────────────────┐
│  ALU / Register / Control Unit      │
│                                     │
│  ┌─────────────────────────────┐    │
│  │         MMU                 │    │
│  │  ┌───────────────────────┐  │    │
│  │  │   TLB (変換キャッシュ) │  │    │
│  │  └───────────────────────┘  │    │
│  │  ページテーブルウォークロジック │  │
│  └─────────────────────────────┘    │
│                                     │
│  ┌───────────────┐                  │
│  │  L1/L2 Cache  │                  │
│  └───────────────┘                  │
└──────────────┬──────────────────────┘
               │ 物理アドレス
         [ RAM (DRAM) ]

MMUはCPU側のハードウェアアドレス変換ユニットだ。
説明の便宜上「CPUとメモリの間」と言うことがあるが、実際にはCPUに統合されたアドレス変換ハードウェアと理解する方が近い。
TLBはその中で最近の変換結果をキャッシュする小さなハードウェアキャッシュだ。


2. ページングシステムとページテーブルの問題
#

ページサイズを小さくすると?
#

非連続なメモリ割り当てポリシーでページングシステムを使う場合、
ページサイズを小さくすると内部断片化は減るがページテーブルが巨大になる問題が発生する。

計算例
#

以下は32bitアドレス空間、4KBページ、エントリ4byte、単一レベルページテーブルを単純に仮定した計算だ。

32bitアドレス空間、4KBページ基準
→ ページ数 = 2^32 / 2^12 = 2^20 = 約100万エントリ
→ エントリ1つあたり4byte → ページテーブル1つ = 4MB
→ プロセス100個 = 400MBがページテーブルだけで消費

現代のシステムはアドレス空間がより大きく、実際には使用していない区間も多い。
そのため階層型(多段階)ページテーブルを使用してページテーブルのメモリ無駄を減らす。

パフォーマンス問題 — page table walkのコスト
#

ページテーブル自体はメモリにある。
したがってTLB missが発生するとMMUはpage table walkを実行して必要なエントリを読み込む必要がある。

  • 単一レベルのテーブルのみを仮定すると「ページテーブル1回 + 実際のデータ1回」のように説明できる。
  • しかし現代のCPUは多段階ページテーブルを使うため、TLB miss時に追加のメモリ参照が必要になる場合がある。
  • 実際のコストはCPU cache、page walk cacheの有無によって変わる。

つまり核心は**「メモリアクセスが常に正確に2倍」**ではなく、
**「TLB missはコストが高く、だから変換キャッシュが重要だ」**という点だ。


3. TLB (Translation Lookaside Buffer)
#

役割
#

最近使用された仮想アドレス → 物理アドレス変換結果をキャッシュするハードウェアキャッシュ。

動作フロー
#

CPUが仮想アドレスを生成
   ┌───────────┐
   │ TLB参照   │──── TLB Hit ──→ 物理アドレスを即時返却
   └───────────┘
         │ TLB Miss
   MMUがPage Table Walkを実行
   (メモリにあるページテーブルを巡回)
   物理アドレスを取得 → TLBに保存 → 返却

TLBの特徴
#

項目内容
保存対象最近使用した仮想アドレス → 物理アドレス変換結果
位置MMUが活用する小さなハードウェア変換キャッシュ
サイズ/構造実装依存。一般的に非常に小さく高速
効果page table walkを減らしてアドレス変換の遅延を下げる

実装によってはinstruction TLB / data TLBが分離されていたり、
複数段階のTLBが存在する場合もある。

TLBが効果的な理由
#

時間的局所性 + 空間的局所性のおかげだ。
同じページや隣接するページへの繰り返しアクセスパターンが多いため、
非常に小さな変換キャッシュだけでもpage table walkを大幅に減らすことができる。


4. Context Switch時のTLB
#

プロセスやアドレス空間が変わると、既存のTLBエントリをそのまま使えない状況が生まれる。
ただしこのとき常に全TLBをflushしなければならないわけではない。

2つの処理方式
#

方式説明デメリット
TLB Flushアドレス空間切り替え時に関連エントリを削除切り替え直後にTLB missが増える
ASID (Address Space ID)TLBエントリにアドレス空間識別子をタグ付け識別子数と管理ポリシーの制約がある

つまり、アドレス空間の切り替え = 必ず全TLBの初期化と覚えるより、
アーキテクチャがアドレス空間識別子をサポートするかどうかによってflush戦略が変わると理解する方が正確だ。


5. MMU vs TLBの一行まとめ
#

MMUTLB
役割アドレス変換全体を担当よく使う変換結果のキャッシュ
位置CPUのアドレス変換ハードウェアMMUが活用する変換キャッシュ
実装の性格table walk、権限チェック、fault発生などを含む実装依存の小さなオンチップキャッシュ
なければ仮想アドレスを物理アドレスに自動変換しにくいpage table walkのコストが増えてパフォーマンス低下

結論: MMUはアドレス変換という機能全体を担うユニットであり、
TLBはその中でパフォーマンスのボトルネックを解決するために存在するキャッシュコンポーネントだ。
TLBはMMUの一部として理解すればよい。


6. OSメモリ管理者(MMS)
#

標準用語の整理
#

「MMS」はLinux/Windowsの公式ドキュメントで代表的な標準略語として広く使われるというよりも、
文脈上OSのメモリ管理サブシステムを指す表現として理解する方が安全だ。

  • Linuxは通常Memory Management(MM)またはVM subsystemの文脈で説明する。
  • WindowsはMemory Managerという名称を使う。

ハードウェア vs ソフトウェアのメモリ管理の区分
#

[ プロセス ] → 仮想アドレスを生成
[ MMU / TLB ]  ← ハードウェア
  アドレス変換担当
      │ Page Fault発生時に例外
[ OSメモリ管理者 ]  ← ソフトウェア、カーネル内部
  ページテーブル管理、ページ置き換え、スワップ、fault処理担当
[ 物理メモリ(RAM)+ スワップ領域(ディスク)]

OSメモリ管理者が行うこと
#

1. ページテーブルの作成と管理
#

  • プロセスごとのアドレス空間に合わせてページテーブルを作成・維持する。
  • 一般的な汎用OSではOSまたはハイパーバイザーがテーブルを管理し、MMUはその結果を使って変換を実行する。

2. Page Faultの処理
#

  • MMUが非常駐ページやアクセス権限違反などの条件でpage fault例外を発生させる場合がある。
  • OSはその原因を確認してページをロードするか、権限エラーなら例外を伝えるかプロセスを終了させる。
  • 正常な場合はページテーブルを更新した後、命令を再実行させる。

3. スワップ(Swap)管理
#

  • 物理メモリが不足すると、どのページをディスクに退避させるかを決める。
  • ページ置き換えアルゴリズムを使ってメモリの圧迫を緩和する。
  • この部分はパフォーマンスに大きな影響を与えるOSのポリシー領域だ。

4. メモリ割り当て(mallocmmap)の背後
#

  • ユーザープログラムがメモリを要求したとき、カーネルは仮想アドレス空間を確保してマッピングポリシーを決める。
  • 実際の物理フレームの割り当ては最初のアクセス時点まで遅らせる場合がある。これがdemand pagingの文脈だ。

5. 共有メモリ / Copy-on-Write(CoW)
#

  • fork()のような操作では、最初からすべてのページをコピーせずに共有できる。
  • その後どちらかが書き込みを試みたときだけコピーして、メモリの無駄を減らす。

OS別メモリ管理者の名称
#

OSメモリ管理者の名称
LinuxMM subsystem / VM subsystemmm/
WindowsMemory ManagerMmMmXxx関数群)

Linuxカーネルソースのmm/ディレクトリには
page_alloc.cswapfile.cmmap.cのようなコードが入っている。

MMU vs OSメモリ管理者の比較
#

MMUOSメモリ管理者
種類ハードウェアソフトウェア(カーネル)
役割アドレス変換の実行、権限チェック、faultシグナル変換規則(ページテーブル)の作成、置き換え/スワップポリシーの決定、fault処理
時間特性メモリアクセス経路の非常に高速なハードウェア処理fault発生時のはるかに重いカーネル処理
比喩通訳者通訳者に辞書とルールを提供する人

核心まとめ:
MMUは**メカニズム(Mechanism)を担当し、
OSメモリ管理者は
ポリシー(Policy)**を担当する。

参考資料
#