RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
2. データ構造
デバイス・コンテキスト(DC)は、デバイスとアドレス空間を関連付け、IOMMUがアドレス変換を行うためのパラメータを保持するデータ構造である。DCの位置は、device_idによって基数木データ構造のデバイス・ディレクトリ・テーブル(DDT)を走査して特定する。
デバイスが利用するアドレス空間は、デバイス制御がゲストOSに委ねられる際、第二段階のアドレス変換と保護が必要となる場合がある。ゲストOSは、デバイスが利用するIOVAをGPAに変換するための第一段階のページテーブルをオプションで提供できる。第一段階が不要な場合は、Bare設定によって第一段階を無効化し、第二段階でGPAをSPAに変換する。
デバイス制御がハイパーバイザやホストOSによって行われる場合、第一段階のみで必要なアドレス変換と保護が十分である。第二段階を無効化するには、Bare設定にする。
第二段階がBareでない場合、DCにはルート第二段ページテーブルの物理ページ番号(PPN)、仮想マシン単位でキャッシュの無効化を行うゲストソフトコンテキストID(GSCID)、および第二段アドレス変換スキームが保持される。
デバイスが複数のプロセス・コンテキストをサポートする場合、それぞれ異なる仮想アドレス空間が設定され、メモリアクセス時にprocess_idと共にdevice_idが通知され、アクセスアドレス空間が特定される。例として、プロセスごとに異なる仮想アドレス空間を使い分けるGPUがある。こうした場合、DCはprocess_idを基数木データ構造のルートプロセス・ディレクトリ・テーブル(PDT)でインデックス化して関連するプロセス・コンテキスト(PC)を特定する。
PDTが有効な場合、第一段階のアドレス変換はPCによって管理され、無効時はDCが制御を持つ。第一段階のアドレス変換制御にはルート第一段ページテーブルのPPN、プロセス単位でキャッシュ無効化を行うプロセスソフトコンテキストID(PSCID)、および第一段変換スキームが含まれる。
ゲストOSが制御するデバイスのMSIを処理するために、IOMMUはIMSIC内のゲスト割り込みファイルへのリダイレクト機能を持つ必要がある。MSIは通常のメモリ書き込みであるため、IOMMUは他のメモリ書き込みと同様のアドレス変換を適用する。ただし、ソフトウェアの簡素化とメモリ常駐割り込みファイルのサポートのため、IOMMUは仮想マシン向けのMSIを特別に扱うことが可能である。
この機能のため、IOMMUはDCにMSIアドレスマスクとアドレスパタンを追加し、MSIの送信先ページを特定する。IOMMUのこのMSI対応機能は、Advanced Interrupt Architecture仕様で規定されている。
また、DCはデバイスが許可されるトランザクションの種類を制御し、PCIeで定義されるアドレス変換サービス(ATS)などの使用許可も含まれる。
デバイス・コンテキストの形式
DCには2つの形式がある:
- ベース・フォーマット:32バイトで、MSIの特別処理をサポートしない。
- 拡張フォーマット:64バイトで、MSI変換用の追加フィールドを含む。capabilities.MSI_FLATが1の場合、拡張フォーマットが使用され、そうでなければベースフォーマットが使用される。
DDTとPDTの構成
DDTは、device_idの最大幅に応じて1~3レベルの基数木となるよう構成される。基数木の走査には、device_idを特定の形式でパーティショニングし、デバイス・ディレクトリ・インデックス(DDI)を取得して使用する。PDTもprocess_idの最大幅に応じて1~3レベルの基数木として構成される。PDT基数木の走査にはprocess_idの特定のパーティショニングで得られるプロセス・ディレクトリ・インデックス(PDI)を用いる。
すべてのRISC-V IOMMU実装は、メインメモリ上にDDTとPDTをサポートする必要があるが、I/Oメモリでのデータ構造のサポートは必須ではなく、仕様で禁止されていない。