剖析系統虛擬化(2) X86虛擬化技術

2021-05-23 21:39:19 字數 2944 閱讀 4623

在2023年popek和goldberg發表的虛擬化名篇《formal requirements for virtualizable third generation architectures》中定義了虛擬機器(vm)可以被認為是物理機的一種高效隔離的複製,並指出虛擬機器應具有的三大特徵:

一致性, 乙個執行於虛擬機器上的程式,其行為應與直接執行於物理機上的同程式的行為基本一致,只允許有細微的差異,比如在系統時間方面。

可控性,vmm(虛擬化管理器)對系統資源有完全的控制能力和管理許可權,包括資源的分配,監控和**。

高效性,絕大多數的客戶機指令應該由硬體直接執行而無需vmm的參與。

但是要滿足這三點,並非易事,因為系統的指令集架構(isa)需要相應地滿足四個的條件:

cpu能支援多個特權級,並且vm上面執行的指令能在底特權級(比如ring 3)下正確執行。

非特權指令(允許使用者直接使用的指令)的執行效果不依賴於cpu的特權級。

敏感指令(對系統資源配置有影響的指令)都是特權指令(不允許使用者直接使用的指令)。

必須支援一種記憶體保護機制來保證多個虛擬機器之間在記憶體方面的隔離,例如段保護或頁保護。

雖然x86架構在pc市場佔據絕對的壟斷地位,但是由於其在初始設計時,並沒有考慮到虛擬化需求,所以它對虛擬化的支援不夠,特別是它沒有滿足上面四個條件裡面的第三個,其因為是x86的isa有17條敏感指令(比如lgdt等)不屬於特權指令。也就是說,當虛擬機器執行到這些敏感指令的時候,很有可能出現錯誤,將會影響到整個機器的穩定。更困難的是,上面所提出的問題只是x86虛擬化所需要面對的問題的一小部分而已,還有許許多多的問題還未涉及。

下面將分cpu虛擬化,記憶體虛擬化和i/o虛擬化這三部分來介紹全虛擬化,半虛擬化和硬體輔助虛擬化所採用的相關技術。

cpu虛擬化的目標是使虛擬機器上的指令能被正常地執行,而且效率接近物理機。

全虛擬化:主要採用優先順序壓縮(ring compression)和二進位制**翻譯技術(binary translation)這兩個技術。優先順序壓縮能讓vmm和guest執行在不同的特權級下,對x86架構而言,就是vmm執行在特權級最高ring 0下,guest的核心**執行在ring 1下,guest的應用**執行在ring 3下。通過這種方式能讓vmm截獲一部分在guest上執行的特權指令,並對其進行虛擬化。但是有一些對虛擬化不友好的指令則需要二進位制**翻譯來處理,它通過掃瞄並修改guest的二進位制**來將那些難以虛擬化的指令轉化為支援虛擬化的指令。

半虛擬化:其通過修改guest os的**,使其將那些和特權指令相關的操作都轉換會發給vmm的hypercall(超級呼叫),而且hypercall支援batch(批處理)和非同步這兩種優化方式,使得通過hypercall能得到近似於物理機的速度,

硬體輔助虛擬化:主要有intel的vt-x和amd的amd-v這兩種技術,而且這兩種技術在核心思想上非常相似,都是通過引入新的指令和執行模式,來讓vmm和guest os能分別執行在其合適的模式下。在實現方面,vt-x支援兩種處理器工作方式:第一種稱為root模式(operation),vmm執行於此模式,用於處理特殊指令,另一種稱為non-root模式(operation),guest os執行於此模式,當在non-root 模式guest執行到特殊指令的時候,系統會切換到執行於root模式vmm,讓vmm來處理這個特殊指令。

記憶體虛擬化的目標是能做好虛擬機器記憶體空間之間的隔離,使每個虛擬機器都認為自己擁有了整個記憶體位址,並且效率也能接近物理機。

全虛擬化:影子頁表 (shadow page table),就是為每個guest都維護乙個「影子頁表」,在這個表中寫入虛擬化之後的記憶體位址對映關係,而guest os的頁表則無需變動,最後,vmm將影子頁表交給mmu進行位址轉換。

半虛擬化:頁表寫入法,當guest os建立乙個新的頁表時,其會向vmm註冊該頁表,之後在guest執行的時候,vmm將不斷地管理和維護這個表,使guest上面的程式能直接訪問到合適的位址。

硬體輔助虛擬化:ept(extended page table,擴充套件頁表),ept通過使用硬體技術,使其能在原有的頁表的基礎上,增加了乙個ept頁表,通過這個頁表能夠將guest的實體地址直接翻譯為主機的實體地址,從而減低整個記憶體虛擬化所需的cost。

i/o虛擬化的目標是不僅讓虛擬機器訪問到它們所需要的i/o資源,而且要做好它們之間的隔離工作,更重要的是,減輕由於虛擬化所帶來的開銷。

全虛擬化:通過模擬i/o裝置(磁碟和網絡卡等)來實現虛擬化。對guest os而言,它所能看到就是一組統一的i/o裝置,同時guest os每次i/o操作都會陷入到vmm,讓vmm來執行。這種方式,對guest而言,非常透明,無需顧忌底層硬體,比如guest操作的是scsi的裝置,但實際物理機只有sata的硬碟。

半虛擬化:通過前端(front-end)/後端(back-end)架構,將guest的i/o請求通過乙個環狀佇列傳遞到特權域(privileged domain,也被稱為domain-0)。因為這種方式的相關細節較多,所以會在後文進行深入分析。

全虛擬化

半虛擬化

硬體輔助虛擬化

cpu虛擬化

二進位制**翻譯

hypercall

vt-x

記憶體虛擬化

影子頁表

頁表寫入法

epti/o虛擬化

模擬i/o裝置

前端/後端架構

vt-d

表1. x86虛擬化技術總結

隨著硬體輔助虛擬化技術不斷地發展和優化,將使其在速度和架構方面的優勢更明顯,但是由於全虛擬化和半虛擬化的一些技術在某些方面還是保持了一定的優勢,比如半虛擬化的前端和後端架構和全虛擬化的二進位制**翻譯技術。所以,我個人認為今後x86虛擬化技術的發展將會以硬體輔助虛擬化技術為主,同時以全虛擬化和半虛擬化技術為輔.

從x86看虛擬化的前世今生

羽翼漸豐 由於虛擬化技術技術在商業應用上的優勢,risc伺服器與小型機成為了虛擬化 技術第二波受益者。1999年,ibm公司在as 400上提出了上 邏輯分割槽 lpar 技術和新的高可用性集群解決方案。在power管理程式上執行的as 400 lpar令單台伺服器工作起來如同12個獨立的伺服器。而...

Hadoop虛擬化擴充套件 HVE 之資源擴充套件技術

在虛擬化的雲環境中,hadoop 可以有更好的 彈性 這是雲計算的乙個重要優勢,例如亞馬遜的 emr elasticmapreduce 服務,使用者可以迅速的在雲中根據需求部署乙個 hadoop 集群,執行計算任務,並且使用者可以向集群動態的新增或刪除計算節點。這裡存在著乙個潛在問題,haodop ...

作業系統 虛擬化和雲

虛擬機器管理程式需要在以下三個維度上有良好的表現 安全性 虛擬機器管理程式應完全掌控虛擬資源。保真性 程式在虛擬機器上執行的行為應與在裸機上相同。高效性 虛擬機器中執行的大部分 應不受虛擬機器管理程式的干涉。敏感指令 在核心態和使用者態執行的行為不同。進行 i o 操作或修改 mmu 設定 特權指令...