Chapter 1: IOMMU(入力出力メモリ管理ユニット)とは?
IOMMUとは、その名の通りIOデバイス向けのMMUである。IOデバイスというのは、GPGPU、AI Acceleratorなどの”CPU”以外のデバイスを指す。
MMUというのは、Memory Management Unitで、基本的な機能としては仮想アドレス(VA)から物理アドレス(PA)への変換や、メモリ領域の保護をサポートするものである。
IOMMUはCPUの使うMMUと基本的な役割は同じで、デバイス向けに、デバイスの使う仮想アドレスを物理アドレスに変換する役割と、デバイスが不正にメモリアクセスを行うことを防ぐものである。
IOMMUのユースケース
非常に簡単なモデルで、IOMMUがどのように使われるのかを考えてみる。例えば、CPUで動いているあるプロセスが、GPGPUに仕事を頼みたいとする。
CPUはGPGPUに対して、「仮想アドレス(VA) = 0x100にあるデータを処理してください」と頼む。ここで、VA=0x100は実際には 0x8000_0100 のことであるので、GPGPUは 0x8000_0100にアクセスする必要があるわけだ。

ところが、CPUのプロセスは基本的にソフトウェアからはアドレスはVAしか見えないので、CPUのプロセスが物理アドレス(PA)を知ることはできない。
したがって、CPUがGPGPUに伝えるときは「0x100」というアドレス情報しか伝えられなくて、GPGPUはこのVAが実際にはどの物理アドレスなのかを知る手段がない、ということになってしまう。

そこでIOMMUが登場する。IOMMUはGPGPUデバイス向けに0x100が0x8000_0100に相当するというような変換テーブルを保持しており、GPGPUからの要求に応じて物理アドレスを提供する。
この変換テーブルを生成するためには、CPU(そして具体的にはオペレーティングシステムに相当するシステムソフトウェア)がIOMMUのテーブルを設定し、GPGPUが適切にVA→PA変換ができるようにサポートする。

IOMMUがデバイスを管理する仕組み「デバイス・コンテキスト」
IOMMUがデバイスを管理するための概念として、デバイス・コンテキストというものを導入する。
デバイス・コンテキストというのは、IOMMUが各デバイスを管理するための情報を一元化したもので、IOMMUはデバイス毎にデバイス・コンテキストを持っている。
下記の図でいうならば、GPGPUはプロセスAで使われるので、プロセスAが持っているVA→PA変換に従い、プロセスBがAIアクセラレータを使うとしたら、プロセスBのVA→PA変換に従う必要がある。これらのデバイス毎の情報をまとめたものが、デバイス・コンテキストである。

- IOMMUはどのようにして使われるのか: RISC-VのIOMMUの仕組み (2. IOMMUが使われる流れ) - FPGA開発日記
- IOMMUにおるIOVAの基本的な変換方法: RISC-VのIOMMUの仕組み (4. IOMMUによるIOVAの基本的な変換方法) - FPGA開発日記