天天看點

虛拟化技術概要之處理器虛拟化

虛拟化技術概要之處理器虛拟化

2009-07-16 22:14

VMM 對實體資源的虛拟可以劃分為三個部分:處理器虛拟化、記憶體虛拟化和 I/O 虛拟化(裝置)。其中以處理器的虛拟化最為關鍵。

0. 體系結構背景

簡而言之,處理器呈現給軟體的接口就是一堆的指令(指令集)和一堆的寄存器(含用于通用運算的寄存器和用于控制處理器行為的狀态和控制寄存器)。而 I/O 裝置呈現給軟體的接口也就是一堆的狀态和控制寄存器(有些裝置亦有内部存儲)。這些都是系統的資源,其中影響處理器和裝置狀态和行為的寄存器稱為關鍵資源 或特權資源,如 x86 之 CR0 ~ CR4,MIPS 的 CP0 寄存器,PowerPC 的 Privileged SPR(SPR 編号第 5 位為 1)。

可以讀寫系統關鍵資源的指令叫做敏感指令,如 x86 的 lgdt/sgdt/lidt/sidt/in/out,MIPS 的 mtc0/mfc0,PowerPC 的 mtmsr/mfmsr,SPARC 的 rdpr/wrpr 等,此類又可稱為控制敏感指令。

還有一類

行為敏感指令

,該類指令的執行結果依賴于系統的狀态(如 x86 之 popf)

現代計算機體系結構一般至少有兩個特權級,(即使用者态和核心态,未加虛拟化擴充的 SPARC和PowerPC 即是,MIPS 有三個特權級(外加一個 Supervisor 态,沒什麼用),而 x86 有四個特權級 (Ring0 ~ Ring3))用來分隔系統軟體和應用軟體。

決大多數的敏感指令是特權指令,特權指令隻能在處理器的最高特權級(核心态)執行,如果執行特權指令時處理器的狀态不在核心态,通常會引發一個異常而交由系統軟體來處理這個“非法通路”(陷入)。

少數敏感指令是非特權指令,如 x86 的 sgdt/sidt 等,非特權指令可以在使用者态讀取處理器的狀态,如 sgdt/sidt 則可在使用者态 (Ring3) 将 GDTR 和 IDTR 的值讀取到通用寄存器中。

對于一般 RISC 處理器,如 MIPS,PowerPC 以及 SPARC,敏感指令肯定是特權指令,唯 x86 例外。

1. 經典的虛拟化方法

經典的虛拟化方法主要使用“特權解除” (Privilege deprivileging) 和“陷入-模拟” (Trap-and-Emulation) 的方式。即:将 Guest OS 運作在非特權級(特權解除),而将 VMM 運作于最高特權級(完全控制系統資源)。解除了 Guest OS 的特權後,Guest OS 的大部分指令仍可以在硬體上直接運作,隻有當執行到特權指令時,才會陷入到 VMM 模拟執行(陷入-模拟)。其早期的代表系統是 IBM VM/370

由此可引入虛拟化對體系結構 (ISA) 的要求:

A.

須支援多個特權級

此亦是現代作業系統的要求

B.

非敏感指令的執行結果不依賴于 CPU 的特權級

“陷入-模拟” 的本質是保證可能影響 VMM 正确運作的指令由 VMM 模拟執行,大部分的非敏感指令還是照常運作。

C.

CPU 需支援一種保護機制,如 MMU,可将實體系統和其它 VM 與目前活動的 VM 隔離

以上三個條件,現代體系結構一般都滿足,唯有最後一個也是最重要的條件:

D. 敏感指令需皆為特權指令

此為保證敏感指令在 VM 上執行時,能陷入到 VMM.

因控制敏感指令的執行可能改變系統(處理器和裝置)的狀态,為保證 VMM 對資源的絕對控制力維護 VM 的正常運作,這類指令的執行需要陷入而将控制權轉移到 VMM,并由其模拟處理之。

行為敏感指令的執行結果依賴于 CPU 的最高特權級,而 Guest OS 運作于非最高特權級,為保證其結果正确,亦需要陷入 VMM,并由其模拟之。

2. x86 ISA 分析

x86 ISA 中有十多條敏感指令不是特權指令,是以 x86 無法使用經典的虛拟化技術完全虛拟化。

如:sgdt/sidt/sldt 可以在使用者态讀取特權寄存器 GDTR/IDTR/LDTR 的值;popf/pushf 在 Ring0 和 Ring3 的執行結果不同;其它的還有 smsw, lar, lsl, verr, verw, pop, push, call, jmp, int n, ret, str, move

關于這些指令的詳細分析可以參見:"Analysis of the Intel Pentium's Ability to Support a Secure Virtual Machine Monitor"

3. x86 虛拟化方法

鑒于 x86 本身的局限,長期以來對 x86 的虛拟化都是通過軟體方式實作,後來 Intel 和 AMD 都引入各自的硬體虛拟化技術來彌補處理器的缺陷。

3.1

基于二進制翻譯 (BT) 的全虛拟化 (Full virtualization)

其主要思想是在執行時将 VM 上執行的 Guest OS 之指令,翻譯成 x86 ISA 的一個子集,其中的敏感指令被替換成陷入指令。翻譯過程與指令執行交叉進行。不含敏感指令的使用者态程式可以不經翻譯直接執行。該技術為 VMWare Workstation,VMWare ESX Server 早期版本,Virtual PC 以及 QEMU 所采用。

3.2

基于掃描與修補 (Scan-and-Patch) 的全虛拟化 (Full virtualization)

主要思想:

(1) VMM 會在 VM 運作每塊指令之前對其掃描,查找敏感指令

(2) 更新檔指令塊會在 VMM 中動态生成,通常每一個需要修補的指令會對應一塊更新檔指令

(3) 敏感指令被替換成一個外跳轉,從 VM 跳轉到 VMM,在 VMM 中執行動态生成的更新檔指令塊

(4) 當更新檔指令塊執行完後,執行流再跳轉回 VM 的下一條指令處繼續執行

SUN 之 Virtualbox 即采用該技術。

OS 協助的類虛拟化 (Paravirtualization)

其基本思想是通過修改 Guest OS 的代碼,将含有敏感指令的操作,替換為對 VMM 的超調用 (Hypercall,類似 OS 的系統調用,可将控制權轉移到 VMM)。該技術的優勢在于 VM 的性能能接近于實體機,缺點在于需要修改 Guest OS.

該技術因 Xen 項目而廣為人知。

目前嵌入式領域的虛拟化,考慮到性能的因素,亦會在可以使用經典虛拟化方法實作全虛拟的體系結構上采用類虛拟化技術。

3.3

硬體協助的虛拟化

鑒于 x86 在虛拟化上的缺陷,Intel 和 AMD 都引入自己的硬體虛拟化技術來協助完成虛拟化。

Intel VT-x (Virtualization Technology for x86)

Intel VT-i (Virtualization Technology for Itanium)

Intel VT-d (Virtualization Technology for Directed I/O)

AMD-V (AMD Virtualization)

其基本思想就是引入新的處理器運作模式和新的指令,使得 VMM 和 Guest OS 運作于不同的模式下,Guest OS 運作于受控模式,原來的一些敏感指令在受控模式下全部會陷入 VMM。而且模式切換時上下文的儲存恢複由硬體來完成。

該技術的引入使 x86 可以很容易地實作完全虛拟化。其被 KVM-x86,新版 VMWare ESX Server 3,Xen 3.0 以及大量 x86 平台上的虛拟化軟體所采用。

4. 其它體系結構分析

其它 RISC 之體系結構,如 MIPS, PowerPC, SPARC 等,似乎不存在有敏感指令為非特權指令的情形。即它們應該不存在虛拟化的困難。.

5. 其它體系所采用之虛拟化方法

目前可見的非 x86 體系的虛拟化産品,似乎都傾向于使用類虛拟化的技術手段。

繼續閱讀