IOMMU

IOMMU (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仮想化

記憶装置