RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
IOMMUのMSIアドレス変換について、MRIFを理解する必要が生じてきたのでメモ。
MRIF(メモリ常駐割り込みファイル: Memory Resident Interrupt File)の目的は、システム内の割り込み受付用のポートを大幅に増加させることにある。
MRIFが無い場合、RISC-V HARTに挿入するためのMSIはRISC-V HARTが持っているIMSICを経由して送信される。したがって、MSIを受信できる仮想RISC-V HARTの数は、システム内のすべてのIMISCが実装するゲスト割り込みファイルの総数に制限される。
- 1つのRISC-V HARTでは、ゲスト割り込みのファイル数はGEILENパラメータに依存する。
- RV32では最大31個、RV64では最大63個に制限される。
これを解決するために、MRIFを使用することによって、デバイスのMSIを受信できる仮想RISC-V HARTの数を無制限に増やすことができる。
図のように、IOMMUは特定のMSIを通常のメモリ内のMRIFデータ構造内の割り込み待機ビットを設定することによって、MSIとして記録することができる。
さらに、IOMMUはハイパーバイザに通知を送信することによって、MRIFのないようが変更された可能性があることを通知する。
このように、MSIを記録するメモリの領域を提供するものの、HARTに対して直接割り込みを挿入するわけではないため、ハイパーバイザはMSI通知を受け取るとMRIFの中身を毎回調べて割り込みが挿入されたかどうかを判断する必要がある。 さらに、仮想HARTの割り込みファイルをMRIFに保持したまま仮想HARTを実行するには、基盤となるMRIFを隠す必要があるため、ハイパーバイザが仮想HARTのスーパバイザレベル割り込みファイルをエミュレートするなどという複雑な機能が必要になる。
このため、MRIFは一般的には物理HARTからスワップアウトされた仮想HARTに使用されることが多い。ハイパーバイザがMRIFに挿入されたMSIをチェックしアイドル状態の仮想HARTを起こすべきだと判断すると、仮想HARTにIMISCのゲスト割り込みファイルを割り当てて、疎の割り込みファイルをMRIFから移動させる。
IOMMUは、MRIFのサポートについては以下の3つのレベルを選択できる。
- メモリ常駐割り込みファイルなし
- アトミック・アップデートなしのメモリ常駐割り込みファイル
- アトミック・アップデートありのメモリ常駐割り込みファイル