FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V IOMMU の構成についてマニュアルを読んでまとめる (1. 概要)

github.com

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のアドレス変換テーブルを設定し、仮想割り込みファイルへのアクセスを管理する。