Upload
tsuyoshi-ozawa
View
3.057
Download
6
Embed Size (px)
DESCRIPTION
Description of the Intel-VT.
Citation preview
Bitvisor 読書会第二回前半筑波大学システム情報工学研究科
コンピュータサイエンス専攻 ソフトウェア研究室Tsuyoshi Ozawa
12009年10月7日水曜日
本日の内容
• x86の保護モデル
• x86におけるIOの種類
• Intel-VT の役割
• Intel-VT の提供する命令とその挙動
22009年10月7日水曜日
ちょっと復習!
x86における保護モデル
32009年10月7日水曜日
x86の保護モデル(リングプロテクション)
数字が低いほど特権レベルが高い( 0 が最強 )
OSはRing 0 で動作
ユーザプログラムはRing 3 で動く
Kernel Mode
Ring3 = User Mode
Ring2
Ring1
Ring0
42009年10月7日水曜日
リングプロテクションで保護されているもの
1. 特権命令の発行
2. メモリアクセス
52009年10月7日水曜日
Kernel Mode
Ring3
Ring2
Ring1
Ring0
User Mode
Ring3 から Ring0 へのアクセス
62009年10月7日水曜日
Kernel Mode
Ring3
Ring2
Ring1
Ring0
ここで out 命令
User Mode
Ring3 から Ring0 へのアクセス
62009年10月7日水曜日
Kernel Mode
Ring3
Ring2
Ring1
Ring0
ここで out 命令
User Mode
Ring3 から Ring0 へのアクセス
ダメ!(例外を発生)
62009年10月7日水曜日
Kernel Mode
Ring3
Ring2
Ring1
Ring0
ここで out 命令
Ring3 から Ring0 へのアクセス
例外に対応した例外ハンドラが動作する
User Mode
72009年10月7日水曜日
Kernel Mode
Ring3
Ring2
Ring1
Ring0
ここで out 命令
Ring3 から Ring0 へのアクセス
処理が戻る
User Mode
82009年10月7日水曜日
x86におけるIOの種類
92009年10月7日水曜日
x86のIOの種類
• Memory Mapped IO
• 物理メモリ空間をポートにマップ
• IO Mapped IO
• IOアドレス空間をポートにマップ
102009年10月7日水曜日
MMIOのイメージ
Physical memory
Memory
Mapped IO
Kernel
mov %eax,(%ebx)
112009年10月7日水曜日
MMIOの補足
• 物理メモリレイアウトはハードウェアメーカが決める
• Datasheet を読むとわかるIntel G35 Express Chipset など
http://support.intel.co.jp/design/chipsets/datashts/317607.htm より引用
122009年10月7日水曜日
MMIOの補足
• 物理メモリレイアウトはハードウェアメーカが決める
• Datasheet を読むとわかるIntel G35 Express Chipset など
http://support.intel.co.jp/design/chipsets/datashts/317607.htm より引用
122009年10月7日水曜日
IO mapped IO のイメージ
Physical memory
Memoryaddressspace
IOaddressspace
Kernel
outw %ax,$0xECDF
132009年10月7日水曜日
IO mapped IO の補足• 0x0000 - 0xFFFF までの16ビットの空間がIOポートに割り当て
• 物理メモリアドレス空間とは無関係
• IO命令の権限はTSS(Task State Segment)によって決定
IOaddressspace
0x0000
0xFFFF
142009年10月7日水曜日
Intel-VT
152009年10月7日水曜日
Intel-VT
1.仮想化の支援機構2.(プログラマが)VMを簡単に実装するためのCPUの機能
162009年10月7日水曜日
ゲストOS on Hypervisor の
お作法
1.基本的にゲストOSに命令を実行させる
2. 触らせたくない部分へのアクセスは 例外を発生させてゲストOSに処理を戻す
172009年10月7日水曜日
ディスクへの書き込み
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
182009年10月7日水曜日
ディスクへの書き込み
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
182009年10月7日水曜日
ディスクへの書き込み
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
破壊!!
182009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
ディスクへの書き込み
192009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
ディスクへの書き込み
192009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
トラップ!
ディスクへの書き込み
192009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
ディスクへの書き込み
202009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
ディスクへの書き込み
ハンドリング
202009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
安全に書き込み!
ディスクへの書き込み
ハンドリング
202009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
ディスクへの書き込み
212009年10月7日水曜日
Kernel Mode
Hypervisor on 実機 Guest OS os 仮想CPU
Kernel Mode
あたかもディスク書き込みが終了したかのように
復帰!
ディスクへの書き込み
212009年10月7日水曜日
どうやって実装するの?
222009年10月7日水曜日
Xen や VMWare のモデル
HyperVisor
Ring3
Ring2
Ring1
Ring0
OSを書き換える
Ring1 = Guest Kerel
232009年10月7日水曜日
Xen や VMWare のモデル
Kernel Mode
Kernel Mode
Hypervirsor on 実機 Guest kernel on 仮想CPU
実は Ring 1Ring 1 とRing 2 は通常使われない
242009年10月7日水曜日
Intel-VT がやっていることも
同じ
252009年10月7日水曜日
Intel-VT の概要
Kernel Mode
Hypervirsor on 実機 Guest kernel on 仮想CPU
Kernel Mode
262009年10月7日水曜日
Intel-VT の概要
Kernel Mode
Hypervirsor on 実機 Guest kernel on 仮想CPU
実は Guest OS 専用モード
Kernel Mode
272009年10月7日水曜日
Intel-VT の概要
Kernel Mode
Hypervirsor on 実機 Guest kernel on 仮想CPU
あるCPUステートじゃないとダメ.
Kernel Mode
282009年10月7日水曜日
Intel-VTの用語
Hypervirsor on 実機 Guest kernel on 仮想CPU
VMX Root Mode
Kernel Mode
Kernel Mode
292009年10月7日水曜日
VMX Root Mode になるための命令
Hypervirsor on 実機
VMXON初期化命令.
A20信号線を無効にするVT用の命令が発効できるようになる
Kernel Mode
302009年10月7日水曜日
VMX Root Mode から戻る命令
Hypervirsor on 実機
VMXOFFVT終了命令.
VT周りの命令が使えなくなる
Kernel Mode
312009年10月7日水曜日
Intel-VTの用語
Hypervirsor on 実機 Guest kernel on 仮想CPU
VMX non Root Mode
Kernel Mode
Kernel Mode
322009年10月7日水曜日
Intel-VTの用語
Hypervirsor on 実機 Guest kernel on 仮想CPU
VMX non Root Mode
VMEntry
Kernel Mode
Kernel Mode
322009年10月7日水曜日
VMEntry を発生させる命令
VMLAUNCHVMRESUME
VMX non Root Modeに移行する
332009年10月7日水曜日
VMLAUNCHVMRESUMEの挙動
1.準備•Host State(注)を待避
2.VMX non Root モードへ遷移
(注)Host State もIntel用語
342009年10月7日水曜日
Host Stateとは?
• レジスタ値
• CR0,CR3,CR4• DR7• RSP, RIP• セグメントレジスタ(CS,SS,DS,ES,FS,GS)
• ベースアドレスを格納しておくレジスタ(FS,GS,TR,IDTR)
352009年10月7日水曜日
何故 Host State を待避させるか?
• ゲストOS は、ゲストOS上で動作していることを知らないのでレジスタの値を容赦なく破壊する
• Hypervisorへの影響がないようゲストOSの見えないところに待避する必要
362009年10月7日水曜日
待避先は?
• VMCS(Virtual Machine Control Structure)
• 最大 4KB の構造体
• 4KB境界に設置revison
VMX-abort indicator
VMCS Data
0 byte
4 byte
8 byte
372009年10月7日水曜日
VMCSの中身
VMCS revison identifier
VMX-abort indicator
VMCS Data
0 byte
4 byte
8 byte
VMCS のリビジョン.
CPUによってVMCSのフォーマットが異なる可能性があるのでココを見て防ぐ(ライブマイグレーションすることを考えると分かりやすいかも)
382009年10月7日水曜日
VMCSの中身
VMCS revison identifier
VMX-abort indicator
VMCS Data
0 byte
4 byte
8 byte不正な理由でabort した場合はここにabortした理由書き込まれる
392009年10月7日水曜日
VMCSの中身
VMCS revison identifier
VMX-abort indicator
VMCS Data
0 byte
4 byte
8 byte
ここが本体!
Host State も VMCS Dataに待避される402009年10月7日水曜日
VMCSのイメージ
Hypervirsor on 実機
Memory
VMCS
Kernel Mode
Kernel Mode
GuestVisibleArea
412009年10月7日水曜日
VMCSのイメージ
Hypervirsor on 実機
Memory
VMCS
Kernel Mode
Kernel Mode
ゲストからは見えない場所に置いておく!
GuestVisibleArea
412009年10月7日水曜日
待避対象となっていないレジスタ
• 汎用レジスタ
• RAX,RBX,RCX...• ホスト-ゲスト間でレジスタ渡しで通信を行う余地
• CR2• Shadow Paging を行う余地を残している
• etc..
422009年10月7日水曜日
待避対象となっていないレジスタ
• 汎用レジスタ
• RAX,RBX,RCX...• ホスト-ゲスト間でレジスタ渡しで通信を行う余地
• CR2• Shadow Paging を行う余地を残している
• etc..
自力で待避(RIPは待避するからスタックに乗っけろ)
422009年10月7日水曜日
Intel-VTの用語
Hypervirsor on 実機 Guest kernel on 仮想CPU
VMExit
Kernel Mode
Kernel Mode
432009年10月7日水曜日
VMExit を発生させる命令
VMMCALL+その他例外
VMX Root Modeに移行する
442009年10月7日水曜日
VMExit発生時の挙動
1.準備•Guest State(注)を待避
2.VMX Root モードへ遷移
(注)Guest State もIntel用語
452009年10月7日水曜日
Guest Stateとは?1. レジスタ値
• CR0,CR3,CR4• DR7• RSP, RIP• セグメントレジスタ(CS,SS,DS,ES,FS,GS)
2. Active State• 32bit Active/HLT/Wait for IPI
3. Interruptibility state• 32bit Active/HLT/Wait for IPI
4. VMCS Link pointer• 拡張用. VMCSが2つ以上にまたがったときにつなげるためのポインタ
462009年10月7日水曜日
その他例外について
•設定に沿った例外を生じる.RDTSC (時間を読み取る)を発行しただけで例外を発生させるように設定することも可能
•「設定」を保存する場所
472009年10月7日水曜日
その他例外について
•設定に沿った例外を生じる.RDTSC (時間を読み取る)を発行しただけで例外を発生させるように設定することも可能
•「設定」を保存する場所
VMCSまたお前か!
472009年10月7日水曜日
例外の設定方法
VMCS revison identifier
VMX-abort indicator
VMCS Data
0 byte
4 byte
8 byte
ここに設定を書く.
482009年10月7日水曜日
VMCSを読み書き
VMREAD/VMWRITE普通のmov命令だと不整合が発生して予期せぬVMExitが発生したりするらしい...
なので専用の命令があるのです!
492009年10月7日水曜日
Kernel Mode
VMWRITEのイメージ
Hypervirsor on 実機
Memory
VMCSココの値はこうして!
502009年10月7日水曜日
Kernel Mode
VMREADのイメージ
Hypervirsor on 実機
Memory
VMCSココの値はこうだよ!
512009年10月7日水曜日
VMWRITE/VMREADの使い方
• vmwrite destreg srcreg
• vmread destreg srcreg
522009年10月7日水曜日
VMWRITE/VMREADの使い方
• vmwrite destreg srcreg
• vmread destreg srcreg
srcregは「読み書きする物理アドレス」で
はないことに注意!!522009年10月7日水曜日
srcregのフォーマット-encoding-
• Appendix H.3 辺りに色々と載っている
Bit Posiotion(s) Contents
31:15 Reserved (must be 0)
14:15 Bit Width
12 Reserved (must be 0)
11:10 Type
9:1 Index
0 Access Type(32bit or 64bit?)
532009年10月7日水曜日
例外を設定できるもの• IO
• 例外
• 割り込み
• 命令
基本的に 0ならゲストOSの設定を使用
1ならVMEXIT発生
542009年10月7日水曜日
IOポートについて• IOアドレス空間に対応する
16bitのbitmapへのポインタを設定する箇所がVMCSに存在
• 0x0000 - 0xFFFF
基本的に 0ならゲストOSの設定を使用
1ならVMEXIT発生
552009年10月7日水曜日
IOビットマップを設定する場合-encoding-
• Appendix H.3 辺りに色々と載っている
Bit Posiotion(s) Contents
31:15 Reserved (must be 0)
14:15 Bit Width
12 Reserved (must be 0)
11:10 Type
9:1 Index
0 Access Type(32bit or 64bit?)
562009年10月7日水曜日
IOビットマップを設定する場合-encoding-
• Appendix H.3 辺りに色々と載っている
Bit Posiotion(s) Contents
31:15 Reserved (must be 0)
14:15 Bit Width
12 Reserved (must be 0)
11:10 Type
9:1 Index
0 Access Type(32bit or 64bit?)
64 bit access= 2
562009年10月7日水曜日
IOビットマップを設定する場合-encoding-
• Appendix H.3 辺りに色々と載っている
Bit Posiotion(s) Contents
31:15 Reserved (must be 0)
14:15 Bit Width
12 Reserved (must be 0)
11:10 Type
9:1 Index
0 Access Type(32bit or 64bit?)
572009年10月7日水曜日
IOビットマップを設定する場合-encoding-
• Appendix H.3 辺りに色々と載っている
Bit Posiotion(s) Contents
31:15 Reserved (must be 0)
14:15 Bit Width
12 Reserved (must be 0)
11:10 Type
9:1 Index
0 Access Type(32bit or 64bit?)
Control = 0Index = 0
572009年10月7日水曜日
IOビットマップを設定する場合-encoding-
mov $bitmaptr, %rax /* val */
mov $0x0002000, %rdx /* index */
vmwrite %rax,%rdx
582009年10月7日水曜日
IOビットマップを設定する場合-encoding-
コードを読んでみよう
core/asm.s
core/constants.h
core/vt_init.c
592009年10月7日水曜日
残りの命令のだいたい
602009年10月7日水曜日
VMCSを設定する命令
Current VMCSを設定実はこれまで実行説明していた命令は、
Current VMCSを対象に発行.
VMPTRST
612009年10月7日水曜日
Kernel Mode
VMPTRSTのイメージ
Hypervirsor on 実機
Memory
VMCSここがVMCSだよ!
622009年10月7日水曜日
Current VMCSをロードする命令
Current VMCSのアドレスを取得
VMPTRLD
632009年10月7日水曜日
Kernel Mode
VMPTRSTのイメージ
Hypervirsor on 実機
Memory
VMCSこの番地にCurrent VMCSあるよ
642009年10月7日水曜日
VMCLEAR
VMCSを初期化する
652009年10月7日水曜日
Kernel Mode
VMCLEARのイメージ
Hypervirsor on 実機
Memory
VMCS初期化して!
662009年10月7日水曜日
詳細はIntelのマニュアル(英語版)のVolume 2B, 3B 参照
672009年10月7日水曜日
おしまい
682009年10月7日水曜日