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

14
「ハイパーバイザの作り方」 読書会#1 @syuu1228 13822日木曜日

Upload: takuya-asada

Post on 30-Nov-2014

2.050 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

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

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

@syuu1228

13年8月22日木曜日

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

はじめに:SDMの読み方

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

• VMCSの構造:Chapter 24

• VT-x拡張命令:Chapter 30

• VMExit Reason:Appendix C

13年8月22日木曜日

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

「仮想化可能」とは(POPEKとGOLDBERGの仮想化用件)

• システムに影響を及ぼすセンシティブ命令が全て特権命令なら、ユーザ権限で実行することでトラップ可能

• センシティブでない命令はCPUで実行、センシティブな命令だけエミュレーション

User(Ring 3)

Kernel(Ring 0)

Hypervisor(Ring 0)

ハイパーバイザなし

ハイパーバイザあり

User/Kernel

(Ring 3)センシティブ命令の発行などでトラップ

13年8月22日木曜日

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

X86は「仮想化可能」でない

•トラップできないセンシティブ命令がある

•ゲストOSを直接CPUで実行するとホスト環境が壊れる

User(Ring 3)

Kernel(Ring 0)

Hypervisor(Ring 0)

ハイパーバイザなし

ハイパーバイザあり

User/Kernel

(Ring 3)センシティブ命令の発行などでトラップ

13年8月22日木曜日

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

VMWARE’S APPROACH

• Binary Translation(BT)

•ゲストマシンで実行される予定のプログラムを先回りしてチェック、問題のある命令を置き換え

•性能の出るBTを実装するのは大変だが、そこそこ高速に動作していた

13年8月22日木曜日

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

XEN’S APPROACH

• 準仮想化(Para-virtualization)

• ゲストOSをXen専用に書き換え、ゲストOSのカーネルをRing1で実行させる

• 仮想デバイスへのI/Oはソフト割り込みを用いてハイパーバイザに要求

• 本来センシティブ命令を実行していた部分はハイパーバイザ呼び出しに書き換え

• 速いがゲストOSの移植が必要(結局Windowsは公式対応ならず)

13年8月22日木曜日

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

INTEL VT-X

• アーキテクチャ拡張で仮想化に対応

• Ring Protectionから独立した2つのモードを導入

• VMX root mode(ハイパーバイザ)、VMX non-root mode(ゲストマシン)

User(Ring 3)

Kernel(Ring 0)

User(Ring 3)

Kernel(Ring 0)

VMXroot mode

VMXnon-root

mode

VMEntry

VMExit

13年8月22日木曜日

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

INTEL VT-X

• VMX non-root modeでセンシティブ命令を実行するとトラップされてVMX root modeへ切り替わる

• VMX non-root modeへの切り替え:VMEntry、VMX root modeへ戻る:VMExit

User(Ring 3)

Kernel(Ring 0)

User(Ring 3)

Kernel(Ring 0)

VMXroot mode

VMXnon-root

mode

VMEntry

VMExit

13年8月22日木曜日

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

VMCS

• どんなイベントでVMExitしたいかはハイパーバイザの実装による→VMCSで設定可能(メモリ上の設定用構造体)

• ゲストステートの保持、ホストステートの待避、VMExitした理由の通知などにも利用されている

• 4KBアラインの4KB長のデータ構造 内部構造は非公開、専用命令でアクセス

• 詳しくは→SDM Volume 3, Chapter 24

VMCS revision identifier

VMX-abort indicator

VMC

S da

ta

Guest-state area

Host-state area

VM-exection control fields

VM-exit control fields

VM-entry control fields

VM-exit information fields

13年8月22日木曜日

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

VMCS

• VMCS revision identifier:VMCSのデータフォーマットのリビジョン番号。CPUにより書き込まれる。

• VMX-abort indicator:VMExitが失敗した時にCPUによりエラーコードが書き込まれる。

• Guest-state area:VMExit時にゲストレジスタを待避し、VMEntry時に復帰するための領域。

• Host-state area:VMEntry時にハイパーバイザのレジスタを待避し、VMExit時に復帰するための領域。

• VM-execution control fields:ゲストマシン実行時のCPUの挙動を設定する。(例:どのイベントでVMExitするか

• VM-exit control fields:VMExit時のCPUの挙動を設定する。(例:外部割り込み発生時のCPUの挙動

• VM-entry control fields:VMEntry時のCPUの挙動を設定する。(例:ゲストマシンへの割り込み挿入

• VM-exit information fields:VMExit時にCPUによりVMExit Reasonが書き込まれる。

13年8月22日木曜日

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

VT-X拡張命令

• VT-xを有効・無効:VMXON/VMXOFF

• VMEntry:VMLAUNCH(初回)/VMRESUME(再開)

• VMCSをCPUにセット・クリア:VMPTRLD/VMCLEAR

• VMCS読み・書き:VMREAD/VMWRITE

•詳しくは→SDM Volume 3, Chapter 30

13年8月22日木曜日

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

VMEXIT REASON

• VMExitが発生すると、CPUはモードをVMX root modeへ切り替えてVMCSのVM-exit information fieldsにExit Reasonを書き込む

• Exit Reasonの一覧はAppendix Cにある

• IO命令・RDMSR/WRMSR命令の実行・CRレジスタへのアクセスなどセンシティブ命令に相当するものの他にも外部割り込みの着信などゲストマシン由来ではない要因も存在

13年8月22日木曜日

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

EXIT QUALIFICATION

• Exit Reasonによっては追加の情報が提供される:Exit Qualification

• Volume3, Chapter 27.2.1

• CRレジスタアクセスの場合:レジスタ番号・使われた命令・使われたレジスタ、etc

13年8月22日木曜日

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

ハイパーバイザのライフサイクル

•何かあるとVMExit、ハイパーバイザでエミュレーションしてVMEntryの繰り返し

①初期化

②VMEntry

③VMExit

③エミュレーション

VMLAUNCH

VMExitイベント発生

VMRESUME

VMExit要因に対応したエミュレーション処理を呼び出し

13年8月22日木曜日