Input/Output Memory Management Unit

Input/Output Memory Management Unit (IOMMU) とはDMA可能なI/Oバスと主記憶装置を接続するメモリ管理ユニット (MMU) である。MMUがCPUに見える仮想アドレスを物理アドレスに変換するように、IOMMUは周辺機器から見える仮想アドレス（デバイスアドレスとかI/Oアドレスと呼ぶ）を物理アドレスに変換する。周辺機器の誤動作からメモリを守るため、メモリ保護機能も提供する。

 実例と呼称 
IOMMUの例として、AGPやPCI Expressのグラフィックスカードで使われるGraphics Address Remapping Table (GART) がある。

AMDは、HyperTransportアーキテクチャでのIOMMU技術の仕様を公表している。インテルはIOMMUの仕様をVirtualization Technology for Directed I/O (VT-d) として公表している。サン・マイクロシステムズのIOMMUはSolaris Developer Connection の Device Virtual Memory Access (DVMA) として公表されている。IBMのIOMMUはTranslation Control Entry (TCE) と称している文書がある。PCI-SIGでは関連する部分をI/O Virtualization (IOV) とAddress Translation Services (ATS) と呼んでいる。

x86のIOMMUについては、x86仮想化#チップセットも参照のこと。

 利点 
物理アドレスを直接使う場合と比較したIOMMUの利点は以下の通りである。
 大きなバッファを確保する際に、物理的に連続であることを保証する必要がない。IOMMUが連続な仮想アドレスと分断された物理アドレスのマッピングを行う。
 主記憶メモリ全体を指定できるほどのアドレス幅を持たない周辺機器（バス）の場合、IOMMUを使えばメモリ上どこにバッファがあってもアクセス可能となる。これにより、周辺機器がアクセスできる範囲にあるバッファと実際のバッファの間でメモリコピーをする必要がなくなる。
 例えば、最近のx86系プロセッサはPAE機能によって 4GiB以上のメモリ空間を扱える。しかし、32ビットのPCIデバイスは4GiBを越えるアドレスにあるメモリには単純にはアクセスできない。IOMMUがない場合、オペレーティングシステム (OS) はdouble buffering（Windows用語）とかbounce buffers（Linux用語）と呼ばれる時間のかかる処理を必要とする。
 メモリ保護機能により、明示的にアクセス権がないとデバイスからメモリにアクセスできない。これによりデバイスの誤動作や悪意あるデバイスからメモリを保護する。IOMMU の設定はCPU上で動作するOSが行うため、デバイス側から設定することはできない。
 仮想化では、ゲストOSがIOMMUを直接制御すべきではない。
 アークテクチャによっては、IOMMUが割り込みの再マッピングも行う。

IOMMUはCPUがデバイスと（DMAではなく）ポートマップドI/Oで通信する場合には使われない。

 欠点 
IOMMUを使う場合の欠点として、次の事柄が指摘されている。
 IOMMU による変換と管理による性能低下が見られる。
 I/O用のページテーブルを作成する必要があるため、物理メモリがそれだけ消費される。マルチプロセッサ機でプロセッサ間でI/O用ページテーブルを共有できれば、問題は若干緩和される。

 IOMMUと仮想化の関係 
OSがXenなどの仮想マシン上で動作する場合、各OSはアクセスしている物理アドレスを知らない。そのため、周辺機器にDMAを指示しようとしても、直接的に物理アドレスを指定することができない。実際には、仮想マシンがI/O操作に対して変換を施しており、I/O操作に遅延が生じる原因となっている。

IOMMUは、ゲストOSと周辺機器のアクセスするアドレスのマッピングをそろえることで、これを解決できる。

 脚注 

 参考文献 


 関連項目 
 仮想記憶
 メモリマップドI/O
 Direct Memory Access
 x86仮想化

Category:記憶装置