amd64 の仮想化技術を利用した 仮想マシンモニタの実装

44
AMD64 ののののののののののの ののののののののののの のの のの

Upload: ivria

Post on 05-Feb-2016

97 views

Category:

Documents


0 download

DESCRIPTION

AMD64 の仮想化技術を利用した 仮想マシンモニタの実装. 金田 憲二. 発表の概要. AMD64 の仮想化技術を利用した (非常に単純な) 仮想マシンモニタを実装した 簡単なプログラムを仮想マシン上で実行できる 3000 行程ほどの C プログラムからなる ※ アカデミックな内容についての発表というよりは、ハウツーもの. この VMM の特長. 実装が軽量である c.f.) Xen のソースコードは 100,000 行以上  使い勝手が良い(はず) 教育・学習での利用 今後の研究のための基盤 検証(定理証明器、モデル検査) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

AMD64 の仮想化技術を利用した仮想マシンモニタの実装

金田 憲二

Page 2: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

発表の概要• AMD64 の仮想化技術を利用した

(非常に単純な)仮想マシンモニタを実装した– 簡単なプログラムを仮想マシン上で実行できる– 3000 行程ほどの C プログラムからなる

※ アカデミックな内容についての発表というよりは、ハウツーもの

Page 3: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

この VMM の特長• 実装が軽量である

c.f.) Xen のソースコードは 100,000 行以上 使い勝手が良い(はず)

– 教育・学習での利用– 今後の研究のための基盤

• 検証(定理証明器、モデル検査)• メモリ安全な言語( Cyclone 、 TAL 、 Haskell )に

よる記述– …

Page 4: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMM の動作デモ• VGA に文字を出力するプログラムを

仮想マシン上で実行※AMD64 のシミュレータ SimNow 上で実行

Page 5: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

残りの発表の流れ(Part 1) AMD64 Secure Virtual Machine

(Part 2) VMM の作り方

Page 6: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

(Part 1)AMD64 Secure Virtual Machine

Page 7: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMM の実装に必要な処理は?• プロセッサの仮想化

– Sensitive 命令の捕捉– 割り込みの転送

• メモリの仮想化– 独立したメモリ空間を

個々の VM に提供

• …

Page 8: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

IA-32 上で VMM を実装する場合

• プロセッサの仮想化– Sensitive 命令の捕捉– 割り込みの転送

• メモリの仮想化– 独立したメモリ空間を

個々の VM に提供

• …

– カーネルの書き換え– 動的バイナリ変換

– カーネルの書き換え– Shadow page table

実装コスト大(c.f., VMware 、 Xen )

Page 9: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

AMD64 上で VMM を実装する場合

• プロセッサの仮想化– Sensitive 命令の捕捉– 割り込みの転送

• メモリの仮想化– 独立したメモリ空間を

個々の VM に提供

• …

– VMRUN 命令– #VMEXIT 例外

  Nested paging

実装コスト小(カーネルの書き換え不要)

Page 10: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMRUN 命令とは?• VMM から VM に制御を切り替える命令

– エミュレーションが必要な命令を VM が実行したり、例外が発生したりすると、 VMM に制御が戻る

….VMRUN

VMM

VM

Page 11: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMM から VM への制御の切り替え

現在の実機の状態VM_HSAVE_AREA

Virtual Machine Control Block

※ 全てのレジスタが保存・復元されないことに注意

MSR

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

Page 12: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VM から VMM への制御の切り替え

現在の実機の状態VM_HSAVE_AREA

Virtual Machine Control Block

MSR

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

RIP RAX

RSP CR0

CS CR3

DS CR4

ES IDTR

RFLAGS GDTR

… …

#VMEXIT 例外が発生

エラーコード仮想アドレス p 番へのアクセスにより

ページフォルトが発生

Page 13: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

• VM 実行中に割り込みが発生すると– #VMEXIT が発生し、ホストに割り込みが転送さ

れるor– VM に直接割り込みが転送される

※VMRUN 実行時に選択可能

割り込みの仮想化

Page 14: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMRUN 命令の使用例for (;;) {

   /* VMM から VM に制御を移す */ VMRUN;

/* #VMEXIT が発生 */

   switch (error code) {   /* sensitive 命令や例外のエミュレーショ

ン */   }}

Page 15: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

Nested Paging とは?• VM の物理アドレスを実機の物理アドレスへ

対応付ける機構– 複数の VM にそれぞれ独立した物理アドレス空

間を提供できる

実機の物理アドレス

VM の物理アドレス

VM の仮想アドレス

0 0x10000

0 0xffffffff 0 0xffffffff

0 0x100 0 0x100

Page 16: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

Nested Paging 有効時のアドレス変換 (1/4)

実機の物理アドレス

VM の物理アドレス

VM の仮想アドレス

vPT

pPT

• 2 種類のページテーブルを利用– VM の仮想アドレス VM の物理アドレス– VM の物理アドレス 実機の物理アドレス

実機の CR3

VM の CR3

Page 17: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

Nested Paging 有効時のアドレス変換 (2/4)

実機の物理アドレス

VM の物理アドレス

VM の仮想アドレス

vPT

pPT vPT

• 2 種類のページテーブルを利用– VM の仮想アドレス VM の物理アドレス– VM の物理アドレス 実機の物理アドレス

実機の CR3

VM の CR3

Page 18: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

Nested Paging 有効時のアドレス変換 (3/4)

実機の物理アドレス

VM の物理アドレス

VM の仮想アドレス

vPT

pPT vPT

• 2 種類のページテーブルを利用– VM の仮想アドレス VM の物理アドレス– VM の物理アドレス 実機の物理アドレス

実機の CR3

VM の CR3

Page 19: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

Nested Paging 有効時のアドレス変換 (4/4)

実機の物理アドレス

VM の物理アドレス

VM の仮想アドレス

vPT

pPT vPT

• 2 種類のページテーブルを利用– VM の仮想アドレス VM の物理アドレス– VM の物理アドレス 実機の物理アドレス

実機の CR3

VM の CR3

Page 20: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

ページングレジスタの仮想化• CR0 、 CR3 などの制御レジスタの複製を

生成• VMRUN 実行後、制御レジスタへのアクセ

スは、その複製へのアクセスに自動的に変換

Page 21: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

ページフォルトの仮想化

実機の物理アドレス

VM の物理アドレス

VM の仮想アドレス

vPT

pPT vPT

• どの段階でのフォルトかに応じて、#VMEXIT のエラーコードが異なる

NPFEXCP

Page 22: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

AMD64 が提供するその他の命令

• VMSAVE 、 VMLOAD– VMRUN では保存・復元されない状態を保存・

復元例)セグメントレジスタのキャッシュ

• VMMCALL– 明示的に VM から VMM に切り替える

• STGI 、 CLGI– Global Interrupt Flag (GIF) のセット・クリア

• VMRUN の前後で実行

Page 23: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

(Part 2) VMM の作り方

Page 24: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMM のアーキテクチャ• VMM は、実ハードウェア上に直に存在

実ハードウェア( AMD64 SVM )

VMM

VM

ゲスト OS

VM

ゲスト OS

Page 25: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VMM の動作の流れ1. ハードウェアの初期化

– OS の起動時の処理とほぼ同様

2. VM の作成– Nested paging の設定など

3. ゲスト OS の起動– VMRUN 命令を実行

以降の発表では、それぞれの処理を順に説明していく

Page 26: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

1. ハードウェアの初期化• メモリを初期化する

– ページテーブル、セグメントデスクリプタを初期化

– ページのアロケーターを初期化

• CPU を初期化する

Page 27: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

• GRUB によって VMM が物理メモリ上にロードされる

1 MB 2 MB

ReservedVMM(text)

VMM の起動

0 MB

VMM(data)

Page 28: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

• ページングを有効にする– 64 ビットモード– 物理アドレスの 0~1 GB を、 2 つの仮想アド

レスにマップ

0

ページテーブル、セグメントデスクリプタの初期化

Reserved VMM

物理アドレス

仮想アドレス

1 GB

0xffff830000000000

0xffffffffffffffff

2 MB

0xffff830000000000

Page 29: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

ページのアロケーターの初期化• 物理ページを動的に確保・解放できるようにす

る– GRUB から、使用可能なメモリ領域を教えてもらう– ページの使用・未使用を記憶するビットマップを用

1 MB 2 MB

ReservedVMM(text)

0 MB

VMM(data)

割り当て済みページビットマッ

Page 30: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

CPU の初期化• 以下を検査する

– AMD アーキテクチャか?– 仮想化機能をもつか?

• 可能であれば、仮想化機能を有効にする– VMM の状態を保存するための領域を確保

• 前述のページアロケーターを使用して– そのページの物理アドレスを MSR レジスタに格納

Page 31: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

2. VM の作成• VM の物理メモリを確保• ゲスト OS をロード• Nested paging を設定• レジスタを初期化

Page 32: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

VM の物理メモリの確保

VMMVM の

物理メモリ

• VM の物理メモリとして使用する領域を実マシンの物理メモリ上に確保する– 前述のアロケーターを使用

B + 0x400000B

Page 33: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

ゲスト OS のロード• ELF形式を解釈し、それに従って、

カーネルを VM の物理メモリ上に配置

VMM

ゲスト OS (text)

ゲスト OS (data)

B + 0x400000B

Page 34: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

Nested Paging の設定

VMM

ページテーブル

• ページテーブルを作成する– VM の物理アドレス (x) 実機の物理アドレス (B

+ x)

※ 実際の実装では、 VGA の関係上、少し複雑0 0x400000

B + 0x400000B

VM の物理アドレ

実機の物理アドレ

Page 35: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

レジスタを初期化• ELF を解釈し、 RIP を設定する• …

Page 36: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

3. ゲスト OS の起動• VMRUN 命令を実行• #VMEXIT が発生したらエラーコードを表

Page 37: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

未実装な VMM の機能• 割り込み• I/O デバイスへのアクセス• 複数の仮想マシンの同時起動• …

※ VM 上で Windows や Linux を起動するには、まだまだ多くの機能の実装が必要

Page 38: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

関連研究• Xen virtual machine monitor

– 大規模すぎて、理解・改良が困難• 複数アーキテクチャへ対応させるため仕方がない

面も

– Nested paging には未対応

• Research Hypervisor– http://www.research.ibm.com/hypervisor/

Page 39: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

まとめ• AMD64 の仮想化技術を利用した

(非常に単純な)仮想マシンモニタを実装した– http://web.yl.is.s.u-tokyo.ac.jp/~tvmm にて公開

– 使ってみたい方は是非

Page 40: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

その他

Page 41: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

SimNow

• AMD64 上で動作する AMD64 のシミュレータ–豊富なデバッグ機能を提供する

例)レジスタ・メモリのダンプ、実行のトラップ– シミュレーション速度は非常に遅い

Page 42: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

雑多な感想• 数多くのアドレッシングモードがあり煩雑

– Long mode (64-bit mode, Compatibility mode), Legacy mode (Physical-address extension, Page-size extension), …

– モードを制御するフラグが、コントロールレジスタ・セグメントデスクリプタ・ページテーブルなどに点在

• Web から取得可能な情報がまだ少ない

Page 43: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

参考文献 (1/2)

• X86-64 Linux– http://www.x86-64.org

• AMD64 Architecture Programmer's Manual– http://www.amd.com/us-en/Processors/

TechnicalResources/0,,30_182_739_7044,00.html

– Volume 3: General-Purpose and System Instructions, Section 15: Secure Virtual Machine

Page 44: AMD64 の仮想化技術を利用した 仮想マシンモニタの実装

参考文献 (2/2)

• SimNow– http://developer.amd.com/login.aspx?msg=simnow

• Xen virtual machine monitor– http://www.cl.cam.ac.uk/Research/SRG/netos/xen

• Multiboot Specification Manual– http://www.gnu.org/software/grub/manual/multiboot