85
Bitvisor 読書会 第二回前半 筑波大学システム情報工学研究科 コンピュータサイエンス専攻 ソフトウェア研究室 Tsuyoshi Ozawa 1 2009107日水曜日

第二回Bitvisor読書会 前半 Intel-VT について

Embed Size (px)

DESCRIPTION

Description of the Intel-VT.

Citation preview

Page 1: 第二回Bitvisor読書会 前半 Intel-VT について

Bitvisor 読書会第二回前半筑波大学システム情報工学研究科

コンピュータサイエンス専攻 ソフトウェア研究室Tsuyoshi Ozawa

12009年10月7日水曜日

Page 2: 第二回Bitvisor読書会 前半 Intel-VT について

本日の内容

• x86の保護モデル

• x86におけるIOの種類

• Intel-VT の役割

• Intel-VT の提供する命令とその挙動

22009年10月7日水曜日

Page 3: 第二回Bitvisor読書会 前半 Intel-VT について

ちょっと復習!

x86における保護モデル

32009年10月7日水曜日

Page 4: 第二回Bitvisor読書会 前半 Intel-VT について

x86の保護モデル(リングプロテクション)

数字が低いほど特権レベルが高い( 0 が最強 )

OSはRing 0 で動作

ユーザプログラムはRing 3 で動く

Kernel Mode

Ring3 = User Mode

Ring2

Ring1

Ring0

42009年10月7日水曜日

Page 5: 第二回Bitvisor読書会 前半 Intel-VT について

リングプロテクションで保護されているもの

1. 特権命令の発行

2. メモリアクセス

52009年10月7日水曜日

Page 6: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Ring3

Ring2

Ring1

Ring0

User Mode

Ring3 から Ring0 へのアクセス

62009年10月7日水曜日

Page 7: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Ring3

Ring2

Ring1

Ring0

ここで out 命令

User Mode

Ring3 から Ring0 へのアクセス

62009年10月7日水曜日

Page 8: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Ring3

Ring2

Ring1

Ring0

ここで out 命令

User Mode

Ring3 から Ring0 へのアクセス

ダメ!(例外を発生)

62009年10月7日水曜日

Page 9: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Ring3

Ring2

Ring1

Ring0

ここで out 命令

Ring3 から Ring0 へのアクセス

例外に対応した例外ハンドラが動作する

User Mode

72009年10月7日水曜日

Page 10: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Ring3

Ring2

Ring1

Ring0

ここで out 命令

Ring3 から Ring0 へのアクセス

処理が戻る

User Mode

82009年10月7日水曜日

Page 11: 第二回Bitvisor読書会 前半 Intel-VT について

x86におけるIOの種類

92009年10月7日水曜日

Page 12: 第二回Bitvisor読書会 前半 Intel-VT について

x86のIOの種類

• Memory Mapped IO 

• 物理メモリ空間をポートにマップ

• IO Mapped IO 

• IOアドレス空間をポートにマップ

102009年10月7日水曜日

Page 13: 第二回Bitvisor読書会 前半 Intel-VT について

MMIOのイメージ

Physical memory

Memory

Mapped IO

Kernel

mov %eax,(%ebx)

112009年10月7日水曜日

Page 14: 第二回Bitvisor読書会 前半 Intel-VT について

MMIOの補足

• 物理メモリレイアウトはハードウェアメーカが決める

• Datasheet を読むとわかるIntel G35 Express Chipset など

http://support.intel.co.jp/design/chipsets/datashts/317607.htm より引用

122009年10月7日水曜日

Page 15: 第二回Bitvisor読書会 前半 Intel-VT について

MMIOの補足

• 物理メモリレイアウトはハードウェアメーカが決める

• Datasheet を読むとわかるIntel G35 Express Chipset など

http://support.intel.co.jp/design/chipsets/datashts/317607.htm より引用

122009年10月7日水曜日

Page 16: 第二回Bitvisor読書会 前半 Intel-VT について

IO mapped IO のイメージ

Physical memory

Memoryaddressspace

IOaddressspace

Kernel

outw %ax,$0xECDF

132009年10月7日水曜日

Page 17: 第二回Bitvisor読書会 前半 Intel-VT について

IO mapped IO の補足• 0x0000 - 0xFFFF までの16ビットの空間がIOポートに割り当て

• 物理メモリアドレス空間とは無関係

• IO命令の権限はTSS(Task State Segment)によって決定

IOaddressspace

0x0000

0xFFFF

142009年10月7日水曜日

Page 18: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VT

152009年10月7日水曜日

Page 19: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VT

1.仮想化の支援機構2.(プログラマが)VMを簡単に実装するためのCPUの機能

162009年10月7日水曜日

Page 20: 第二回Bitvisor読書会 前半 Intel-VT について

ゲストOS on Hypervisor の

お作法

1.基本的にゲストOSに命令を実行させる

2. 触らせたくない部分へのアクセスは 例外を発生させてゲストOSに処理を戻す

172009年10月7日水曜日

Page 21: 第二回Bitvisor読書会 前半 Intel-VT について

ディスクへの書き込み

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

182009年10月7日水曜日

Page 22: 第二回Bitvisor読書会 前半 Intel-VT について

ディスクへの書き込み

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

182009年10月7日水曜日

Page 23: 第二回Bitvisor読書会 前半 Intel-VT について

ディスクへの書き込み

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

破壊!!

182009年10月7日水曜日

Page 24: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

ディスクへの書き込み

192009年10月7日水曜日

Page 25: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

ディスクへの書き込み

192009年10月7日水曜日

Page 26: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

トラップ!

ディスクへの書き込み

192009年10月7日水曜日

Page 27: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

ディスクへの書き込み

202009年10月7日水曜日

Page 28: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

ディスクへの書き込み

ハンドリング

202009年10月7日水曜日

Page 29: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

安全に書き込み!

ディスクへの書き込み

ハンドリング

202009年10月7日水曜日

Page 30: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

ディスクへの書き込み

212009年10月7日水曜日

Page 31: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

Hypervisor on 実機 Guest OS os 仮想CPU

Kernel Mode

あたかもディスク書き込みが終了したかのように

復帰!

ディスクへの書き込み

212009年10月7日水曜日

Page 32: 第二回Bitvisor読書会 前半 Intel-VT について

どうやって実装するの?

222009年10月7日水曜日

Page 33: 第二回Bitvisor読書会 前半 Intel-VT について

Xen や VMWare のモデル

HyperVisor

Ring3

Ring2

Ring1

Ring0

OSを書き換える

Ring1 = Guest Kerel

232009年10月7日水曜日

Page 34: 第二回Bitvisor読書会 前半 Intel-VT について

Xen や VMWare のモデル

Kernel Mode

Kernel Mode

Hypervirsor on 実機 Guest kernel on 仮想CPU

実は Ring 1Ring 1 とRing 2 は通常使われない

242009年10月7日水曜日

Page 35: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VT がやっていることも

同じ

252009年10月7日水曜日

Page 36: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VT の概要

Kernel Mode

Hypervirsor on 実機 Guest kernel on 仮想CPU

Kernel Mode

262009年10月7日水曜日

Page 37: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VT の概要

Kernel Mode

Hypervirsor on 実機 Guest kernel on 仮想CPU

実は Guest OS 専用モード

Kernel Mode

272009年10月7日水曜日

Page 38: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VT の概要

Kernel Mode

Hypervirsor on 実機 Guest kernel on 仮想CPU

あるCPUステートじゃないとダメ.

Kernel Mode

282009年10月7日水曜日

Page 39: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VTの用語

Hypervirsor on 実機 Guest kernel on 仮想CPU

VMX Root Mode

Kernel Mode

Kernel Mode

292009年10月7日水曜日

Page 40: 第二回Bitvisor読書会 前半 Intel-VT について

VMX Root Mode になるための命令

Hypervirsor on 実機

VMXON初期化命令.

A20信号線を無効にするVT用の命令が発効できるようになる

Kernel Mode

302009年10月7日水曜日

Page 41: 第二回Bitvisor読書会 前半 Intel-VT について

VMX Root Mode から戻る命令

Hypervirsor on 実機

VMXOFFVT終了命令.

VT周りの命令が使えなくなる

Kernel Mode

312009年10月7日水曜日

Page 42: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VTの用語

Hypervirsor on 実機 Guest kernel on 仮想CPU

VMX non Root Mode

Kernel Mode

Kernel Mode

322009年10月7日水曜日

Page 43: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VTの用語

Hypervirsor on 実機 Guest kernel on 仮想CPU

VMX non Root Mode

VMEntry

Kernel Mode

Kernel Mode

322009年10月7日水曜日

Page 44: 第二回Bitvisor読書会 前半 Intel-VT について

VMEntry を発生させる命令

VMLAUNCHVMRESUME

VMX non Root Modeに移行する

332009年10月7日水曜日

Page 45: 第二回Bitvisor読書会 前半 Intel-VT について

VMLAUNCHVMRESUMEの挙動

1.準備•Host State(注)を待避

2.VMX non Root モードへ遷移

(注)Host State もIntel用語

342009年10月7日水曜日

Page 46: 第二回Bitvisor読書会 前半 Intel-VT について

Host Stateとは?

• レジスタ値

• CR0,CR3,CR4• DR7• RSP, RIP• セグメントレジスタ(CS,SS,DS,ES,FS,GS)

• ベースアドレスを格納しておくレジスタ(FS,GS,TR,IDTR)

352009年10月7日水曜日

Page 47: 第二回Bitvisor読書会 前半 Intel-VT について

何故 Host State を待避させるか?

• ゲストOS は、ゲストOS上で動作していることを知らないのでレジスタの値を容赦なく破壊する

• Hypervisorへの影響がないようゲストOSの見えないところに待避する必要

362009年10月7日水曜日

Page 48: 第二回Bitvisor読書会 前半 Intel-VT について

待避先は?

• VMCS(Virtual Machine Control Structure)

• 最大 4KB の構造体

• 4KB境界に設置revison

VMX-abort indicator

VMCS Data

0 byte

4 byte

8 byte

372009年10月7日水曜日

Page 49: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSの中身

VMCS revison identifier

VMX-abort indicator

VMCS Data

0 byte

4 byte

8 byte

VMCS のリビジョン.

CPUによってVMCSのフォーマットが異なる可能性があるのでココを見て防ぐ(ライブマイグレーションすることを考えると分かりやすいかも)

382009年10月7日水曜日

Page 50: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSの中身

VMCS revison identifier

VMX-abort indicator

VMCS Data

0 byte

4 byte

8 byte不正な理由でabort した場合はここにabortした理由書き込まれる

392009年10月7日水曜日

Page 51: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSの中身

VMCS revison identifier

VMX-abort indicator

VMCS Data

0 byte

4 byte

8 byte

ここが本体!

Host State も VMCS Dataに待避される402009年10月7日水曜日

Page 52: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSのイメージ

Hypervirsor on 実機

Memory

VMCS

Kernel Mode

Kernel Mode

GuestVisibleArea

412009年10月7日水曜日

Page 53: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSのイメージ

Hypervirsor on 実機

Memory

VMCS

Kernel Mode

Kernel Mode

ゲストからは見えない場所に置いておく!

GuestVisibleArea

412009年10月7日水曜日

Page 54: 第二回Bitvisor読書会 前半 Intel-VT について

待避対象となっていないレジスタ

• 汎用レジスタ

• RAX,RBX,RCX...• ホスト-ゲスト間でレジスタ渡しで通信を行う余地

• CR2• Shadow Paging を行う余地を残している

• etc..

422009年10月7日水曜日

Page 55: 第二回Bitvisor読書会 前半 Intel-VT について

待避対象となっていないレジスタ

• 汎用レジスタ

• RAX,RBX,RCX...• ホスト-ゲスト間でレジスタ渡しで通信を行う余地

• CR2• Shadow Paging を行う余地を残している

• etc..

自力で待避(RIPは待避するからスタックに乗っけろ)

422009年10月7日水曜日

Page 56: 第二回Bitvisor読書会 前半 Intel-VT について

Intel-VTの用語

Hypervirsor on 実機 Guest kernel on 仮想CPU

VMExit

Kernel Mode

Kernel Mode

432009年10月7日水曜日

Page 57: 第二回Bitvisor読書会 前半 Intel-VT について

VMExit を発生させる命令

VMMCALL+その他例外

VMX Root Modeに移行する

442009年10月7日水曜日

Page 58: 第二回Bitvisor読書会 前半 Intel-VT について

VMExit発生時の挙動

1.準備•Guest State(注)を待避

2.VMX Root モードへ遷移

(注)Guest State もIntel用語

452009年10月7日水曜日

Page 59: 第二回Bitvisor読書会 前半 Intel-VT について

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日水曜日

Page 60: 第二回Bitvisor読書会 前半 Intel-VT について

その他例外について

•設定に沿った例外を生じる.RDTSC (時間を読み取る)を発行しただけで例外を発生させるように設定することも可能

•「設定」を保存する場所

472009年10月7日水曜日

Page 61: 第二回Bitvisor読書会 前半 Intel-VT について

その他例外について

•設定に沿った例外を生じる.RDTSC (時間を読み取る)を発行しただけで例外を発生させるように設定することも可能

•「設定」を保存する場所

VMCSまたお前か!

472009年10月7日水曜日

Page 62: 第二回Bitvisor読書会 前半 Intel-VT について

例外の設定方法

VMCS revison identifier

VMX-abort indicator

VMCS Data

0 byte

4 byte

8 byte

ここに設定を書く.

482009年10月7日水曜日

Page 63: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSを読み書き

VMREAD/VMWRITE普通のmov命令だと不整合が発生して予期せぬVMExitが発生したりするらしい...

なので専用の命令があるのです!

492009年10月7日水曜日

Page 64: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

VMWRITEのイメージ

Hypervirsor on 実機

Memory

VMCSココの値はこうして!

502009年10月7日水曜日

Page 65: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

VMREADのイメージ

Hypervirsor on 実機

Memory

VMCSココの値はこうだよ!

512009年10月7日水曜日

Page 66: 第二回Bitvisor読書会 前半 Intel-VT について

VMWRITE/VMREADの使い方

• vmwrite destreg srcreg

• vmread destreg srcreg

522009年10月7日水曜日

Page 67: 第二回Bitvisor読書会 前半 Intel-VT について

VMWRITE/VMREADの使い方

• vmwrite destreg srcreg

• vmread destreg srcreg

srcregは「読み書きする物理アドレス」で

はないことに注意!!522009年10月7日水曜日

Page 68: 第二回Bitvisor読書会 前半 Intel-VT について

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日水曜日

Page 69: 第二回Bitvisor読書会 前半 Intel-VT について

例外を設定できるもの• IO 

• 例外

• 割り込み

• 命令

基本的に 0ならゲストOSの設定を使用

1ならVMEXIT発生

542009年10月7日水曜日

Page 70: 第二回Bitvisor読書会 前半 Intel-VT について

IOポートについて• IOアドレス空間に対応する

16bitのbitmapへのポインタを設定する箇所がVMCSに存在

• 0x0000 - 0xFFFF

基本的に 0ならゲストOSの設定を使用

1ならVMEXIT発生

552009年10月7日水曜日

Page 71: 第二回Bitvisor読書会 前半 Intel-VT について

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日水曜日

Page 72: 第二回Bitvisor読書会 前半 Intel-VT について

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日水曜日

Page 73: 第二回Bitvisor読書会 前半 Intel-VT について

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日水曜日

Page 74: 第二回Bitvisor読書会 前半 Intel-VT について

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日水曜日

Page 75: 第二回Bitvisor読書会 前半 Intel-VT について

IOビットマップを設定する場合-encoding-

mov $bitmaptr, %rax /* val */

mov $0x0002000, %rdx /* index */

vmwrite %rax,%rdx

582009年10月7日水曜日

Page 76: 第二回Bitvisor読書会 前半 Intel-VT について

IOビットマップを設定する場合-encoding-

コードを読んでみよう

core/asm.s

core/constants.h

core/vt_init.c

592009年10月7日水曜日

Page 77: 第二回Bitvisor読書会 前半 Intel-VT について

残りの命令のだいたい

602009年10月7日水曜日

Page 78: 第二回Bitvisor読書会 前半 Intel-VT について

VMCSを設定する命令

Current VMCSを設定実はこれまで実行説明していた命令は、

Current VMCSを対象に発行.

VMPTRST

612009年10月7日水曜日

Page 79: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

VMPTRSTのイメージ

Hypervirsor on 実機

Memory

VMCSここがVMCSだよ!

622009年10月7日水曜日

Page 80: 第二回Bitvisor読書会 前半 Intel-VT について

Current VMCSをロードする命令

Current VMCSのアドレスを取得

VMPTRLD

632009年10月7日水曜日

Page 81: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

VMPTRSTのイメージ

Hypervirsor on 実機

Memory

VMCSこの番地にCurrent VMCSあるよ

642009年10月7日水曜日

Page 82: 第二回Bitvisor読書会 前半 Intel-VT について

VMCLEAR

VMCSを初期化する

652009年10月7日水曜日

Page 83: 第二回Bitvisor読書会 前半 Intel-VT について

Kernel Mode

VMCLEARのイメージ

Hypervirsor on 実機

Memory

VMCS初期化して!

662009年10月7日水曜日

Page 84: 第二回Bitvisor読書会 前半 Intel-VT について

詳細はIntelのマニュアル(英語版)のVolume 2B, 3B 参照

672009年10月7日水曜日

Page 85: 第二回Bitvisor読書会 前半 Intel-VT について

おしまい

682009年10月7日水曜日