CPU纯软件全虚拟化技术
我們?cè)谇懊娴奈恼轮刑岬搅颂摂M化技術(shù)的大致分類(lèi)情況,即分為全虛擬化、半虛擬化和硬件輔助虛擬化3大類(lèi)。而我們虛擬化技術(shù)最主要的虛擬主體就是我們的硬件CPU、內(nèi)存和IO,那么我們的CPU在全虛擬化模式下如何工作,在半虛擬化下如何工作,在硬件輔助虛擬化模式下如何工作?或著說(shuō)細(xì)分下來(lái),我們又可以分為:
- CPU的全虛擬化技術(shù)、半虛擬化技術(shù)和硬件輔助虛擬化技術(shù),
- 內(nèi)存的全虛擬化技術(shù)、半虛擬化技術(shù)和硬件輔助虛擬化技術(shù)
- IO設(shè)備的全虛擬化技術(shù)、半虛擬化技術(shù)和硬件輔助虛擬化技術(shù)。
本次我們就來(lái)說(shuō)說(shuō)CPU的全虛擬化技術(shù)、半虛擬化技術(shù)和硬件輔助虛擬化技術(shù)。
不支持硬件輔助虛擬化技術(shù)的X86架構(gòu)下的CPU有4個(gè)特權(quán)級(jí)(ring0~ring3),操作系統(tǒng)是處于最高級(jí)別的ring0,應(yīng)用程序處于最低級(jí)別的ring3。
在這種架構(gòu)下實(shí)現(xiàn)CPU的全虛擬化是極其困難的,為什么困難?
1、模擬仿真技術(shù)
最先實(shí)現(xiàn)這種CPU全虛擬化技術(shù)的是Trap-and-emulation技術(shù),即陷入模式和模擬仿真技術(shù)。這種技術(shù)通過(guò)將OS需求的特權(quán)指令通過(guò)VMM自動(dòng)捕獲的方式運(yùn)行后返回去OS。當(dāng)OS有特權(quán)指令產(chǎn)生時(shí),VMM將其自動(dòng)捕獲,將OS所請(qǐng)求的特權(quán)指令進(jìn)行截獲,然后通過(guò)VMM運(yùn)行之后將結(jié)果返回給OS層。VMM會(huì)使用模擬仿真將特權(quán)指令模擬仿真的方式執(zhí)行一遍。
在虛擬化模式下,就存在著2中特殊的指令:特權(quán)指令和敏感指令。那么什么是特權(quán)指令?什么是敏感指令?
特權(quán)指令:系統(tǒng)中有一些操作和管理關(guān)鍵系統(tǒng)資源的指令,這些指令只有在最高特權(quán)級(jí)上能夠正確運(yùn)行。如果在非最高特權(quán)級(jí)上運(yùn)行,特權(quán)指令會(huì)引發(fā)一個(gè)異常,處理器會(huì)陷入到最高特權(quán)級(jí),交由系統(tǒng)軟件處理了。
敏感指令:操作特權(quán)資源的指令,包括修改虛擬機(jī)的運(yùn)行模式或者下面物理機(jī)的狀態(tài);讀寫(xiě)時(shí)鐘、中斷等寄存器;訪問(wèn)存儲(chǔ)保護(hù)系統(tǒng)、地址重定位系統(tǒng)及所有的I/O指令。
根據(jù)Popek和Goldberg的定義,指令集支持虛擬化的前提是:所有敏感指令都是特權(quán)指令。很可惜x86指令集不能滿足這個(gè)要求。
虛擬化場(chǎng)景下,要求將GuestOS內(nèi)核的特權(quán)解除,從原來(lái)的0降低到1或者3。這部分特權(quán)指令在Guest OS中發(fā)生的時(shí)候,就會(huì)產(chǎn)生Trap,被VMM捕獲,從而由VMM完成。這就是虛擬的本質(zhì)方法,特權(quán)解除和陷入模擬(Privilege deprivileging/Trap-and-Emulation)。虛擬化場(chǎng)景中敏感指令必須被VMM捕獲并完成。對(duì)于一般 RISC 處理器,如 MIPS,PowerPC 以及SPARC,敏感指令肯定是特權(quán)指令,但是x86 例外,x86絕大多數(shù)的敏感指令是特權(quán)指令,但是由于部分敏感指令不是特權(quán)指令,執(zhí)行這些指令的時(shí)候不會(huì)自動(dòng)trap被VMM捕獲。
?
2、二進(jìn)制翻譯技術(shù)
采用模擬仿真的方式模擬和虛擬化x86架構(gòu)的CPU,但是由于x86架構(gòu)的CPU中,不是所有的敏感指令都是特權(quán)指令,所以并不能完全的解決掉那些不是特權(quán)指令的敏感指令的模擬仿真問(wèn)題。例如SGDT, SLDT, SIDT …
由于模擬仿真技術(shù)固有的缺陷,導(dǎo)致對(duì)CPU的虛擬化并不完整。所以也導(dǎo)致了基于x86的虛擬化難以和其他CPU架構(gòu)一樣實(shí)現(xiàn)虛擬化。比如IBM的Power CPU架構(gòu)就很早具備了虛擬化的技術(shù)并使用于實(shí)踐。
這個(gè)現(xiàn)象在1999年得到改善,VMware通過(guò)二進(jìn)制翻譯技術(shù)完成了對(duì)x86 CPU架構(gòu)的完全虛擬化。
其主要采用優(yōu)先級(jí)壓縮技術(shù)(Ring Compression)和二進(jìn)制代碼翻譯技術(shù)(Binary Translation)。優(yōu)先級(jí)壓縮技術(shù)讓VMM和Guest運(yùn)行在不同的特權(quán)級(jí)下。對(duì)x86架構(gòu)而言,即VMM運(yùn)行在最高特權(quán)級(jí)別Ring 0下,Guest OS運(yùn)行在Ring 1下,用戶應(yīng)用運(yùn)行在Ring 3下。因此,Guest OS的核心指令無(wú)法直接下達(dá)到計(jì)算機(jī)系統(tǒng)硬件執(zhí)行,而是需要經(jīng)過(guò)VMM的捕獲和模擬執(zhí)行(部分難以虛擬化的指令需要通過(guò)二進(jìn)制翻譯【Binary Translation】技術(shù)進(jìn)行轉(zhuǎn)換)。如下圖所示。
特權(quán)級(jí)我想在這里就不用多說(shuō),大家都比較清楚,說(shuō)說(shuō)大家可能不清楚的二進(jìn)制代碼翻譯技術(shù)。二進(jìn)制翻譯技術(shù)簡(jiǎn)稱(chēng)BT,是一種直接翻譯可執(zhí)行二進(jìn)制程序的技術(shù),能夠把一種處理器上的二進(jìn)制程序翻譯到另外一種處理器上執(zhí)行。二進(jìn)制翻譯技術(shù)將機(jī)器代碼從源機(jī)器平臺(tái)映射(翻譯)至目標(biāo)機(jī)器平臺(tái),包括指令語(yǔ)義與硬件資源的映射,使源機(jī)器平臺(tái)上的代碼“適應(yīng)”目標(biāo)平臺(tái)。因此翻譯后的代碼更適應(yīng)目標(biāo)機(jī)器,具有更高的運(yùn)行時(shí)效率。二進(jìn)制翻譯系統(tǒng)是位于應(yīng)用程序和計(jì)算機(jī)硬件之間的一個(gè)軟件層,它很好地降低了應(yīng)用程序和底層硬件之間的耦合度,使得二者可以相對(duì)獨(dú)立地發(fā)展和變化。二進(jìn)制翻譯也是一種編譯技術(shù),它與傳統(tǒng)編譯的差別在于其編譯處理對(duì)象不同。傳統(tǒng)編譯處理的對(duì)象是某一種高級(jí)語(yǔ)言,經(jīng)過(guò)編譯處理生成某種機(jī)器的目標(biāo)代碼;二進(jìn)制翻譯處理的對(duì)象是某種機(jī)器的二進(jìn)制代碼,該二進(jìn)制代碼是通過(guò)傳統(tǒng)編譯過(guò)程生成的,經(jīng)過(guò)二進(jìn)制翻譯處理后生成另一種機(jī)器的二進(jìn)制代碼。
根據(jù)不同的實(shí)現(xiàn)方式,二進(jìn)制翻譯技術(shù)可分為三大類(lèi):解釋執(zhí)行,靜態(tài)翻譯和動(dòng)態(tài)翻譯。
??代碼解釋執(zhí)行
解釋執(zhí)行(Interpretation)過(guò)程對(duì)源機(jī)器代碼中的每條指令實(shí)時(shí)解釋執(zhí)行,系統(tǒng)不保存且不緩存解釋過(guò)的指令,不需要用戶干涉,也不進(jìn)行任何優(yōu)化。解釋器相對(duì)容易開(kāi)發(fā),比較容易與老的體系結(jié)構(gòu)高度兼容,但效率很差。
??靜態(tài)二進(jìn)制翻譯
在靜態(tài)二進(jìn)制翻譯(SBT,Static BinaryTranslation)中,代碼在運(yùn)行之前被離線翻譯,根據(jù)目標(biāo)機(jī)器的指令結(jié)構(gòu)生成一個(gè)新的程序,然后直接執(zhí)行這個(gè)翻譯后生成的程序。靜態(tài)翻譯器的離線翻譯過(guò)程不會(huì)給程序運(yùn)行帶來(lái)額外開(kāi)銷(xiāo),因此可以充分采用各種優(yōu)化措施生產(chǎn)高質(zhì)量代碼,大大提高運(yùn)行時(shí)效率。
??動(dòng)態(tài)二進(jìn)制翻譯
動(dòng)態(tài)二進(jìn)制翻譯(DBT,Dynamic BinaryTranslation)則在程序運(yùn)行時(shí)對(duì)執(zhí)行到的代碼片段進(jìn)行翻譯,克服了靜態(tài)翻譯所無(wú)法解決的一些困難,如運(yùn)行時(shí)動(dòng)態(tài)信息收集,代碼挖掘,自修改代碼和精確中斷問(wèn)題。而且動(dòng)態(tài)翻譯器對(duì)用戶完全透明,無(wú)需用戶干預(yù)。雖然動(dòng)態(tài)翻譯有上述諸多優(yōu)點(diǎn),翻譯過(guò)程卻由于受到動(dòng)態(tài)執(zhí)行的限制而不能像靜態(tài)翻譯那樣進(jìn)行完全細(xì)致的優(yōu)化,使得翻譯生成的代碼效率比靜態(tài)翻譯器差。
三種二進(jìn)制翻譯技術(shù)的比較
解釋執(zhí)行是最易實(shí)現(xiàn)的一種翻譯技術(shù),但是其繁瑣的實(shí)現(xiàn)方式大大降低了翻譯系統(tǒng)的執(zhí)行效率。靜態(tài)翻譯雖然能提供高效的運(yùn)行時(shí)性能,但由于無(wú)法在靜態(tài)環(huán)境下覆蓋所有代碼,無(wú)法脫離對(duì)解釋器的依賴(lài)。與上述兩種相比,動(dòng)態(tài)翻譯很好的解決了代碼覆蓋、自修改代碼和精確中斷等諸多問(wèn)題,同時(shí)也能提供可接受的執(zhí)行效率。因此VMware基于動(dòng)態(tài)二進(jìn)制翻譯技術(shù)實(shí)現(xiàn)了x86架構(gòu)的CPU的虛擬化。
典型動(dòng)態(tài)二進(jìn)制翻譯系統(tǒng)結(jié)構(gòu)所示,被翻譯的代碼稱(chēng)為源機(jī)器代碼,在宿主機(jī)上運(yùn)行的代碼稱(chēng)為目標(biāo)機(jī)器代碼,一個(gè)典型的動(dòng)態(tài)二進(jìn)制翻譯器主要包括兩個(gè)模塊:翻譯引擎和執(zhí)行引擎。其中翻譯器引擎負(fù)責(zé)將源機(jī)器代碼翻譯代碼翻譯成目標(biāo)機(jī)器代碼;執(zhí)行引擎負(fù)責(zé)準(zhǔn)備目標(biāo)機(jī)器代碼運(yùn)行的上下文環(huán)境(Execution Context)然后從目標(biāo)機(jī)器代碼緩存中找到源機(jī)器代碼對(duì)應(yīng)的目標(biāo)代碼并執(zhí)行。
其基本運(yùn)行流程如下:
??查找(Lookup)階段
這個(gè)階段查詢目標(biāo)代碼塊是否存在于目標(biāo)代碼緩存中,如果存在則返回目標(biāo)塊入口地址,如果不存在則進(jìn)入翻譯階段。
??上下文切換(Context Switch)階段
當(dāng)一個(gè)目標(biāo)代碼塊被查詢到或者翻譯模塊生成的時(shí)候,二進(jìn)制翻譯系統(tǒng)會(huì)執(zhí)行一次控制權(quán)轉(zhuǎn)移。系統(tǒng)會(huì)把控制權(quán)交給執(zhí)行模塊去運(yùn)行該目標(biāo)代碼塊,目標(biāo)代碼塊運(yùn)行完畢后系統(tǒng)需要恢復(fù)執(zhí)行引擎的控制權(quán)。一次控制權(quán)轉(zhuǎn)移需要保存程序的上下文環(huán)境。
??翻譯(Translation)階段
完成從源機(jī)器二進(jìn)制代碼到目標(biāo)機(jī)器二進(jìn)制代碼的翻譯。包括解碼、中間代碼優(yōu)化、編碼三個(gè)子階段。
??執(zhí)行和鏈接(Executing & Linking)階段
當(dāng)基本塊被翻譯生成目標(biāo)代碼塊之后,依照源代碼的控制流完成目標(biāo)代碼塊之間的直接以及間接跳轉(zhuǎn)的鏈接,并依次運(yùn)行目標(biāo)代碼塊。
3、總結(jié)
在沒(méi)有CPU硬件輔助虛擬化技術(shù)之前,對(duì)于X86架構(gòu)的CPU就采用模擬和二進(jìn)制翻譯的技術(shù)對(duì)CPU進(jìn)行虛擬化實(shí)現(xiàn),但是模擬的方式存在固有缺陷,并不完全虛擬化了x86的CPU架構(gòu)。而二進(jìn)制翻譯技術(shù)則采用完全不同的思路實(shí)現(xiàn)了x86架構(gòu)的CPU虛擬化。其實(shí)對(duì)于x86的CPU虛擬化,其難點(diǎn)就在于對(duì)其特權(quán)指令和敏感指令的虛擬化實(shí)現(xiàn),當(dāng)然,在實(shí)現(xiàn)了CPU的指令這一難題之后,還有一個(gè)難題在等著我們!那就是x86架構(gòu)的CPU調(diào)度問(wèn)題?
在虛擬化環(huán)境下,x86架構(gòu)的CPU有什么調(diào)度問(wèn)題?
1、?虛擬CPU和物理CPU之間的對(duì)應(yīng)關(guān)系?
2、?虛擬CPU和物理CPU之間的資源分配?
3、?虛擬CPU和虛擬CPU之間的優(yōu)先級(jí)?
4、?多核虛擬CPU架構(gòu)vSMP和vNUMA與物理多核CPU架構(gòu)SMP和NUMA之間的調(diào)度和負(fù)載均衡?
總結(jié)
以上是生活随笔為你收集整理的CPU纯软件全虚拟化技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 「笔耕不辍」常见远程调用协议
- 下一篇: 小白学python#Day5#笔耕不辍#