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

15
「ハイパーバイザの作り方」 読書会#2 @syuu1228 13911日水曜日

Upload: takuya-asada

Post on 30-Nov-2014

2.200 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

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

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

@syuu1228

13年9月11日水曜日

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

はじめに:本日の資料

•ハイパーバイザの作り方~ちゃんと理解する仮想化技術~ 第2回 Intel VT-xの概要とメモリ仮想化http://d.hatena.ne.jp/syuu1228/20130823/1377223503

13年9月11日水曜日

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

はじめに:SDMの読み方

• VT-xの範囲はVolume 3, Chapter 23-33 + Appendix A-C

•アドレス変換:Chapter 28

•メモリ仮想化:Chapter 32.3

13年9月11日水曜日

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

ゲストメモリ空間が仮想化されていないと

CPU上で直接ゲストOSの命令列を実行する          ↓メモリアクセス命令も直接実行される          ↓ホストマシン上の全メモリ空間にアクセス可能になる          ↓ハイパーバイザのメモリ領域にアクセス出来てしまうホストマシン上のデバイスへMMIO出来てしまう

13年9月11日水曜日

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

ページング

• 仮想メモリ(仮想マシンの話とは関係ない)をサポートするOS/アーキテクチャでは、プロセス1つ1つに独立した仮想的なメモリ空間を提供している

• 個別のメモリ空間を提供する事により、他のプロセスやカーネルのメモリ空間への不正なアクセスを防ぐことができる(メモリ保護)

• メモリ空間を固定長のページに分割し、仮想ページ番号:物理ページ番号の割り当て表(ページテーブル)を使ってメモリアクセスを行うページング方式が主流(仮想アドレスから物理アドレスへの変換はMMUがページテーブルを用いて行う)

プロセスA

12345678

物理メモリ1 223

1 562

3

ページテーブルA

ページテーブルB

12

プロセスB

1

▼図2 ページテーブル

13年9月11日水曜日

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

ページングと仮想化

• ゲストマシン上のページテーブルが指す物理ページ番号と、ハイパーバイザがゲストマシンへ割り当てたい実際の物理ページの範囲が異なる

• ゲスト物理ページ番号:ホスト物理ページ番号の変換を行いたい

プロセスA

1234

ゲスト物理メモリ

12345678

物理メモリ

1 12

ページテーブルAゲストA

1

プロセスB12

34

ページテーブルB

12

プロセスA

1234

ゲスト物理メモリ1 1

2

ページテーブルAゲストB

1

プロセスB12

34

ページテーブルB

12

13年9月11日水曜日

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

X86/X64のページング機構

• 1ページ=4KB(CPUの設定によっては2MB, 4MB, 1GBのページもサポートするが、あまり使われていない)

• 多段化されたページテーブルを用いる(x86では2段、x64・PAEでは4段)

• MMUがページテーブルへアクセス、アドレス変換はソフトウェアに対して透過的に行われる

• CR3:ページテーブルのアドレスを指定/CR0:ページング有効化ビット(PG)

• ページが存在しないと#PF(exception 14)が発生

13年9月11日水曜日

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

二段ページテーブル(X86)

•ページテーブル=4MBの範囲(1024エントリ)

•ページディレクトリ=4GBの範囲(1024エントリ)

CR3 PageDirectory

4MB* 1024

Directory31 22

Table21 12

Offset11 0

PageTable

PageTable

4KB* 1024PhysicalPage

PhysicalPage

PhysicalPage

PhysicalPage

4KB

13年9月11日水曜日

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

四段ページテーブル(X64)

• ページテーブル=2MBの範囲(512エントリ)

• ページディレクトリ=1GBの範囲(512エントリ)

• ページディレクトリポインタ=512GBの範囲(512エントリ)

• ページマップレベル4=256TBの範囲(512エントリ)

CR3 Page MapLevel 4

512GB* 512

PML447 39

Directory Ptr38 30

Directory29 21

Table20 12

Offset11 0

PageDirectoryPointer

PageDirectoryPointer

1GB* 512PageDirectory

PageTable

PageTable

PageTable

2MB* 512PageTable

PageTable

PageTable

PageTable

4KB* 512PhysicalPage

PhysicalPage

PhysicalPage

PhysicalPage

4KB

13年9月11日水曜日

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

メモリの仮想化手法

• ゲスト物理ページ番号からホスト物理ページ番号への変換を行う方法として、ソフトウェアにより実現するものとハードウェアにより実現するものの二種類がある

• シャドーページング

• ソフトウェア上のテクニックにより仮想化を実現

• ソフトウェアによるテクニックのため、元々初期のVMwareのようにVT-xを使わない仮想化方式で利用されていた

• それなりに大きなオーバーヘッドが生じる

• ネステッドページング(Intel EPT)

• ゲスト物理ページ番号からホスト物理ページ番号の変換を行うための新たなページテーブル(EPT)を導入

• VMX non-root mode(ゲストモード)でのメモリアクセス時にEPTを参照してアドレス解決を行うようMMUを拡張

• 高速だが、対応CPUが限られる

13年9月11日水曜日

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

シャドーページング

ゲスト上での物理ページ番号1~4が5~8になるように、ハイパーバイザからアドレス変換の結果を曲げたい                    ↓

ゲストOSにはページテーブルAを使っているように見せかけて、実際にはハイパーバイザがページテーブルAをコピーして必要な変更を加えたページテーブルA”をCPUへセットしよう

プロセスA

1234

12345678

物理メモリ

1 22

ページテーブルA

ゲストA

1

プロセスB12

34

ページテーブルB

1 52

ページテーブルA”

12

78

ページテーブルB”

12

ゲスト物理メモリゲスト物理メモリ

6

13年9月11日水曜日

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

シャドーページングの実装• CR3への書き込み(=ページテーブルのセット)のトラップ

CR3への書き込みでVMExit指定されたページテーブルの複製(シャドーページテーブル)を作り、シャドーページテーブルのアドレスをCR3へセット

• CR3の読み込み(=ページテーブルアドレスの読み込み)のトラップCR3の読み込みでVMExitシャドー元のアドレスを返す

• ページテーブルエントリの書き込みのトラップページテーブルエントリが存在する範囲のページを書き込み禁止にしてアクセスがあったら#GP 例外が発生するようにしておく#GPでVMExitページテーブルエントリへの読み書きの辻褄が合うように、シャドー元とシャドー先ページテーブルを書き換え

13年9月11日水曜日

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

EPT

• 仮想マシンの初期化時にEPTを作成、ページ割り当てを決めてEPTに設定(通常のページングと同じく、未割り当てにしておいてページフォールト契機にデマンド割り当てする事も可能)

• EPTの構造はx64の四段ページテーブルと同じ(ページテーブルエントリの構造は異なる)

• VMCSのVM Execution control field→Extended Page Table Pointer(EPTP)にEPTのアドレスを設定

• シャドーページングのようにページング周りでトラップを行う必要なく、MMUが透過的にアドレス変換を実行

プロセスA

1234

ゲスト物理メモリ

12345678

物理メモリ

1 22

ページテーブルA

ゲストA

1

プロセスB12

34

ページテーブルB

12

56

34

78

EPT A

12

13年9月11日水曜日

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

EPT VIOLATION

• EPT上に存在しないページやアクセス権限がないページへのアクセスが発生すると、EPT Violation VMExitが発生する

• not presentを使ってデマンドページングを行ったり、アクセス権限エラーを使ってMMIOのエミュレーションを行う事が可能(MMIOについては今回は詳しく触れない)

13年9月11日水曜日

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

VPID

• TLBにホスト側でのアドレス変換結果がキャッシュされている状態でVMEntry、またはTLBにゲスト側のアドレス変換結果がキャッシュされている状態でVMExitし、キャッシュを保持したまま実行を続けると誤動作を起こす

• VMEntry時/VMExit時に毎回TLBフラッシュが必要→効率が悪い

• TLBエントリにゲストマシン固有のIDをタグ付け出来るようにした(ASIDの仮想マシン版)

• VMCSのVM Execution control fieldでVPIDを設定、INVVPID命令で特定タグのTLBエントリのみフラッシュ

13年9月11日水曜日