天天看點

全虛拟化與半虛拟化全虛拟化 半虛拟化

不需要對GuestOS作業系統軟體的源代碼做任何的修改,就可以運作在這樣的VMM中

在全虛拟化的虛拟平台中,GuestOS并不知道自己是一台虛拟機,它會認為自己就是運作在計算機實體硬體裝置上的HostOS。因為全虛拟化的VMM會将一個OS所能夠操作的CPU、記憶體、外設等實體裝置邏輯抽象成為虛拟CPU、虛拟記憶體、虛拟外設等虛拟裝置後,再交由GuestOS來操作使用。這樣的GuestOS會将底層硬體平台視為自己所有的,但是實際上,這些都是VMM為GuestOS制造了這種假象。

全虛拟化又分為:軟體輔助的全虛拟化 & 硬體輔助的全虛拟化。

軟體輔助全虛拟化架構圖: 

全虛拟化與半虛拟化全虛拟化 半虛拟化

在Intel等CPU廠商還沒有釋出x86 CPU虛拟化技術之前,完全虛拟化都是通過軟體輔助的方式來實作的。而軟體輔助的全虛拟化主要是應用了兩種機制: 

1. 特權解除(優先級壓縮):從上述的軟體輔助全虛拟化架構圖中可以看出,VMM、GuestOS、GuestApplications都是運作在Ring 1-3使用者态中的應用程式代碼。當在GuestOS中執行系統核心的特權指令時,一般都會觸發異常。這是因為使用者态代碼不能直接運作在核心态中,而且系統核心的特權指令大多都隻能運作在Ring 0核心态中。在觸發了異常之後,這些異常就會被VMM捕獲,再由VMM将這些特權指令進行虛拟化成為隻針對虛拟CPU起作用的虛拟特權指令。其本質就是使用若幹能運作在使用者态中的非特權指令來模拟出隻針對GuestOS有效的虛拟特權指令,進而将特權指令的特權解除掉。 

缺點:但是特權解除的問題在于當初設計标準x86架構CPU時,并沒有考慮到要支援虛拟化技術,是以會存在一部分特權指令運作在Ring 1使用者态上,而這些運作在Ring 1上的特權指令并不會觸發異常然後再被VMM捕獲。進而導緻在GuestOS中執行的特權指令直接對HostOS造成了影響(GuestOS和HostOS沒能做到完全隔離)。 

針對這個問題,再引入了陷入模拟的機制。

陷入模拟(二進制翻譯):就是VMM會對GuestOS中的二進制代碼(運作在CPU中的代碼)進行掃描,一旦發現GuestOS執行的二進制代碼中包含有運作在使用者态上的特權指令二進制代碼時,就會将這些二進制代碼翻譯成虛拟特權指令二進制代碼或者是翻譯成運作在核心态中的特權指令二進制代碼進而強制的觸發異常。這樣就能夠很好的解決了運作在Ring 1使用者态上的特權指令沒有被VMM捕獲的問題,更好的實作了GuestOS和HostOS的隔離。

簡而言之,軟體輔助虛拟化能夠成功的将所有在GuestOS中執行的系統核心特權指令進行捕獲、翻譯,使之成為隻能對GuestOS生效的虛拟特權指令。但是退一步來說,之是以需要這麼做的前提是因為CPU并不能準确的去判斷一個特權指令到底是由GuestOS發出的還是由HostOS發出的,這樣也就無法針對一個正确的OS去将這一個特權指令執行。

直到後來CPU廠商們釋出了能夠判斷特權指令歸屬的标準x86 CPU之後,迎來了硬體輔助全虛拟化。

全虛拟化與半虛拟化全虛拟化 半虛拟化

硬體輔助全虛拟化主要使用了支援虛拟化功能的CPU進行支撐,CPU可以明确的分辨出來自GuestOS的特權指令,并針對GuestOS進行特權操作,而不會影響到HostOS。

從更深入的層次來說,虛拟化CPU形成了新的CPU執行狀态 —— * Non-Root Mode& Root Mode* 。從上圖中可以看見,GuestOS運作在Non-Root Mode 的Ring 0核心态中,這表明GuestOS能夠直接執行特卻指令而不再需要 特權解除 和 陷入模拟 機制。并且在硬體層上面緊接的就是虛拟化層的VMM,而不需要HostOS。這是因為在硬體輔助全虛拟化的VMM會以一種更具協作性的方式來實作虛拟化 —— 将虛拟化子產品加載到HostOS的核心中,例如:KVM,KVM通過在HostOS核心中加載KVM Kernel Module來将HostOS轉換成為一個VMM。是以此時VMM可以看作是HostOS,反之亦然。這種虛拟化方式建立的GuestOS知道自己是正在虛拟化模式中運作的GuestOS,KVM就是這樣的一種虛拟化實作解決方案。

需要對GuestOS的核心代碼做一定的修改,才能夠将GuestOS運作在半虛拟化的VMM中。

半虛拟化通過在GuestOS的源代碼級别上修改特權指令來回避上述的虛拟化漏洞。

修改核心後的GuestOS也知道自己就是一台虛拟機。是以能夠很好的對核心态指令和敏感指令進行識别和處理,但缺點在于GuestOS的鏡像檔案并不通用。

上一篇: Kafka

繼續閱讀