「ハイパーバイザの作り方」読書会#1
DESCRIPTION
TRANSCRIPT
「ハイパーバイザの作り方」読書会#1
@syuu1228
13年8月22日木曜日
はじめに: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日木曜日
「仮想化可能」とは(POPEKとGOLDBERGの仮想化用件)
• システムに影響を及ぼすセンシティブ命令が全て特権命令なら、ユーザ権限で実行することでトラップ可能
• センシティブでない命令はCPUで実行、センシティブな命令だけエミュレーション
User(Ring 3)
Kernel(Ring 0)
Hypervisor(Ring 0)
ハイパーバイザなし
ハイパーバイザあり
User/Kernel
(Ring 3)センシティブ命令の発行などでトラップ
13年8月22日木曜日
X86は「仮想化可能」でない
•トラップできないセンシティブ命令がある
•ゲストOSを直接CPUで実行するとホスト環境が壊れる
User(Ring 3)
Kernel(Ring 0)
Hypervisor(Ring 0)
ハイパーバイザなし
ハイパーバイザあり
User/Kernel
(Ring 3)センシティブ命令の発行などでトラップ
13年8月22日木曜日
VMWARE’S APPROACH
• Binary Translation(BT)
•ゲストマシンで実行される予定のプログラムを先回りしてチェック、問題のある命令を置き換え
•性能の出るBTを実装するのは大変だが、そこそこ高速に動作していた
13年8月22日木曜日
XEN’S APPROACH
• 準仮想化(Para-virtualization)
• ゲストOSをXen専用に書き換え、ゲストOSのカーネルをRing1で実行させる
• 仮想デバイスへのI/Oはソフト割り込みを用いてハイパーバイザに要求
• 本来センシティブ命令を実行していた部分はハイパーバイザ呼び出しに書き換え
• 速いがゲストOSの移植が必要(結局Windowsは公式対応ならず)
13年8月22日木曜日
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日木曜日
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日木曜日
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日木曜日
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日木曜日
VT-X拡張命令
• VT-xを有効・無効:VMXON/VMXOFF
• VMEntry:VMLAUNCH(初回)/VMRESUME(再開)
• VMCSをCPUにセット・クリア:VMPTRLD/VMCLEAR
• VMCS読み・書き:VMREAD/VMWRITE
•詳しくは→SDM Volume 3, Chapter 30
13年8月22日木曜日
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日木曜日
EXIT QUALIFICATION
• Exit Reasonによっては追加の情報が提供される:Exit Qualification
• Volume3, Chapter 27.2.1
• CRレジスタアクセスの場合:レジスタ番号・使われた命令・使われたレジスタ、etc
13年8月22日木曜日
ハイパーバイザのライフサイクル
•何かあるとVMExit、ハイパーバイザでエミュレーションしてVMEntryの繰り返し
①初期化
②VMEntry
③VMExit
③エミュレーション
VMLAUNCH
VMExitイベント発生
VMRESUME
VMExit要因に対応したエミュレーション処理を呼び出し
13年8月22日木曜日