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)は、直接メモリ・アクセスが可能な入出力(I/O)デバイスをシステム・メモリに接続するシステム・レベルのメモリ管理ユニット(MMU)である。

IOMMUを介してシステムに接続された各I/Oデバイスに対して、IOMMUはソフトウェアを用いてデバイス・コンテキストを設定することができる。デバイス・コンテキストは、デバイスに特定の仮想アドレス空間とその他のデバイスごとのパラメータを関連付ける。IOMMUで各デバイスに個別のデバイス・コンテキストを与えることで、各デバイスを個別のオペレーティングシステム(ゲスト OS またはメイン(ホスト)OS)に個別に設定できる。デバイスがメモリ・アクセスを開始するたびに、IOMMU は何らかの形で一意のデバイス識別子によって元のデバイスを識別する。例えば、PCIe[1]の場合、送信デバイスは、PCIバス番号(8 ビット)、デバイス番号(5 ビット)、ファンクション番号(3 ビット)の一意の 16 ビットのtriplet(ルーティング識別子または RID と総称される)、および IOMMU が複数の階層をサポートする場合はオプションで最大8ビットのセグメント番号によって識別される。本仕様書では、このような一意のデバイス識別子を device_id と呼び、最大 24 ビット幅の識別子をサポートする。

デバイスによっては、プロセス・アドレス空間をデバイスと共有する機能である共有仮想アドレッシングをサポートしている場合がある。プロセス・アドレス空間をデバイスと共有することで、DMAをコア・カーネルのメモリ管理に依存することができ、アプリケーションやデバイス・ドライバから複雑さを取り除くことができる。デバイスにバインドした後、アプリケーションは静的または動的に割り当てられたバッファに対してDMAを実行するよう指示できる。このようなアドレッシングをサポートするために 、ソフトウェアは1つ以上のプロセス・コンテキストをデバイス・コンテキストに設定することができます。このようなデバイスによって開始されるすべてのメモリ・アクセスには一意のプロセス識別子が付随し、IOMMUは一意のデバイス識別子と組み合わせて、ソフトウェアによってデバイス・コンテキストに 設定された適切なプロセス・コンテキストを特定するために使用する。例えば 、PCIeの場合、プロセスコンテキストは、一意の20ビットのプロセスアドレス空間識別子(PASID)によって識別される。 この仕様では、このような一意のプロセス識別子を process_id と呼び、最大20 ビット幅の識別子をサポートする。

IOMMUは、IOVAをSPA(Supervisor Physical Address)に変換し、DMAのメモリ保護を実施するために、2段階のアドレス変換プロセスを採用している。アドレス変換とメモリ保護を実行するために、IOMMUはCPUのMMUが第1段階と第2段階のアドレス変換に使用するのと同じページテーブルフォーマットを使用します。CPUのMMUと同じペー ジテーブルフォーマットを使用することで、DMAのメモリ管理の複雑さをある程度取り除くことができる 。また、同じフォーマットを使用することで、CPUのMMUとIOMMUの両方で同じページテーブルを同時に使用することができる。 2段階のアドレス変換を無効にするオプションはないが、その段階の仮想メモリスキームをベア、つまりアドレス変換もメモリ保護も行わないように設定することで、どちらかの段階を効果的に無効にすることができる。

IOMMUが採用する仮想メモリ方式は、IOMMU内のデバイスごとに個別に設定できる。デバイスは、I/O 仮想アドレス(IOVA)を使用して DMA を実行する。デバイス用に選択された仮想メモリ方式に応じて、デバイスが使用するIOVAは、スーパーバイザ物理アドレス(SPA)、ゲスト物理アドレス(GPA)、または仮想アドレス(VA)になる。

両ステージで選択された仮想メモリ方式が Bare の場合、IOVA は SPA となる。IOMMU によるアドレス変換や保護は行われない。

第1段階で選択された仮想メモリスキームが Bare であり、第2段階のスキームが Bare でない場合、IOVA は GPA(Guest Physical Address) となる。ファーストステージは事実上無効となる。セカンドステージはGPAをSPAに変換し、設定されたメモリ保護を実行する。このような構成は、デバイス制御が仮想マシンに渡されるが、VM 内のゲスト OS が第1段階のアドレス変換を使用せず、そのようなデバイスからのメモリ・アクセスをさらに制約する場合に一般的に採用される。RISC-V HARTと比較すると、この構成は、 RISC-V HARTでGステージがアクティブでVSステージがベアに設定された2ステージのアドレス変換が有効であることと類似している。

ファーストステージで選択された仮想メモリスキームが Bare ではなく、セカンドステージのスキームが Bare の場合、IOVAはVAとなる。セカンドステージは事実上無効となる。ファーストステージはVAをSPA に変換し、設定されたメモリ保護を実行する。この構成は、IOMMU がネイティブ OS によって使用され る場合、またはデバイスの制御がハイパーバイザ自身によって保持される場合に通常採用される。RISC-V HARTと比較すると、この構成は、RISC-V HARTでシングルステージアドレス変換が有効であることと類似している。

どちらのステージでも選択された仮想メモリ方式ががどちらもBareでない場合、IOVAはVAとなる。2 段階のアドレス変換 が有効である。第 1 段階は VA を GPA に変換し、第 2 段階は GPA を SPA に変換する。各ステージは、設 定されたメモリ保護を実施する。このような構成は、デバイス制御が仮想マシンにパススルーされ、VM のゲストOSが第1段階のアドレス変換を使用して、そのようなデバイスによってアクセスされるメモリと 関連する特権およびメモリ保護をさらに制約する場合に一般的に採用される。RISC-V HARTと比較すると 、この構成は、GステージとVSステージの両方がアクティブなRISC-V HARTで、2ステージのアドレス変換が有効であることに類似している( Bare ではないことに注意)。

IOMMUにおけるDMAアドレス変換は、ソフトウェアが提供するデータ構造を使用してSPAを決定するのに必要な時間によってアクセス時間が長くなる可能性があるため、DMAアクセスに一定のパフォーマンス上の影響がある。CPUのMMUにおける同様のオーバーヘッドは、通常、アドレス変換をキャッシュす るTLB(Translation Look-aside Buffer)を使用することで軽減される。IOMMUは、IOMMUアドレス変換キャッシュ(IO Address Translation Cache: IOATC)と呼ばれる同様のアドレス変換キャッシュを採用することができる。IOMMUは 、アドレス変換に使用されるメモリ常駐データ構造が変更されたときに、ソフトウェアがIOATCを同期させるメカニズムを提供する。ソフトウェアは、ゲスト・ソフトコンテキスト識別子(GSCID)と呼ばれるソフトウェア定義コンテキスト識別子でデバイス・コンテキストを構成して、デバイスの集合が同じVMに割り当てられていることを示し、共通の仮想アドレス空間にアクセスすることができる。ソフトウェアは 、共通の仮想アドレス空間を共有するプロセスの集合を識別するために、プロセスソフトコンテキスト識 別子(PSCID)と呼ばれるソフトウェア定義コンテキスト識別子でプロセスコンテキストを構成してもよい 。IOMMU は、GSCID と PSCID を使用して IOATC のエントリをタグ付けし、重複を回避して無効化操作を 簡素化することができる。

デバイスによっては、変換プロセスに参加し、自身のメモリ・アクセス用にデバイス側 ATC(DevATC)を提供するものもある。DevATCを提供することで、デバイスはトランスレーション・キャッシングの責任を共有し、それによってIOATCにおける「スラッシング」の確率を減らすことができる。DevATCは、そのデバイス独自の性能要件に合わせてサイズを決めることができ、また、変換をプリフェッチすることによってDMAレイテンシを最適化するためにデバイスが使用することもできる。このようなメカニズムには、プロトコルを使用したデバイスとIOMMUの密接な協力が必要である。例えばPCIeの場合、Address Translation Services(ATS)プロトコルは、デバイスがDevATC内のキャッシュに変換を要求し、ソフトウェア・アドレス変換データ構造による更新と同期させるために使用される。デバイスがアドレス変換プロセスに参加することで、I/Oページフォールトの使用も可能になり、コアカーネルメモリマネージャがデバイスによってアクセスされる可能性のあるすべての物理メモリを常に常駐させる必要がなくなる。例えば PCIe の場合、デバイスはページ要求インターフェイス(PRI)を実装して、変換を要求したページが利用可能でないことが判明した場合に、メモリマネージャにページを常駐させるよう動的に要求することができる。IOMMU は、PCIe ATS や PCIe PRI [1]などのサービスを実現するために、デバイスとの特別なソフトウェア・インターフェイスやプロトコルをサポートする場合がある。

IMSIC (Incoming Message-Signaled Interrupt Controller) で構築されたシステムでは、IOMMU はハイパーバイザによって、ゲスト OS によって制御されるデバイスからのメッセージシグナル割り込み (MSI) を IMSIC 内のゲスト割り込みファイルに向けるようにプログラムされることがある。デバイス からの MSI は単なるメモリ書き込みであるため、IOMMU が他のメモリ書き込みに適用するのと同じアドレス変換が当然適用される。しかし、RISC-V Advanced Interrupt Architecture [2]では、ソフトウェアを簡素化するためと、メモリ常駐割り込みファイルをオプションでサポートするために、IOMMUが仮想マシンに向けたMSIを特別に扱うことを要求している。デバイス・コンテキストは、仮想割り込みファイルへのメモリ・アクセスを識別し、デバイス・コンテキスト内でソフトウェアによって設定された MSIアドレス変換テーブルを使用して変換されるパラメータでソフトウェアによって設定される。