MMU(メモリ管理ユニット)完全ガイド:仮想→物理変換とTLB・IOMMU、性能&セキュリティ最適化

メモリ管理ユニット(MMU)とは

メモリ管理ユニット(Memory Management Unit, MMU)は、プロセッサと主記憶(物理メモリ)間に位置し、仮想アドレスと物理アドレスの対応付け(アドレス変換)やアクセス制御、キャッシュ制御などをハードウェアレベルで行う回路群です。OSが仮想メモリを実装する際の中核的な役割を担い、複数プロセス間のメモリ保護、ページング、アドレス空間の分離、DMA保護など、近代的なシステムの基盤機能を提供します。

MMUの基本的な機能

  • 仮想→物理アドレス変換:プロセッサが発行した仮想アドレスを、ページテーブルなどに基づいて物理アドレスに変換する。
  • アクセス制御:読み出し・書き込み・実行の許可をページ単位で管理し、不正アクセスがあれば例外(ページフォルトやプロテクション例外)を発生させる。
  • キャッシュ・バッファ制御:ある領域のキャッシュ可否や書き込みポリシーを制御するビットを備える。
  • TLB(Translation Lookaside Buffer)の管理:アドレス変換を高速化するための小容量キャッシュ(TLB)を備え、TLBヒット時は高速に変換を完了する。
  • IOMMU連携:デバイスによるDMAアクセスを制御するためのIOMMUと連携して、デバイスに対する物理メモリ保護を実現する。

仮想アドレス変換の仕組み(概念)

一般的には、仮想アドレスは「ページオフセット」と「ページ番号(仮想ページ番号、VPN)」に分解されます。ページ番号はページテーブルの索引となり、対応するページテーブルエントリ(PTE)の中に物理ページ番号(PPN)やアクセスビットが格納されます。最終的に物理アドレスは PPN とオフセット を結合して得られます。

実装としては、シングルレベルのページテーブルだけでなく、メモリ消費を抑えるために多数のアーキテクチャで多段階(多レベル)のページテーブルが採用されています。x86-64 では典型的に 4 レベル(PML4 → PDPT → PD → PT)ですし、ARMv8 では設定によって 2〜4 レベルの変換が可能です。

TLB(Translation Lookaside Buffer)とその重要性

TLBは最近使用した仮想→物理変換を保持する高速キャッシュで、MMUの性能に直結します。TLBヒットならば数サイクルで変換が完了しますが、TLBミス時はハードウェアによるページテーブルウォーク(変換階層を順に読む)や、ソフトウェアによる例外処理が必要になり、コストが大きく増します。OSはTLBの効率を上げるために以下のような工夫を行います。

  • 大きなページ(Huge Page:例 2 MiB、1 GiB)を利用してTLBエントリあたりのカバー領域を拡大する。
  • 局所性の高いメモリ配置やプロセス間共有の工夫。
  • PCID(x86)やASID(ARM)の利用によりコンテキスト切替でのTLBフラッシュを減らす。

ページテーブル形式と多様性

ページテーブルには典型的な「階層型ページテーブル」のほか、OSやハードの設計に応じて「反転ページテーブル(Inverted Page Table)」や「ソフトウェア管理TLB」方式などが存在します。さらに、ページサイズは機械や設定により 4 KiB、2 MiB、1 GiB や ARM の 16/64 KiB 等が使われます。各PTEは「有効無効(present)」「書き込み可/不可」「ユーザ/スーパーザー」「アクセス済み」「ダーティ」などのフラグを持ち、x86 では NX(No Execute)ビットを用いて実行保護を実現します。

ページフォルトとOSの役割

MMUがアクセス違反や該当ページの不在を検出すると CPU は例外(ページフォルト)を発生させ、OS の例外ハンドラが制御を受け取ります。OS はフォルトの原因を判定して、たとえば:

  • 合法だが未割当のページ(需要ページング)ならば物理ページを割り当て、ページテーブルを更新してプロセスを再開する。
  • ページがディスクにスワップアウトされていた場合はディスクからページを戻す処理を行う。
  • アクセス権違反ならばシグナル送出やプロセス終了などの保護処理を行う。

また、コピーオンライト(COW)などのメモリ管理手法もページフォルトをトリガーに実現されます。

アーキテクチャ依存の差異

MMU の実装はアーキテクチャで大きく異なります。x86/ARM の近代的なプロセッサはハードウェアによるページテーブルウォークを持ち、OS はページテーブルの構成をハードウェア仕様に合わせて用意します。一方、MIPS の一部実装や一部 RISC 系ではソフトウェアで TLB 欄を管理し、TLB ミスはソフトウェア例外で処理する方式を採る例もあります。仮想化対応としては、Intel の EPT(Extended Page Tables)や AMD の NPT(Nested Page Tables)、ARM の Stage-2 translation があり、ゲスト仮想→ゲスト物理→ホスト物理という二段の翻訳をハードやハイパーバイザで効率化します。

IOMMU と DMA の関係

デバイスが DMA で物理メモリに直接アクセスする場合、単純な物理アドレスだけではホストのメモリ保護が難しくなります。IOMMU(Input–Output MMU)はデバイスから見た「デバイス仮想アドレス(DVMA)」をホスト物理アドレスに変換し、デバイス単位でアクセス範囲を制限できます。これにより、デバイスの誤ったアクセスや悪意ある DMA を防止し、仮想化環境でのデバイス割当て(SR-IOV など)も安全に行えます。

性能上の考慮点と最適化

MMU 周りの性能はシステム全体の応答性に大きく影響します。主な課題と対策は次の通りです。

  • TLB ミスコスト:大きなページを利用してミス率を下げる(hugepage の活用)。
  • TLB シュートダウンのオーバーヘッド:複数コアでのアドレス空間切替時の同期を減らすため PCID/ASID を用いる。
  • ページフォルト頻度:ワーキングセットに合わせたメモリ割当てとアクセス局所性の向上。
  • ページテーブルウォークのキャッシュ効率:階層の深さやインデックスの設計が影響する。

セキュリティ面の役割

MMU はメモリ分離によるプロセス隔離だけでなく、実行禁止ビット(NX)によるデータ領域の実行防止、スタック/ヒープの個別保護、ASLR(Address Space Layout Randomization)と組み合わせた攻撃難化に寄与します。さらに IOMMU により DMA 攻撃の軽減が可能です。近年の脆弱性(例:Meltdown/Spectre)の文脈では、MMU とキャッシュや予測機構の相互作用が攻撃ベクタになり得るため、ハード/ソフト両面での対策が求められます。

実務で押さえておくポイント

  • 開発者は仮想メモリと物理メモリの違いを正確に理解する。アドレス表示やデバッグ時に混同しやすい。
  • 大規模アプリケーションやデータベースでは hugepage を活用するとパフォーマンス改善が見込める。
  • 仮想化やデバイスパススルーを扱う際は IOMMU の有無と設定を確認する。
  • 同時にマルチコアやリアルタイム性を考える場合、TLB シュートダウンやページフォルトのレイテンシを設計に織り込む。

まとめ

MMU は単なるアドレス変換器ではなく、保護、性能、セキュリティに直結する重要なハードウェアコンポーネントです。OS と協調してページテーブル管理、TLB 使い方、IOMMU 連携、仮想化サポートなどを設計・運用することで、安全で高性能なシステムを構築できます。アーキテクチャごとの差異や最新の拡張機能(ASID/PCID、EPT/NPT、NX 等)を理解しておくことが実務では重要です。

参考文献