IOMMU(Input/Output Memory Management Unit)とは
IOMMU(Input/Output Memory Management Unit)は、DMA(
Direct Memory Access)が可能なI/Oバスと
主記憶装置を接続する際に、メモリ管理を行うユニットです。
CPUにおけるMMU(Memory Management Unit)が仮想アドレスを
物理アドレスに変換するのと同様に、IOMMUは周辺機器から見える仮想アドレス(デバイスアドレスやI/Oアドレスとも呼ばれる)を
物理アドレスに変換します。
また、IOMMUは単にアドレス変換を行うだけでなく、周辺機器の誤動作によるメモリへの不正アクセスを防ぐためのメモリ保護機能も提供します。これにより、システム全体の安定性とセキュリティが向上します。
IOMMUの具体例と名称
IOMMUの具体例としては、AGPや
PCI Expressのグラフィックスカードで使われるGART(Graphics Address Remapping Table)があります。また、各社でIOMMU技術に異なる名称を与えており、以下のような例があります。
AMD: HyperTransportアーキテクチャにおけるIOMMU技術の仕様
Intel: VT-d(Virtualization Technology for Directed I/O)
Sun Microsystems: DVMA(Device Virtual Memory Access)
IBM: TCE(Translation Control Entry)
PCI-SIG: IOV(I/O Virtualization)とATS(Address Translation Services)
x86系のIOMMUについては、x86
仮想化のチップセットに関する項目も参照するとより理解が深まります。
IOMMUの利点
物理アドレスを直接使用する場合と比較して、IOMMUには以下のような利点があります。
1.
連続した物理アドレスの必要性緩和:
大きなバッファを確保する際に、物理的に連続したメモリ領域を確保する必要がなくなります。IOMMUが、連続した仮想アドレスと断片化した
物理アドレス間のマッピングを管理するためです。
2.
アドレス空間の制限緩和:
周辺機器が、
主記憶装置全体をアドレス指定できるほどのアドレス幅を持たない場合でも、IOMMUを使用することで、メモリ上のどこにバッファがあってもアクセス可能になります。これにより、周辺機器がアクセス可能な範囲にデータをコピーする手間が省けます。
3.
4GBを超えるメモリ空間へのアクセス:
例えば、最近のx86系プロセッサはPAE機能により4GB以上のメモリ空間を扱えますが、32ビットのPCIデバイスは4GBを超えるアドレスに直接アクセスできません。IOMMUがない場合、OSはdouble buffering(Windows用語)やbounce buffers(Linux用語)と呼ばれる非効率な処理を必要とします。IOMMUはこのような問題を解決します。
4.
メモリ保護機能:
IOMMUは、アクセス権がないとデバイスからメモリにアクセスできないように保護します。これにより、デバイスの誤動作や悪意あるデバイスからの不正アクセスを防ぎます。また、IOMMUの設定はOSが行うため、デバイス側から設定を書き換えることはできません。
5.
仮想化環境でのアドレス変換:
仮想化環境では、ゲストOSがIOMMUを直接制御すべきではありませんが、IOMMUにより、ゲストOSと周辺機器がアクセスするアドレスのマッピングを適切に管理することができます。
6.
割り込みの再マッピング:
一部のアーキテクチャでは、IOMMUが割り込みの再マッピングも行います。
IOMMUの欠点
IOMMUの利用には、以下のような欠点も指摘されています。
1.
性能低下:
IOMMUによるアドレス変換と管理によって、わずかながら性能低下が見られる場合があります。
2.
メモリ消費:
* I/O用のページテーブルを作成する必要があるため、それだけ物理メモリが消費されます。ただし、マルチプロセッサ環境でI/O用ページテーブルをプロセッサ間で共有できる場合は、この問題が緩和されます。
仮想化環境では、ゲストOSが
物理アドレスを直接認識しないため、周辺機器へのDMA指示に直接
物理アドレスを指定することができません。IOMMUは、ゲストOSと周辺機器がアクセスするアドレスのマッピングを調整することで、この問題を解決します。これにより、仮想マシンにおけるI/O操作の遅延を減らすことができます。
まとめ
IOMMUは、周辺機器からのメモリアクセスを効率的かつ安全に管理するために不可欠なハードウェアです。アドレス変換、メモリ保護、
仮想化環境でのアドレス管理など、多岐にわたる役割を担っており、現代のコンピュータシステムにおいて重要な役割を果たしています。