全虛擬化與半虛擬化的實(shí)現(xiàn)方式(轉(zhuǎn))

全虛擬化

不需要對GuestOS操作系統(tǒng)軟件的源代碼做任何的修改,就可以運(yùn)行在這樣的VMM中。

在全虛擬化的虛擬平臺中,GuestOS并不知道自己是一臺虛擬機(jī),它會認(rèn)為自己就是運(yùn)行在計算機(jī)物理硬件設(shè)備上的HostOS。因?yàn)槿摂M化的VMM會將一個OS所能夠操作的CPU、內(nèi)存、外設(shè)等物理設(shè)備邏輯抽象成為虛擬CPU、虛擬內(nèi)存、虛擬外設(shè)等虛擬設(shè)備后,再交由GuestOS來操作使用。這樣的GuestOS會將底層硬件平臺視為自己所有的,但是實(shí)際上,這些都是VMM為GuestOS制造了這種假象。

全虛擬化又分為:軟件輔助的全虛擬化 & 硬件輔助的全虛擬化。

軟件輔助的全虛擬化

**軟件輔助全虛擬化架構(gòu)圖: **

軟件輔助全虛擬化架構(gòu)圖.png

在Intel等CPU廠商還沒有發(fā)布x86 CPU虛擬化技術(shù)之前,完全虛擬化都是通過軟件輔助的方式來實(shí)現(xiàn)的。而軟件輔助的全虛擬化主要是應(yīng)用了兩種機(jī)制:

  1. 特權(quán)解除(優(yōu)先級壓縮):從上述的軟件輔助全虛擬化架構(gòu)圖中可以看出,VMM、GuestOS、GuestApplications都是運(yùn)行在Ring 1-3用戶態(tài)中的應(yīng)用程序代碼。當(dāng)在GuestOS中執(zhí)行系統(tǒng)內(nèi)核的特權(quán)指令時,一般都會觸發(fā)異常。這是因?yàn)橛脩魬B(tài)代碼不能直接運(yùn)行在核心態(tài)中,而且系統(tǒng)內(nèi)核的特權(quán)指令大多都只能運(yùn)行在Ring 0核心態(tài)中。在觸發(fā)了異常之后,這些異常就會被VMM捕獲,再由VMM將這些特權(quán)指令進(jìn)行虛擬化成為只針對虛擬CPU起作用的虛擬特權(quán)指令。其本質(zhì)就是使用若干能運(yùn)行在用戶態(tài)中的非特權(quán)指令來模擬出只針對GuestOS有效的虛擬特權(quán)指令,從而將特權(quán)指令的特權(quán)解除掉。

缺點(diǎn):但是特權(quán)解除的問題在于當(dāng)初設(shè)計標(biāo)準(zhǔn)x86架構(gòu)CPU時,并沒有考慮到要支持虛擬化技術(shù),所以會存在一部分特權(quán)指令運(yùn)行在Ring 1用戶態(tài)上,而這些運(yùn)行在Ring 1上的特權(quán)指令并不會觸發(fā)異常然后再被VMM捕獲。從而導(dǎo)致在GuestOS中執(zhí)行的特權(quán)指令直接對HostOS造成了影響(GuestOS和HostOS沒能做到完全隔離)。
針對這個問題,再引入了陷入模擬的機(jī)制。

  1. 陷入模擬(二進(jìn)制翻譯):就是VMM會對GuestOS中的二進(jìn)制代碼(運(yùn)行在CPU中的代碼)進(jìn)行掃描,一旦發(fā)現(xiàn)GuestOS執(zhí)行的二進(jìn)制代碼中包含有運(yùn)行在用戶態(tài)上的特權(quán)指令二進(jìn)制代碼時,就會將這些二進(jìn)制代碼翻譯成虛擬特權(quán)指令二進(jìn)制代碼或者是翻譯成運(yùn)行在核心態(tài)中的特權(quán)指令二進(jìn)制代碼從而強(qiáng)制的觸發(fā)異常。這樣就能夠很好的解決了運(yùn)行在Ring 1用戶態(tài)上的特權(quán)指令沒有被VMM捕獲的問題,更好的實(shí)現(xiàn)了GuestOS和HostOS的隔離。

簡而言之,軟件輔助虛擬化能夠成功的將所有在GuestOS中執(zhí)行的系統(tǒng)內(nèi)核特權(quán)指令進(jìn)行捕獲、翻譯,使之成為只能對GuestOS生效的虛擬特權(quán)指令。但是退一步來說,之所以需要這么做的前提是因?yàn)镃PU并不能準(zhǔn)確的去判斷一個特權(quán)指令到底是由GuestOS發(fā)出的還是由HostOS發(fā)出的,這樣也就無法針對一個正確的OS去將這一個特權(quán)指令執(zhí)行。

直到后來CPU廠商們發(fā)布了能夠判斷特權(quán)指令歸屬的標(biāo)準(zhǔn)x86 CPU之后,迎來了硬件輔助全虛擬化。

硬件輔助的全虛擬化

硬件輔助的全虛擬化.png

硬件輔助全虛擬化主要使用了支持虛擬化功能的CPU進(jìn)行支撐,CPU可以明確的分辨出來自GuestOS的特權(quán)指令,并針對GuestOS進(jìn)行特權(quán)操作,而不會影響到HostOS。

從更深入的層次來說,虛擬化CPU形成了新的CPU執(zhí)行狀態(tài) —— * Non-Root Mode& Root Mode* 。從上圖中可以看見,GuestOS運(yùn)行在Non-Root Mode 的Ring 0核心態(tài)中,這表明GuestOS能夠直接執(zhí)行特卻指令而不再需要 特權(quán)解除 和 陷入模擬 機(jī)制。并且在硬件層上面緊接的就是虛擬化層的VMM,而不需要HostOS。這是因?yàn)樵谟布o助全虛擬化的VMM會以一種更具協(xié)作性的方式來實(shí)現(xiàn)虛擬化 —— 將虛擬化模塊加載到HostOS的內(nèi)核中,例如:KVM,KVM通過在HostOS內(nèi)核中加載KVM Kernel Module來將HostOS轉(zhuǎn)換成為一個VMM。所以此時VMM可以看作是HostOS,反之亦然。這種虛擬化方式創(chuàng)建的GuestOS知道自己是正在虛擬化模式中運(yùn)行的GuestOS,KVM就是這樣的一種虛擬化實(shí)現(xiàn)解決方案。

半虛擬化

需要對GuestOS的內(nèi)核代碼做一定的修改,才能夠?qū)uestOS運(yùn)行在半虛擬化的VMM中。

半虛擬化通過在GuestOS的源代碼級別上修改特權(quán)指令來回避上述的虛擬化漏洞。

修改內(nèi)核后的GuestOS也知道自己就是一臺虛擬機(jī)。所以能夠很好的對核心態(tài)指令和敏感指令進(jìn)行識別和處理,但缺點(diǎn)在于GuestOS的鏡像文件并不通用。

具體的x86架構(gòu)CPU解析,請參考虛擬化的發(fā)展歷程和實(shí)現(xiàn)方式。

本文轉(zhuǎn)自:全虛擬化與半虛擬化的實(shí)現(xiàn)方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容