RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
用語の定義
用語 | 定義 |
---|---|
AIA | RISC-V Advanced Interrupt Architecture |
ATS / PCIe ATS | Address Translation Services: A PCIe protocol to support DevATC |
CXL | Compute Express Link bus standard |
DC / Device Context | デバイスと、そのデバイスが割り当てられているVMを識別する、状態をハードウェアで表現したもの |
DDT | デバイス・ディレクトリ・テーブル: デバイスコンテキスト構造を見つけるために、一意のデバイス識別子を使って走査されるradix-tree構造。 |
DDI | デバイス・ディレクトリ・インデックス: リーフまたはノンリーフDDT構造へのインデックスとして使用される一意のデバイス識別子のサブフィールド。 |
Device ID | DMA または割り込み要求の送信元を識別するための最大 24 ビットの識別番号。PCIeデバイスの場合は、ルーティング識別子(RID)[1]。 |
DevATC | デバイスのアドレス変換キャッシュ |
DMA | Direct Memory Access |
GPA | Guest Physical Address: 仮想マシン上の仮想化された物理メモリ空間 |
GSCID | Gust soft-context identifier: 仮想マシンに割り当てられたデバイスの集合を一意に識別するためにソフトウェアが使用する識別番号。IOMMU は IOATC エントリーに GSCID を付けることができる。同じ GSCID でプログラムされたデバイスコンテキストは、同じセカンドステージページテーブルでプログラムされている必要がある。 |
Guest | 仮想マシン上のソフトウェア |
HPM | Hardware Performance Monitor |
Hypervisor | 仮想化を司るソフトウェア |
ID | 識別子 |
IMSIC | Incoming Message-signaled Interrupt Controller |
IOATC | IOMMU Address Translation Cache: IOMMUないのキャッシュ。アドレス変換に必要な構造をキャッシュする |
IOVA | I/O Virtual Address。デバイスによるDMAのための仮想アドレス |
MSI | Message Signaled Interrupts |
OS | Operating System |
PASID | Process Address Space Identifier: プロセスのアドレス空間を識別する。PASID値はリクエストのPASID TLPプレフィックスで提供される。 |
PBMT | Page-Based Memory Types |
PPN | Physical Page Number |
PRI | Page Request Interface: PCIeによりOSのメモリマネージャに対してデバイスのページを作成するリクエストを可能にするためのプロトコル。 |
PC | Process Context |
PCIe | Peripheral Component Interconnect Express bus standard |
PDI | Process-directory-index: 一意なプロセス識別子のサブフィールドで、リーフまたは非リーフPDT構造へのインデックスに使用される。 |
PDT | Process-directory-table: プロセスコンテキスト構造を見つけるために、一意のプロセス識別子を使用して走査されるradix-treeデータ構造。 |
PMA | Physical Memory Attributes |
PMP | Physical Memory Protection |
PPN | Physical Page Number |
Process ID | プロセス・コンテキストを識別するための最大20ビットの識別番号。PCIeデバイスの場合はPASID [1]。 |
PSCID | Process soft-context identifier: ソフトウェアが一意のアドレス空間を識別するために使用する識別番号。IOMMU は IOATC エントリに PSCID を付けることができる。 |
PT | Page Table |
PTE | Page Table Entry. ページテーブルのリーフまたは非リーフのエントリ |
Reserved | 将来の使用のために予約されたレジスタまたはデータ構造フィールド。データ構造の予約フィールドは、ソフトウェアによって0に設定されなければならない。ソフトウェアはレジスタの予約フィールドを無視し、同じレジスタの他のフィールドに値を書き込むときは、これらのフィールドに保持されている値を保持しなければならない。 |
RID / PCIe RID | PCIe routing identifier |
RO | Read-only: レジスタ・ビットは読み取り専用であり、ソフトウェアで変更することはできない。明示的に定義されている場合、これらのビットは変化するハードウェアの状態を反映するために使用され、その結果、実行時にビットの値が変化するのを観測することができる。ビットを設定するオプション機能が実装されていない場合、ビットはゼロにハードワイヤリングされなければならない。 |
RW | Read-Write: レジスタ・ビットはリード・ライトであり、ソフトウェアによって希望する状態にセットまたはクリアされる。ビットに関連するオプション機能が実装されていない場合、ビットはゼロにハードワイヤリングされることが許可されています。 |
RW1C | Write-1-to-clear status: レジスタ・ビットは、読み出されるとステータスを示す。セット・ビットはステータス・イベントを示し、1bを書き込むとクリアされる。RW1Cビットに0bを書き込んでも効果はない。ビットをセットするオプション機能が実装されていない場合、ビットは読み取り専用で、ゼロにハードワイヤリングされなければならない。 |
RW1S | Read-Write-1-to-set:レジスタ・ビットは、読み出されるとステータスを示す。ビットは1bを書き込むことでセットされる。RW1Sビットに0bを書き込んでも効果はない。このビットを導入するオプション機能が実装されていない場合、このビットは読み取り専用で、ゼロにハードワイヤリングされなければならない |
SOC | System on a chip, system-on-a-chipもしくはsystem-on-chipとも言われる。 |
SPA | Supervisor Physical Address: メモリもしくはメモリにマップされたリソースにアクセスするための物理アドレス |
TLP | Transaction Layer Packet |
VA | Virtual Address |
VM | Virtual Machine: 実際のコンピュータ・システムの効率的で分離された複製。この仕様では、ハイパーバイザー拡張機能をサポートするRISC-Vハートが仮想化モードを1に設定して実行したときにアクセス可能なリソースとステートの集合体を指す。 |
VMM | Virtual Machine Monitor: ハイパーバイザとも呼ばれる |
VS | Virtual Supervisor: 仮想モードのスーパバイザの権限 |
WARL | Write any values, Read Legal values: ビットエンコーディングのサブセットに対してのみ定義されるレジスタフィールドの属性。 |
WPRI | Write Preserve values, Reads Ignore values: 将来の使用のために予約されているレジスタ・フィールドの属性。 |
第1章. Introduction
システムMMU(SMMU)とも称される入出力メモリ管理ユニット(IOMMU)は、DMAが可能なI/Oデバイスをシステムメモリに接続するためのシステムレベルのMMUである。
IOMMUは、各デバイスに対してソフトウェアによりデバイスコンテキストを設定し、特定の仮想アドレス空間やデバイス固有のパラメータを関連付けることが可能である。これにより、各デバイスを個別のOS(ゲストOSまたはホストOS)に割り当てることができる。デバイスがメモリアクセスを開始する際、IOMMUは一意のデバイス識別子(例:PCIeのRID)により元のデバイスを識別する。
一部のデバイスは共有仮想アドレッシングをサポートし、プロセスアドレス空間をデバイスと共有可能である。これにより、DMAはコアカーネルのメモリ管理に依存し、アプリケーションやデバイスドライバの複雑さを軽減する。デバイスにバインド後、アプリケーションは割り当てられたバッファに対してDMAを指示可能である。ソフトウェアはプロセスコンテキストをデバイスコンテキストに設定し、IOMMUはデバイス識別子とプロセス識別子を用いて適切なコンテキストを特定する。
IOMMUは、IOVAをSPAに変換し、DMAのメモリ保護を実施するため、二段階のアドレス変換プロセスを採用する。CPUのMMUと同一のページテーブルフォーマットを使用し、同じページテーブルを共有可能である。二段階のアドレス変換を無効にするオプションはないが、各段階をベア(変換なし)に設定することで効果的に無効化可能である。
IOMMUの仮想メモリ方式はデバイスごとに設定可能である。デバイスのIOVAは、設定によりSPA、GPA、またはVAとなる。両段階がベアの場合、IOVAはSPAとなり、アドレス変換や保護は行われない。第一段階がベアで第二段階がベアでない場合、IOVAはGPAとなり、第二段階でGPAをSPAに変換し保護する。第一段階がベアでなく第二段階がベアの場合、IOVAはVAとなり、第一段階でVAをSPAに変換し保護する。両段階がベアでない場合、IOVAはVAとなり、二段階でVAからGPA、GPAからSPAに変換し、各段階で保護を実施する。
DMAアドレス変換は、メモリ常駐データ構造を用いるため、アクセス時間のオーバーヘッドが生じ得る。このオーバーヘッドを軽減するため、IOMMUはIOATC(IOMMUアドレス変換キャッシュ)を採用可能である。ソフトウェアはGSCIDやPSCIDを用いてデバイスやプロセスのコンテキストを管理し、IOATCの無効化操作を簡素化する。
一部のデバイスはDevATCを提供し、自身のメモリアクセス用にアドレス変換キャッシュを持つ。これにより、IOATCの負荷を軽減し、DMAレイテンシを最適化可能である。PCIeではATSプロトコルを使用し、デバイスとIOMMUが協調して変換をキャッシュし、ソフトウェアのデータ構造と同期する。また、デバイスはPRIを実装し、ページが利用不可の場合にメモリマネージャにページの常駐を動的に要求可能である。
IMSICを用いたシステムでは、IOMMUはハイパーバイザにより、デバイスからのMSIをゲスト割り込みファイルに向けるよう設定されることがある。MSIはメモリ書き込みであるため、通常のアドレス変換が適用されるべきだが、RISC-V高度割り込みアーキテクチャではIOMMUがMSIを特別に扱い、ソフトウェアを簡素化し、メモリ常駐割り込みファイルをサポートする。デバイスコンテキストにより、MSIのアドレス変換テーブルを設定し、仮想割り込みファイルへのアクセスを管理する。