「ハイパーバイザの作り方」
読書会#2
@syuu1228
13年9月11日水曜日
はじめに:本日の資料
• ハイパーバイザの作り方∼ちゃんと理解する仮想化技
術∼ 第2回 IntelVT-xの概要とメモリ仮想化
http://d.hatena.ne.jp/syuu1228/20130823/1377223503
13年9月11日水曜日
はじめに:SDMの読み方
• VT-xの範囲はVolume 3, Chapter 23-33 + Appendix A-C
• アドレス変換:Chapter 28
• メモリ仮想化:Chapter 32.3
13年9月11日水曜日
ゲストメモリ空間が
仮想化されていないと
CPU上で直接ゲストOSの命令列を実行する
          ↓
メモリアクセス命令も直接実行される
          ↓
ホストマシン上の全メモリ空間にアクセス可能になる
          ↓
ハイパーバイザのメモリ領域にアクセス出来てしまう
ホストマシン上のデバイスへMMIO出来てしまう
13年9月11日水曜日
ページング
• 仮想メモリ(仮想マシンの話とは関係ない)をサポートするOS/アーキテクチャでは、プロセス1つ
1つに独立した仮想的なメモリ空間を提供している
• 個別のメモリ空間を提供する事により、他のプロセスやカーネルのメモリ空間への不正なアクセスを
防ぐことができる(メモリ保護)
• メモリ空間を固定長のページに分割し、仮想ページ番号:物理ページ番号の割り当て表(ページテー
ブル)を使ってメモリアクセスを行うページング方式が主流
(仮想アドレスから物理アドレスへの変換はMMUがページテーブルを用いて行う)
プロセス A
1
2
3
4
5
6
7
8
物理メモリ
1 2
2
3
1 5
62
3
ページテーブル A
ページテーブル B
1
2
プロセス B
1
▼図2 ページテーブル
13年9月11日水曜日
ページングと仮想化
• ゲストマシン上のページテーブルが指す物理ページ番号と、ハイ
パーバイザがゲストマシンへ割り当てたい実際の物理ページの範
囲が異なる
• ゲスト物理ページ番号:ホスト物理ページ番号の変換を行いたい
プロセス A
1
2
3
4
ゲスト
物理メモリ
1
2
3
4
5
6
7
8
物理メモリ
1 1
2
ページテーブル A
ゲストA
1
プロセス B
1
2
3
4
ページテーブル B
1
2
プロセス A
1
2
3
4
ゲスト
物理メモリ1 1
2
ページテーブル A
ゲストB
1
プロセス B
1
2
3
4
ページテーブル B
1
2
13年9月11日水曜日
X86/X64のページング機構
• 1ページ=4KB(CPUの設定によっては2MB, 4MB, 1GBのページもサポートする
が、あまり使われていない)
• 多段化されたページテーブルを用いる(x86では2段、x64・PAEでは4段)
• MMUがページテーブルへアクセス、アドレス変換はソフトウェアに対して透
過的に行われる
• CR3:ページテーブルのアドレスを指定/CR0:ページング有効化ビット
(PG)
• ページが存在しないと#PF(exception 14)が発生
13年9月11日水曜日
二段ページテーブル(X86)
• ページテーブル=4MBの範囲(1024エントリ)
• ページディレクトリ=4GBの範囲(1024エントリ)
CR3 Page
Directory
4MB* 1024
Directory
31 22
Table
21 12
Offset
11 0
Page
Table
Page
Table
4KB* 1024
Physical
Page
Physical
Page
Physical
Page
Physical
Page
4KB
13年9月11日水曜日
四段ページテーブル(X64)
• ページテーブル=2MBの範囲(512エントリ)
• ページディレクトリ=1GBの範囲(512エントリ)
• ページディレクトリポインタ=512GBの範囲(512エントリ)
• ページマップレベル4=256TBの範囲(512エントリ)
CR3 Page Map
Level 4
512GB* 512
PML4
47 39
Directory Ptr
38 30
Directory
29 21
Table
20 12
Offset
11 0
Page
Directory
Pointer
Page
Directory
Pointer
1GB* 512
Page
Directory
Page
Table
Page
Table
Page
Table
2MB* 512
Page
Table
Page
Table
Page
Table
Page
Table
4KB* 512
Physical
Page
Physical
Page
Physical
Page
Physical
Page
4KB
13年9月11日水曜日
メモリの仮想化手法
• ゲスト物理ページ番号からホスト物理ページ番号への変換を行う方法として、ソフトウェアにより実現するものとハ
ードウェアにより実現するものの二種類がある
• シャドーページング
• ソフトウェア上のテクニックにより仮想化を実現
• ソフトウェアによるテクニックのため、元々初期のVMwareのようにVT-xを使わない仮想化方式で利用されていた
• それなりに大きなオーバーヘッドが生じる
• ネステッドページング(Intel EPT)
• ゲスト物理ページ番号からホスト物理ページ番号の変換を行うための新たなページテーブル(EPT)を導入
• VMX non-root mode(ゲストモード)でのメモリアクセス時にEPTを参照してアドレス解決を行うようMMUを拡張
• 高速だが、対応CPUが限られる
13年9月11日水曜日
シャドーページング
ゲスト上での物理ページ番号1∼4が5∼8になるように、ハイパーバイザからアドレス変
換の結果を曲げたい
                    ↓
ゲストOSにはページテーブルAを使っているように見せかけて、実際にはハイパーバイザが
ページテーブルAをコピーして必要な変更を加えたページテーブルA”をCPUへセットしよう
プロセス A
1
2
3
4
1
2
3
4
5
6
7
8
物理メモリ
1 2
2
ページテーブル A
ゲストA
1
プロセス B
1
2
3
4
ページテーブル B
1 5
2
ページテーブル A”
1
2
7
8
ページテーブル B”
1
2
ゲスト
物理メモリ
ゲスト
物理メモリ
6
13年9月11日水曜日
シャドーページングの実装
• CR3への書き込み(=ページテーブルのセット)のトラップ
CR3への書き込みでVMExit
指定されたページテーブルの複製(シャドーページテーブル)を作り、シャドーページテーブルのアドレス
をCR3へセット
• CR3の読み込み(=ページテーブルアドレスの読み込み)のトラップ
CR3の読み込みでVMExit
シャドー元のアドレスを返す
• ページテーブルエントリの書き込みのトラップ
ページテーブルエントリが存在する範囲のページを書き込み禁止にしてアクセスがあったら#GP 例外が発生
するようにしておく
#GPでVMExit
ページテーブルエントリへの読み書きの 褄が合うように、シャドー元とシャドー先ページテーブルを書き
換え
13年9月11日水曜日
EPT
• 仮想マシンの初期化時にEPTを作成、ページ割り当てを決めてEPTに設定(通常のページングと同じく、未割り
当てにしておいてページフォールト契機にデマンド割り当てする事も可能)
• EPTの構造はx64の四段ページテーブルと同じ(ページテーブルエントリの構造は異なる)
• VMCSのVM Execution control field→Extended PageTable Pointer(EPTP)にEPTのアドレスを設定
• シャドーページングのようにページング周りでトラップを行う必要なく、MMUが透過的にアドレス変換を実行
プロセス A
1
2
3
4
ゲスト
物理メモリ
1
2
3
4
5
6
7
8
物理メモリ
1 2
2
ページテーブル A
ゲストA
1
プロセス B
1
2
3
4
ページテーブル B
1
2
5
6
3
4
7
8
EPT A
1
2
13年9月11日水曜日
EPTVIOLATION
• EPT上に存在しないページやアクセス権限がないページ
へのアクセスが発生すると、EPTViolationVMExitが発生
する
• not presentを使ってデマンドページングを行ったり、ア
クセス権限エラーを使ってMMIOのエミュレーションを
行う事が可能(MMIOについては今回は詳しく触れな
い)
13年9月11日水曜日
VPID
• TLBにホスト側でのアドレス変換結果がキャッシュされている状態でVMEntry、ま
たはTLBにゲスト側のアドレス変換結果がキャッシュされている状態でVMExit
し、キャッシュを保持したまま実行を続けると誤動作を起こす
• VMEntry時/VMExit時に毎回TLBフラッシュが必要
→効率が悪い
• TLBエントリにゲストマシン固有のIDをタグ付け出来るようにした(ASIDの仮想
マシン版)
• VMCSのVM Execution control fieldでVPIDを設定、INVVPID命令で特定タグのTLBエ
ントリのみフラッシュ
13年9月11日水曜日

「ハイパーバイザの作り方」読書会#2