RMP_BASE ... RMP 用領域の始端アドレス (Page-Aligned) RMP_END ... RMP 用領域の終端アドレス (Page-Aligned)
(RMP_END - RMP_BASE) / (RMPE サイズ) * 4096 = RMP に守られた物理メモリの上限
RMP に守られた物理メモリにはページ毎に RMPE エントリが割り当てられ、以下のフィールドを保持する。
ASID | 対象の VM の ID (0 は VMM に割当) |
TYPE | 割当の種類(SHARED|PRIVATE|MERGEABLE|LEAF) |
GPA | type=MERGEABLE かつ FIXED=1 のとき:RMPE Leaf への物理アドレス type=MERGEABLE かつ FIXED=0 、又は type=PRIVATE:割り当てた VM における gPA |
VALIDATED | VM からの PVALIDATE 命令が成功するとセットされ、VMM による RMPUPDATE でクリアされる |
FIXED | VMM による PFIX 命令が成功するとセット FIXED=1 のときは VALIDATED は常に 1 |
ASID をインデックスとした 8 バイトのエントリを 512 個保持する。 ある VM に対応する物理ページが PMERGE されると、ASID からエントリを参照し、その gPA が書き込まれる。その際 x86 の Present ビットと同様に 0 ビット目がセットされる。
各 PTE の[53:52]は割当の種類(SHARED|PRIVATE|MERGEABLE|LEAF)を表す
引数: HPA, GPA, ASID, TYPE
- VMM のみにより実行可能
- HPA に対応する RMPE の各フィールドを更新する
- 成功時には RMPE 中の VALIDATED はクリアされる
- 既に TYPE=LEAF である RMPE は更新できない
- ASID を変更する場合は対応する物理ページはゼロ埋めされる
引数: GVA, TYPE
- VM のみのより実行可能
- GVA に対応する RMPE の VALIDATED をセットする
- RMPE 内の TYPE が TYPE と一致しない場合エラー
引数: HPA, LEAF
- VMM のみにより実行可能
- HPA が指す物理ページを読み込み専用にし、LEAF が指す物理ページを RMP Leaf として使用する
- HPA に対応する RMPE の FIXED がセットされ、GPA には LEAF が代入され、ASID を RMPE Leaf のインデックスとして参照したエントリ内に GPA の値が入る
- HPA に対応する RMPE は TYPE=MERGEABLE かつ FIXED=0 かつ VALIDATED=1 である必要がある
- LEAF に対応する RMPE は TYPE=LEAFである必要がある
- TLB はクリア
引数: HPA1, HPA2
- VMM のみにより実行可能
- HPA1 が指す物理ページに HPA2 が指す物理ページをマージする
- HPA1 に対応する RMPE の GPA 及び HPA2 に対応する RMPE の ASID から RMP Leaf エントリを参照し、HPA2 に対応する RMPE の GPA を書き込む
- マージ後の HPA2 が指す物理ページはゼロ埋めされる
- VMM はその後 nPT エントリ内の hPA を変更することが期待される
- HPA1 と HPA2 が指す物理ページの内容は同じである必要がある
- HPA1 と HPA2 に対応する RMPE は TYPE=MERGEABLE かつ VALIDATED=1 である必要がある
- HPA1 に対応する RMPE は FIXED=1、 HPA2 に対応する RMPE は FIXED=0 である必要がある
- TLB はクリア
引数: HPA1, HPA2, ASID
- VMM のみにより実行可能
- HPA1 が指す FIXED な物理ページからページの内容を HPA2 が指す位置にコピーし、それを ASID に対応する VM のみからアクセスできるようにする
- HPA1 に対応する RMPE の GPA と ASID から RMP Leaf のエントリを参照し、そこに記された gPA 及び ASID を、 HPA2 に対応する新たに作成された RMPE にコピーし、エントリを削除する。
- VMM はその後 nPT エントリ内の hPA を変更することが期待される
- 新たに作成された RMPE は VALIDATED=1, TYPE=MERGEABLE, FIXED=0 となる
- HPA1 に対応する RMPE は MERGEABLE=1 かつ FIXED =1 である必要がある
- HPA1 に対応する RMPE の GPA の指す RMP Leaf 内の ASID が指すエントリが存在する必要がある
- HPA2 に対応する RMPE は TYPE=SHARED である必要がある
- TLB はクリア
引数:HPA
- VMM のみにより実行可能
- MERGEABLE なページの読み取り専用状態を解除し、RMP Leaf に使用されていたページを開放する
- HPA に対応する RMPE の ASID と GPA から RMP Leaf エントリを辿り、gPA を RMPE 内の GPA にセットし、RMP Leaf に使用されたページに対応する RMPE は TYPE=SHARED とする
- HPA に対応する RMPE の ASID と GPA から参照する RMP Leaf エントリが存在する必要がある
- HPA に対応する RMPE は FIXED=1 である必要がある
- RMP 用領域への書き込みは不可
- RMP に保護された領域外へのアクセスはいずれも可
- gPTE と nPTE の[53:52]からメモリアクセスタイプ(SHARED | PRIVATE | MERGEABLE)決める
- メモリアクセスタイプと RMPE の TYPE が異なる場合はエラー
- FIXED=1 のページへの書き込みは不可
- PRIVATE=1 又は、 MERGEABLE=1 かつ FIXED=0 のページでは GPA とメモリアクセス時の gPA が同じであることを確認
- MERGEABLE=1 かつ FIXED=1 のページでは GPA から RMP Leaf を辿り、その中に ASID に対応するエントリが存在することを確認し、それが指す gPA がメモリアクセス時の gPA と同じであることを確認
- MERGEABLE / PRIVATE なページの ASID 変更による他の VM からの参照
- MERGEABLE / PRIVATE なページを SHARED に変更することによる他の VM/VMM からの参照
- RMPUPDATE 時にページをゼロ埋め
- MERGEABLE / PRIVATE なページに対応する RMPE を VMM が更新し、そのページに対して他の gPA / VM から読み書きする (Memory Aliasing)
- RMPUPDATE 時に VALIDATED=0 となるため書き込み時にメモリ参照失敗
- VMM が nPT を更新し、MERGEABLE / PRIVATE なページを他の hPA に割り当てる (Memory Re-mapping)
- VM が 2 回 PVALIDATE を行わない限り VM からはメモリアクセスできない
- マージ済ページへの未登録な VM からのアクセス
- RMP Leaf にエントリが存在せず、メモリ参照失敗
- 内容の異なるページのマージによるメモリ内容改ざん
- PMERGE 失敗
- マージ済みのページへの VMM/VM からの改ざん
- FIXED=1 によりメモリ参照失敗
- VMM が任意にエントリを編集したページを RMP Leaf として PFIX を行うことで、VM から PVALIDATE を行わずに gPA->hPA のマッピングを改ざんする
- PFIX 時に RMP Leaf はゼロ埋めされる
- VMM による RMP Leaf の改ざん
- TYPE=LEAF のページは書き込み不可
- マージによって開放されたページの VMM / 他の VM からのアクセス
- PMERGE 時にマージ元のページはゼロ埋めされる
- 悪意ある VM が他の VM のページの内容を予想し、その内容と同じページを用意し、VMM からの PMERGE による TLB キャッシュクリアを観測することで、他の VM のメモリ内容を観測する
- 要検討
- 悪意ある VM が他の VM のページの内容を予想し、その内容と同じページを用意し、VMM による PMERGE を待った後に書き込みを行うことで CoW のレイテンシを観測し、他の VM のメモリ内容を観測する
- 要検討
- MERGEABLE なページは常に読み込み専用にする?