View
277
Download
2
Category
Preview:
Citation preview
Unsafe Nested Virtualization on Intel CPU
深井貴明(筑波大学)
2016年12月5日
1
Nested Virtualization
2
VMM
VMM QEMU/KVM, VirtualBox, etc.
VM
CPU
VM
VM の中にVMM が!
Nested Virtualization
3
L0 VMM (Layer 0)
L1 VMM (Layer 1) QEMU/KVM, VirtualBox, etc.
L2 VM (Layer 2)
CPU
VM
VM の中にVMM が!
Nested Virtualization
4
L0 VMM (Layer 0)
L1 VMM (Layer 1) QEMU/KVM, VirtualBox, etc.
L2 VM (Layer 2)
CPU
VM
VM の中にVMM が!
仮想化支援機能で速度向上!
VT-x/AMD-V
Virtual VT-x/AMD-V
仮想化支援機能を提供
BitVisor の Nested Virtualization
• イーゲル榮樂さんによる発表
Unsafe Nested Virtualization
5
Unsafe Nested Virtualization とは
• L1 VMMが trusted だと仮定し,いくつかの仮想化支援機能をパススルーで L1 に提供する• E.g. EPT をパススルーとか
• Para-passthroughな BitVisor ならではの (荒) 技
6
実行の流れ
7
L2 用 VMCB をロード
L1 用VMCBをロード
L1 VMM
L0 VMM
L2 VM
L1 が作成したVMCSを変換なしに直接ロード
VMExit VMEnter VMExit VMEnter
アドレス変換
L1 VMM
L0 VMM
L2 VM
CPU
EPT L2p L1p
PT L2v L2p
L2 動作時
• L1 が作成した EPT を直接ロード
• BitVisor では L0p = L1p
• L0 の保護なしUnsafe
(L2p = L2 Physical address, …)
夢が広がりますね
• VMM のデバッグなどの用途に• 木村さんのシステムと組み合わせればとても夢が広がるかも
•自由なライセンスの Nested Virtualization• BitVisor は BSD ライセンス
• Open かつ not GPL で Nested Virtualization できる VMM はほかにない
9
しかし…
• Intel VT-x -未着手
• AMD SVM -実装済み
10
しかし…
• Intel VT-x -未着手
• AMD SVM -実装済み
11
Unsafe Nested Virtualization on Intel CPU
12
基本設計
基本的には AMD 版と同じ(だと思う)
• L1 が作成した VMCS を (ほぼ) 直接ロード
• EPTは L1 が作成したものを直接ロード
VT-x と AMD-V の違いに対応
• VMX命令
• VMExit 時の Host Stateのロード
13
AMD 版実装との主な違い
•全部
•命令エミュレーション
• Host Statesの Shadowing
• VMExitのエミュレーション
• vCPU マイグレーションへの対応
14
AMD 版実装との主な違い
•全部
•命令エミュレーション
• Host States の Shadowing
• VMExit のエミュレーション
• vCPU マイグレーションへの対応
15
VMX instructions
• VMXOFF
• VMXON
• INVEPT
• INVVPID
• VMREAD
• VMWRITE
• VMLAUNCH
• VMRESUME
• VMCLEAR
• VMPTRLD
• VMPTRST
16
VMX instructions
• VMXOFF
• VMXON
• INVEPT
• INVVPID
• VMREAD
• VMWRITE
• VMLAUNCH
• VMRESUME
• VMCLEAR
• VMPTRLD
• VMPTRST
17
実行したふりだけする
BitVisorが代わりに実行
VT-x 命令のエミュレーション
基本的には
• VMCSを L1/L0 L2/L0 に切り替え
•実際に命令を実行
•結果を L1 に返す• L1 RFLAGS の反映
• オペランドとして渡されたレジスタ or メモリに結果を渡す
18
例: VMREAD
19
L0 BitVisor
L1 VMM
CPUL1/L0VMCS
L2/L0VMCS
L1/L0VMCS
L2/L1VMCS
VMREAD!
例: VMREAD/VMWRITE
20
L0 BitVisor
L1 VMM
CPUL1/L0VMCS
L2/L0VMCS
L1/L0VMCS
L2/L1VMCS
VMREAD!
VM
Exit
例: VMREAD/VMWRITE
21
L0 BitVisor
L1 VMM
CPUL2/L0VMCS
L2/L0VMCS
L1/L0VMCS
L2/L1VMCS
VMPTRLD
VMREAD!
例: VMREAD/VMWRITE
22
L0 BitVisor
L1 VMM
CPUL2/L0VMCS
L2/L0VMCS
L1/L0VMCS
L2/L1VMCS
VMREAD
VMREAD!
例: VMREAD/VMWRITE
23
L0 BitVisor
L1 VMM
CPUL1/L0VMCS
L2/L0VMCS
L1/L0VMCS
L2/L1VMCS
VMREAD!
VMPTRLD
例: VMREAD/VMWRITE
24
L0 BitVisor
L1 VMM
CPUL1/L0VMCS
L2/L0VMCS
L1/L0VMCS
L2/L1VMCS
VMREAD!
VM
Ente
r
AMD 版実装との主な違い
•全部
•命令エミュレーション
• Host Statesの Shadowing
• VMExit のエミュレーション
• vCPU マイグレーションへの対応
25
VMCS が持つ States
26
VMCS
Guest State
Host State
Control State
VMCS が持つ States
27
VMCS
Guest State
Host State
Control State
VMExit 時に物理コアにロードされる情報• RIP• RSP• etc.
VMCS が持つ States
28
VMCS
Guest State
Host State
Control State
VMExit 時に物理コアにロードされる情報• RIP• RSP• etc.
L2 からのVMExit 時もBitVisor の状態でないと困る
VMCS Shadowing
29
L2/L0 VMCS
Guest StateL1が設定
Host StateL0が設定
Control StateL1が設定
Host StateL1 が設定
Shadow VMCS
CPU にセット L0 BitVisor が管理
AMD 版実装との主な違い
•全部
•命令エミュレーション
• Host Statesの Shadowing
• VMExit のエミュレーション
• VMCS のライフサイクルの対応
30
VMCS の切り替え
31
L1 VMM
L0 VMM
L2 VM
VMExit VMEnter VMExit VMEnter
CPU L1/L0 VMCS
L2/L0 VMCS
L1/L0 VMCS
VMCS の切り替え
32
L1 VMM
L0 VMM
L2 VM
VMExit VMEnter VMExit VMEnter
CPU L1/L0 VMCS
L2/L0 VMCS
L1/L0 VMCS
VMExit 時の処理
33
Intel SDM 3C が手元にある人は LOADING HOST STATE という章を見てみましょう
34
こんなにある!
35
bool to_64bit_mode;ulong tmp;ulong cr0, cr3, cr4;/* These bit is not modified */const u64 cr0_reserved = 0xffffffff1ffaffc0; /* 63:32, 28:19, 17, 15:6 */ulong cr0_mask = CR0_ET_BIT | CR0_CD_BIT | CR0_NW_BIT | CR0_NE_BIT |
cr0_reserved;ulong cr3_mask = ~(current->pte_addr_mask | PAGESIZE_MASK);ulong cr4_mask = CR4_VMXE_BIT;
ulong acr;u64 guest_efer;
const u64 efer_mask = MSR_IA32_EFER_LME_BIT | MSR_IA32_EFER_LMA_BIT;struct vmcs_host_states hs = current->u.vt.shadow_vt->current_shadow_vmcs->hs;ulong exit_ctl = current->u.vt.shadow_vt->current_shadow_vmcs->exit_ctl_shadow;ulong exec_ctl;
/* Load some L2-L0 VMCS field */asm_vmread (VMCS_VMEXIT_CTL, &tmp);
これが”VMExit” 時のアトミックな処理…
AMD 版実装との主な違い
•全部
•命令エミュレーション
• Host Statesの Shadowing
• VMExit のエミュレーション
• vCPU マイグレーションへの対応
36
vCPUマイグレーション
= vCPUの物理コア間の移動(プロセスマイグレーションみたいなイメージ)
37
物理コア 物理コア 物理コア 物理コア
vCPU
vCPUマイグレーションの流れ
38
物理コア 物理コア
vCPU
RAM
VMM
VMCS
VMCSのキャッシュ
VMCS
vCPUマイグレーションの流れ
39
物理コア 物理コア
RAM
VMM
VMCS
VMCS
VMCLEAR
VMCSのキャッシュ
キャッシュ吐き出し
vCPUマイグレーションの流れ
40
物理コア 物理コア
RAM
VMM
VMCS
VMCS
VMCS
vCPU
VMCLEAR VMPTRLD
VMCSのキャッシュ
キャッシュ吐き出し
vCPU
Nested Virtualization でのvCPU マイグレーションの流れ
41
物理コア 物理コア
RAM
L1 VMM
L2/L0 VMCS
VMCLEAR
L0 VMM
L2/L1 VMCS
L1 Host State
vCPU
Nested Virtualization でのvCPU マイグレーションの流れ
42
物理コア 物理コア
RAM
L1 VMM
L2/L1 VMCS
L2/L1 VMCS
VMCLEAR
L0 VMM
L1 Host State
vCPU
Nested Virtualization でのvCPU マイグレーションの流れ
43
物理コア 物理コア
RAM
L1 VMM
L2/L1 VMCS
VMCLEAR
L0 VMM
L1 Host State
L2/L1 VMCS
Nested Virtualization でのvCPU マイグレーションの流れ
44
物理コア 物理コア
RAM
L1 VMM
L2/L1 VMCS
VMCLEAR
L0 VMM
L1 Host State
L2/L1 VMCS
VMPTRLD
Nested Virtualization でのvCPU マイグレーションの流れ
45
物理コア 物理コア
RAM
L1 VMM
L2/L1 VMCS
VMCLEAR
L0 VMM
L1 Host State
L2/L1 VMCS
VMPTRLD
L2/L1 VMCS
Nested Virtualization でのvCPU マイグレーションの流れ
46
物理コア 物理コア
RAM
L1 VMM
L2/L1 VMCS
VMCLEAR
L0 VMM
L1 Host State
L2/L1 VMCS
VMPTRLD
L2/L1 VMCS
L1 Host State
Nested Virtualization でのvCPU マイグレーションの流れ
47
物理コア 物理コア
RAM
L1 VMM
L2/L1 VMCS
VMCLEAR
L0 VMM
L1 Host State
L2/L1 VMCS
VMPTRLD
L2/L0 VMCS
L1 Host State
L0 Host State
vCPU
その他ハマったところ: EFER
• IA32_MSR_EFER が Exit 時にロードされたりされなかったりする• Exit control でL1が制御可能
• ゲストとホストが同じ EFER の設定を使っていると,VMExit のたびに EFER を更新しないような設定にされたりする (KVM)
• うまく対応する必要がある
48
EFER の扱い
• L1 EFER Physical EFER
• VMEntry from L0 to L2
• VMExit from L2 to L0
• If (exit_ctl & load_host_efer)• L1/L0_VMCS_GUEST_EFER = L2/L1_VMCS_HOST_EFER
• else• L1/L0_VMCS_GUEST_EFER = Physical EFER
• Restore EFER
• 32 Bit OS対応どうしよう?
49
コード行数
•明らかに Intel 対応の方が行数が多い
AMD: +266行,-6行 (Changeset #106)
Intel: +1455行, -1行
50
対応状況 (L2 は Ubuntu 16.04 64bit)
51
L1 VMM 対応状況
KVM O
VirtualBox on Linux O
VirtualBox on Windows O?
VMWare workstation player on Linux O
Bhyve O?
Hyper-V ?
BitVisor O
Xen ?
* on Mac ?
対応/検証状況
52
• とりあえず OS 起動のみ検証
• デバイスの共有などは未検証
• Nested EPTは未対応
• L2 は Ubuntu 16.04 64bit, Thinkpad X1 でのみの検証
性能評価
• とかやりたかったんですけどね…
• Advent Calendarで書けるといいな…
53
まとめ
• Intel CPU 向けに Unsafe Nested Virtualization の対応
• Intel だと以下が大変だった• 命令エミュレーション
• Host States の Shadowing
• VMExit のエミュレーション
• vCPU マイグレーションへの対応
•色々大変だったけど何とか動いて?よかった
• そのうちメインラインに入る…かも…?
54
55
書いてね
56
Recommended