IOMMUのアドレス変換プロセス
- デバイスコンテキストの特定
- メモリアクセスを行ったデバイスの識別子(
device_id
)を利用してデバイスディレクトリテーブル(DDT)を参照する。- このDDTを辿ることで、対応するデバイスコンテキスト(Device Context, DC)を特定する。
- デバイスコンテキストには、該当デバイスのアドレス変換に必要な設定や、ルートページテーブルへのポインタが含まれている(SATPのようなもの?)。
- メモリアクセスを行ったデバイスの識別子(
- プロセスコンテキストの特定(必要な場合)
- デバイスが複数のプロセスをサポートしている場合(例:GPUのようなハードウェア)、IOMMUはデバイスから送られてきた
process_id
を使用する必要がある。- このとき、プロセスディレクトリテーブル(PDT)を参照する。
- PDTを辿ることで、該当プロセスのプロセスコンテキスト(Process Context, PC)を特定する。
- プロセスコンテキストには、1段階目のアドレス変換を行うためのルートページテーブルへのポインタが含まれている(SATPのようなもの?)。
- デバイスが複数のプロセスをサポートしている場合(例:GPUのようなハードウェア)、IOMMUはデバイスから送られてきた
- ページテーブルを用いたIOVAの解決
- IOMMUは、特定されたデバイスコンテキストまたはプロセスコンテキストに記載されたルートページテーブルを利用して、IOVAを段階的に解決する。
- 解決の流れは、CPUのMMUと同様に階層構造(多段階ページテーブル)を通じて行われる。
- 2段階アドレス変換(必要に応じて)
- ゲストOSを使用している場合、1段階目でIOVAをゲスト物理アドレス(GPA)に変換し、2段階目でGPAをスーパーバイザ物理アドレス(SPA)に変換する。
- それぞれの段階で、対応するページテーブルが利用される。
- 物理アドレス(SPA)の返却
- 最終的に解決されたSPAがデバイスに返され、メモリアクセスが実行される。
デバイスコンテキスト・プロセスコンテキストのルート・ページ・テーブルへのポインタを使って以下のようにアクセスする。
基本構造
- デバイスコンテキストのルートページテーブルへのポインタ
- デバイスコンテキストには、第2段階のアドレス変換(通常はGPA → SPA)のためのルートページテーブルポインタが含まれている。
- デバイスIDに基づいてIOMMUがデバイスコンテキストを特定し、このポインタを参照する。
- プロセスコンテキストのルートページテーブルへのポインタ
- プロセスコンテキストには、第1段階のアドレス変換(IOVA → GPA)のためのルートページテーブルポインタが含まれている。
- デバイスが複数のプロセスをサポートする場合、プロセスID(Process ID, PID)を使用してプロセスコンテキストを特定し、このポインタを参照する。
アクセスの流れ:2段階アドレス変換
1. デバイスからのアクセス要求
- デバイスがメモリアクセスを行う際に、以下の情報をIOMMUに送信する:
- IOVA(I/O仮想アドレス)
- デバイスID(Device ID, DID)
- プロセスID(Process ID, PID、必要な場合)
2. デバイスコンテキストの特定
- デバイスコンテキストには、第2段階のアドレス変換(GPA → SPA)のルートページテーブルポインタが含まれている。
3. プロセスコンテキストの特定(必要な場合)
- プロセスコンテキストには、第1段階のアドレス変換(IOVA → GPA)のルートページテーブルポインタが含まれている。
4. 第1段階のアドレス変換(IOVA → GPA)
- プロセスコンテキストのルートページテーブルポインタを使用して、IOMMUはIOVAをGPAに変換する。
- この変換は、階層的なページテーブル(例:3レベルまたは4レベル)を辿ることで行われる:
- IOVAの上位ビットを使用して第1レベルページテーブルを参照。
- 次の中間ビットを使用して第2レベルページテーブルを参照。
- 最終的に、GPA(ゲスト物理アドレス)を取得。
5. 第2段階のアドレス変換(GPA → SPA)
- デバイスコンテキストのルートページテーブルポインタを使用して、GPAをSPAに変換する。
- この変換も、階層的なページテーブルを使用して行われる:
- GPAから対応するSPAが特定され、最終的な物理メモリアドレスが返される。
6. デバイスへの応答
- IOMMUは最終的なSPA(Supervisor Physical Address)をデバイスに返す。
- デバイスはこのSPAを使用して物理メモリに直接アクセスする。