RISC-V IOMMUの構成について、概略をざっくり理解するためのメモ。
何回か読もうとして挫折してきたので、もう一度ちゃんと読んでみようと思う。
ファースト・ステージ・コンテキスト (fsc
)
DC.tc.PDTV
が0の場合、DC.fsc
フィールドは、第一段階のアドレス変換とプロテクションのコントロールを提供するiosatp
を保持する。
第1ステージのページテーブルフォーマットは、Privileged仕様で定義されている通りである。
DC.tc.SXL
フィールドは、サポートされるページド仮想メモリ方式を制御する。
iosatp.MODE
は、ページングされた仮想メモリ方式を識別し、表3で定義されているように符号化される。
iosatp.PPN
フィールドは、第1ステージページテーブルのルートページのPPNを保持する。
第2段階のアドレス変換が Bare
でない場合、iosatp.PPN
はゲスト PPN
である。 その後、 iohgatp
によって制御されるゲスト物理アドレス変換プロセスによって、ルートページのGPA がスーパーバイザ物理アドレスに変換される。
DC.tc.SXL=0 | ||
---|---|---|
Value | Name | Description |
0 | Bare | 変換も保護もない。 |
1-7 | — | 標準的な使用のために予約されている。 |
8 | Sv39 | ページベースの39ビット仮想アドレッシング。 |
9 | Sv48 | ページベースの48ビット仮想アドレッシング。 |
10 | Sv57 | ページベースの57ビット仮想アドレッシング。 |
11-13 | — | 標準的な使用のために予約されている。 |
14-15 | — | カスタム仕様。 |
DC.tc.SXL=1 | ||
Value | Name | Description |
0 | Bare | 変換も保護もない。 |
1-7 | — | 標準的な使用のために予約されている。 |
8 | Sv32 | ページベースの32ビット仮想アドレッシング。 |
9-15 | — | 標準的な使用のために予約されている。 |
DC.tc.PDTV
が1の場合、 DC.fsc
フィールドはプロセス・ディレクトリ・テーブル・ポインタ (pdtp
)を保持する。 デバイスが process_id
によって選択された複数のプロセス・コンテキストをサポートしている場合、PDT
は、仮想アドレス変換と保護のために、第1段階のページ・テーブルと関連するPSCID
を決定するために使用される。
pdtp
フィールドはルート PDT
の PPN
を保持し、 MODE
フィールドはPDT
のレベル数を決定する。
第2段階のアドレス変換が Bare
でない場合、 pdtp.PPN
フィールドはゲスト PPN
を保持する。 その後、 iohgatp
によって制御されるゲスト物理アドレス変換プロセスによって、ルート PDT
の GPA
がスーパーバイザ物理アドレスに変換される。
第2ステージのページテーブルを使用して PDT
のアドレスを変換すると、PDT
をゲストOSによって割り当てられたメモリに保持できるようになり、ゲストOSがPDTを直接編集して、第1ステージのページテーブルによって識別される仮想アドレス空間をprocess_id
に関連付けることができる。
値 | 名前 | 説明 |
---|---|---|
0 | Bare | 第一段階のアドレス変換もプロテクションもない。 |
1 | PD8 | 8ビットのプロセスIDが有効。 process_id のビット 19:8 は0でなければならない。 |
2 | PD17 | 17ビットのプロセスIDが有効。ディレクトリには2つのレベルがある。ルートPDTページには512エントリ、リーフ・レベルには256エントリがある。 process_id のビット19:17は0でなければならない。 |
3 | PD20 | 20ビットのプロセスIDが有効。ディレクトリには3つのレベルがある。ルートPDTには8エントリがあり、次の非リーフレベルには512エントリがある。リーフレベルには256のエントリーがある。 |
4-13 | — | 標準的な使用のために予約されている。 |
14-15 | — | カスタム仕様。 |