http://caoshouying.blog.163.com/blog/static/56948484201152343110517/
虛擬化的三大特征
在1974年P(guān)opek和Goldberg發(fā)表的虛擬化名篇《Formal Requirements for Virtualizable Third Generation Architectures》中定義了虛擬機(jī)(VM)可以被認(rèn)為是物理機(jī)的一種高效隔離的復(fù)制,并指出虛擬機(jī)應(yīng)具有的三大特征:
1.一致性, 一個(gè)運(yùn)行于虛擬機(jī)上的程序,其行為應(yīng)與直接運(yùn)行于物理機(jī)上的同程序的行為基本一致,只允許有細(xì)微的差異,比如在系統(tǒng)時(shí)間方面。
2.可控性,VMM(虛擬化管理器)對(duì)系統(tǒng)資源有完全的控制能力和管理權(quán)限,包括資源的分配,監(jiān)控和回收。
3.高效性,絕大多數(shù)的客戶機(jī)指令應(yīng)該由硬件直接執(zhí)行而無需VMM的參與。
但是要滿足這三點(diǎn),并非易事,因?yàn)橄到y(tǒng)的指令集架構(gòu)(ISA)需要相應(yīng)地滿足四個(gè)的條件:
1.CPU能支持多個(gè)特權(quán)級(jí),并且VM上面運(yùn)行的指令能在底特權(quán)級(jí)(比如Ring 3)下正確執(zhí)行。
2.非特權(quán)指令(允許用戶直接使用的指令)的執(zhí)行效果不依賴于CPU的特權(quán)級(jí)。
3.敏感指令(對(duì)系統(tǒng)資源配置有影響的指令)都是特權(quán)指令(不允許用戶直接使用的指令)。
4.必須支持一種內(nèi)存保護(hù)機(jī)制來保證多個(gè)虛擬機(jī)之間在內(nèi)存方面的隔離,例如段保護(hù)或頁(yè)保護(hù)。
為什么X86架構(gòu)很難被虛擬化?
雖然X86架構(gòu)在PC市場(chǎng)占據(jù)絕對(duì)的壟斷地位,但是由于其在初始設(shè)計(jì)時(shí),并沒有考慮到虛擬化需求,所以它對(duì)虛擬化的支持不夠,特別是它沒有滿足上面四個(gè)條件里面的第三個(gè),其因?yàn)槭荴86的ISA有17條敏感指令(比如LGDT等)不屬于特權(quán)指令。也就是說,當(dāng)虛擬機(jī)執(zhí)行到這些敏感指令的時(shí)候,很有可能出現(xiàn)錯(cuò)誤,將會(huì)影響到整個(gè)機(jī)器的穩(wěn)定。更困難的是,上面所提出的問題只是X86虛擬化所需要面對(duì)的問題的一小部分而已,還有許許多多的問題還未涉及。
下面將分CPU虛擬化,內(nèi)存虛擬化和I/O虛擬化這三部分來介紹全虛擬化,半虛擬化和硬件輔助虛擬化所采用的相關(guān)技術(shù)。
CPU虛擬化
CPU虛擬化的目標(biāo)是使虛擬機(jī)上的指令能被正常地執(zhí)行,而且效率接近物理機(jī)。
全虛擬化:主要采用優(yōu)先級(jí)壓縮(Ring Compression)和二進(jìn)制代碼翻譯技術(shù)(Binary Translation)這兩個(gè)技術(shù)。優(yōu)先級(jí)壓縮能讓VMM和Guest運(yùn)行在不同的特權(quán)級(jí)下,對(duì)X86架構(gòu)而言,就是VMM運(yùn)行在特權(quán)級(jí)最高Ring 0下,Guest的內(nèi)核代碼運(yùn)行在Ring 1下,Guest的應(yīng)用代碼運(yùn)行在Ring 3下。通過這種方式能讓VMM截獲一部分在Guest上執(zhí)行的特權(quán)指令,并對(duì)其進(jìn)行虛擬化。但是有一些對(duì)虛擬化不友好的指令則需要二進(jìn)制代碼翻譯來處理,它通過掃描并修改Guest的二進(jìn)制代碼來將那些難以虛擬化的指令轉(zhuǎn)化為支持虛擬化的指令。
半虛擬化:其通過修改Guest OS的代碼,使其將那些和特權(quán)指令相關(guān)的操作都轉(zhuǎn)換會(huì)發(fā)給VMM的Hypercall(超級(jí)調(diào)用),而且Hypercall支持Batch(批處理)和異步這兩種優(yōu)化方式,使得通過Hypercall能得到近似于物理機(jī)的速度,
硬件輔助虛擬化:主要有Intel的VT-x和AMD的AMD-V這兩種技術(shù),而且這兩種技術(shù)在核心思想上非常相似,都是通過引入新的指令和運(yùn)行模式,來讓VMM和Guest OS能分別運(yùn)行在其合適的模式下。在實(shí)現(xiàn)方面,VT-X支持兩種處理器工作方式:第一種稱為Root模式(Operation),VMM運(yùn)行于此模式,用于處理特殊指令,另一種稱為Non-Root模式(Operation),Guest OS運(yùn)行于此模式,當(dāng)在Non-Root 模式Guest執(zhí)行到特殊指令的時(shí)候,系統(tǒng)會(huì)切換到運(yùn)行于Root模式VMM,讓VMM來處理這個(gè)特殊指令。
內(nèi)存虛擬化
內(nèi)存虛擬化的目標(biāo)是能做好虛擬機(jī)內(nèi)存空間之間的隔離,使每個(gè)虛擬機(jī)都認(rèn)為自己擁有了整個(gè)內(nèi)存地址,并且效率也能接近物理機(jī)。
全虛擬化:影子頁(yè)表 (Shadow Page Table),就是為每個(gè)Guest都維護(hù)一個(gè)“影子頁(yè)表”,在這個(gè)表中寫入虛擬化之后的內(nèi)存地址映射關(guān)系,而Guest OS的頁(yè)表則無需變動(dòng),最后,VMM將影子頁(yè)表交給MMU進(jìn)行地址轉(zhuǎn)換。
半虛擬化:頁(yè)表寫入法,當(dāng)Guest OS創(chuàng)建一個(gè)新的頁(yè)表時(shí),其會(huì)向VMM注冊(cè)該頁(yè)表,之后在Guest運(yùn)行的時(shí)候,VMM將不斷地管理和維護(hù)這個(gè)表,使Guest上面的程序能直接訪問到合適的地址。
硬件輔助虛擬化:EPT(Extended Page Table,擴(kuò)展頁(yè)表),EPT通過使用硬件技術(shù),使其能在原有的頁(yè)表的基礎(chǔ)上,增加了一個(gè)EPT頁(yè)表,通過這個(gè)頁(yè)表能夠?qū)uest的物理地址直接翻譯為主機(jī)的物理地址,從而減低整個(gè)內(nèi)存虛擬化所需的Cost。還有,在EPT推出之前,硬件輔助虛擬化技術(shù)在內(nèi)存虛擬化方面有一個(gè)TLB(Translation lookaside buffer) Miss的軟肋。
I/O虛擬化
I/O虛擬化的目標(biāo)是不僅讓虛擬機(jī)訪問到它們所需要的I/O資源,而且要做好它們之間的隔離工作,更重要的是,減輕由于虛擬化所帶來的開銷。
全虛擬化:通過模擬I/O設(shè)備(磁盤和網(wǎng)卡等)來實(shí)現(xiàn)虛擬化。對(duì)Guest OS而言,它所能看到就是一組統(tǒng)一的I/O設(shè)備,同時(shí)Guest OS每次I/O操作都會(huì)陷入到VMM,讓VMM來執(zhí)行。這種方式,對(duì)Guest而言,非常透明,無需顧忌底層硬件,比如Guest操作的是SCSI的設(shè)備,但實(shí)際物理機(jī)只有SATA的硬盤。
半虛擬化:通過前端(Front-End)/后端(Back-End)架構(gòu),將Guest的I/O請(qǐng)求通過一個(gè)環(huán)狀隊(duì)列傳遞到特權(quán)域(Privileged Domain,也被稱為Domain-0)。因?yàn)檫@種方式的相關(guān)細(xì)節(jié)較多,所以會(huì)在后文進(jìn)行深入分析。
硬件輔助虛擬化:最具代表性莫過于Intel的VT-d,AMD的IOMMU和PCI-SIG的IOV(I/O Virtulization)這三個(gè)技術(shù)。在這里介紹一下VT-d,其核心思想就是讓虛擬機(jī)能直接使用物理設(shè)備,但是這會(huì)牽涉到I/O地址訪問和DMA的問題,而VT-d通過采用DMA重映射(Remapping)和I/O頁(yè)表來解決這兩個(gè)問題,從而讓虛擬機(jī)能直接訪問物理設(shè)備。還有,IOMMU和VT-d在技術(shù)上有很多相似之處。
總結(jié)
首先,通過一個(gè)表格來總結(jié)一下X86虛擬化技術(shù):
全虛擬化
半虛擬化
硬件輔助虛擬化
CPU虛擬化
二進(jìn)制代碼翻譯
Hypercall
VT-x
內(nèi)存虛擬化
影子頁(yè)表
頁(yè)表寫入法
EPT
I/O虛擬化
模擬I/O設(shè)備
前端/后端架構(gòu)
VT-d
表1. X86虛擬化技術(shù)總結(jié)
其次,由于這三種虛擬化技術(shù)各有千秋,所以在取舍方面很讓人為難,但是也是兩個(gè)規(guī)則可循,其一是如果使用最新的芯片,比如45nm的Nehalem和32nm的Westmare,那么硬件虛擬化技術(shù)是一個(gè)比較不錯(cuò)的選擇,甚至勝于半虛擬化技術(shù)。其二是如果是跑有很多TLB Miss的應(yīng)用(比如Java應(yīng)用),那么應(yīng)避免使用硬件虛擬化技術(shù)??傮w而言,就像VMware的白皮書《Virtual Machine Monitor Execution Modes: in VMware vSphere 4.0》(請(qǐng)見參【6】)總結(jié)的那樣,如果是使用最新的45nm以下的Intel芯片和較新的操作系統(tǒng)(比如,Win 2000之后Windows和2.6之后的Linux)推薦使用硬件虛擬化技術(shù),其他使用較舊的Intel的芯片和操作系統(tǒng)應(yīng)使用全虛擬化技術(shù),還有如果操作系統(tǒng)內(nèi)置VMI(VMware的半虛擬化技術(shù)),也可使用半虛擬化技術(shù)。此外這本白皮書也介紹和AMD芯片相關(guān)的內(nèi)容。
最后,是我個(gè)人的預(yù)測(cè):雖然現(xiàn)在硬件輔助虛擬化有TLB Miss這個(gè)軟肋, 但是隨著硬件輔助虛擬化技術(shù)不斷地發(fā)展和優(yōu)化,將使其在速度和架構(gòu)方面的優(yōu)勢(shì)更明顯,但是由于全虛擬化和半虛擬化的一些技術(shù)在某些方面還是保持了一定的優(yōu)勢(shì),比如半虛擬化的前端和后端架構(gòu)和全虛擬化的二進(jìn)制代碼翻譯技術(shù)。所以,我個(gè)人認(rèn)為今后X86虛擬化技術(shù)的發(fā)展將會(huì)以硬件輔助虛擬化技術(shù)為主,同時(shí)以全虛擬化和半虛擬化技術(shù)為輔。