漫談虛擬化之五-計(jì)算虛擬化中的內(nèi)存虛擬化
經(jīng)過前面的介紹,我們差不多都應(yīng)該知道,針對不同的資源,虛擬化主要包含三個(gè)方面的內(nèi)容:計(jì)算虛擬化、存儲虛擬化和網(wǎng)絡(luò)虛擬化,接下來咱們就來看看,什么是計(jì)算虛擬化中“內(nèi)存”虛擬化。
1. 內(nèi)存虛擬化簡介
內(nèi)存虛擬化的產(chǎn)生源于 VMM 與 Guest OS 在對物理內(nèi)存的認(rèn)識上存在沖突,造成物理內(nèi)存真正擁有者——VMM 必須對系統(tǒng)訪問的內(nèi)存進(jìn)行一定程度上的虛擬化?!?/p>
咱們先來看看,在非虛擬化環(huán)境下的情況:
(1)首先:指令對內(nèi)存的訪問通過處理器來轉(zhuǎn)發(fā);
(2)然后:處理器將解碼后的請求放到總線上;
(3)最后:芯片組負(fù)責(zé)轉(zhuǎn)發(fā)。
為了唯一標(biāo)識,處理器將采用統(tǒng)一編址的方式將物理內(nèi)存映射成為一個(gè)地址空間(物理地址空間)。這包括兩層含義,其一,操作系統(tǒng)會假定內(nèi)存地址從 0 開始;其二,內(nèi)存是連續(xù)的或者說在一些大的粒度(比如 256M)上連續(xù)。
在虛擬環(huán)境里,VMM 就要通過模擬手段,使得虛擬出來的內(nèi)存仍符合 Guest OS 對內(nèi)存的假定和認(rèn)識。如此一來,內(nèi)存虛擬化就需要解決如下的問題,
(1)其一,物理內(nèi)存要被多個(gè) Guest OS 同時(shí)使用,但物理內(nèi)存只有 1 個(gè),地址 0 也只有一個(gè),無法滿足同時(shí)從 0 開始的要求;
(2)其二,由于使用內(nèi)存分區(qū)方式,物理內(nèi)存分給多個(gè)系統(tǒng)使用,Guest OS 內(nèi)存連續(xù)性可解決但不靈活。
為了解決以上的問題,咱們的攻城獅們引入了一層新的地址空間——客戶機(jī)物理地址空間(GPA)來解決讓 Guest OS 看到一個(gè)虛擬的物理地址,讓 VMM 負(fù)責(zé)轉(zhuǎn)化成物理地址給物理處理器執(zhí)行。Guest Machine 以為自己運(yùn)行在真實(shí)的物理地址空間中,實(shí)際上它是通過 VMM 訪問真實(shí)的物理地址的。在 VMM 中保存 Guest Machine 地址空間和物理機(jī)地址空間之間的映射表。如下圖所示:
因?yàn)?VMM 掌控所有系統(tǒng)資源,因此 VMM 握有整個(gè)內(nèi)存資源,其負(fù)責(zé)頁式內(nèi)存管理,維護(hù)虛擬地址到機(jī)器地址的映射關(guān)系。因 Guest OS 本身亦有頁式內(nèi)存管理機(jī)制,所以 VMM的整個(gè)系統(tǒng)就比正常系統(tǒng)多了一層映射:
(1)虛擬地址(VA),指 Guest OS 提供給其應(yīng)用程序使用的線性地址空間;
(2)客戶機(jī)物理地址(GPA),經(jīng) VMM 抽象的、虛擬機(jī)看到的偽物理地址;
(3)機(jī)器地址(MA),真實(shí)的機(jī)器地址,即地址總線上出現(xiàn)的地址信號;
映射關(guān)系如下:Guest OS:GPA = f(VA)、VMM:MA = g(GPA)
VMM 維護(hù)一套頁表,負(fù)責(zé) GPA 到 MA 的映射。Guest OS 維護(hù)一套頁表,負(fù)責(zé) VA 到 GPA 的映射。實(shí)際運(yùn)行時(shí),用戶程序訪問 VA1,經(jīng) Guest OS 的頁表轉(zhuǎn)換得到 GPA1,再由 VMM 介入,使用 VMM 的頁表將 GPA1 轉(zhuǎn)換為 MA1。
2 內(nèi)存虛擬化的基礎(chǔ):頁表虛擬化技術(shù):
2.1 頁表虛擬化技術(shù)原理
普通 MMU(Memory Management Unit,即內(nèi)存管理單元)只能完成一次虛擬地址到物理地址的映射,在虛擬機(jī)環(huán)境下,經(jīng)過 MMU 轉(zhuǎn)換所得到的“物理地址”并不是真正的機(jī)器地址。若需得到真正的機(jī)器地址,必須由 VMM 介入,再經(jīng)過一次映射才能得到總線上使用的機(jī)器地址。如果虛擬機(jī)的每個(gè)內(nèi)存訪問都需要 VMM 介入,并由軟件模擬地址轉(zhuǎn)換的效率是很低下的,幾乎不具有實(shí)際可用性,為實(shí)現(xiàn)虛擬地址到機(jī)器地址的高效轉(zhuǎn)換,現(xiàn)普遍采用的思想是:由 VMM 根據(jù)映射 f 和 g 生成復(fù)合的映射 fg,并直接將這個(gè)映射關(guān)系寫入 MMU。
2.2 內(nèi)存虛擬化分類
當(dāng)前采用的頁表虛擬化方法主要是 MMU 半虛擬化(MMU Paravirtualization)和影子頁表(全虛擬化),后者已被內(nèi)存的芯片輔助虛擬化技術(shù)所替代。
(1)內(nèi)存全虛擬化技術(shù)(即影子頁表虛擬化)
通過使用影子頁表(Shadow Page Table)實(shí)現(xiàn)虛擬化。VMM 為每個(gè) Guest Machine 都維護(hù)一個(gè)影子頁表,影子頁表維護(hù)虛擬地址(VA)到機(jī)器地址(MA)的映射關(guān)系。而 Guest Machine 頁表則維護(hù) VA 到客戶機(jī)物理地址(GPA)的映射關(guān)系。下圖示意:
當(dāng) VMM 捕獲到 Guest Machine 頁表的修改后,VMM 會查找負(fù)責(zé) GPA 到 MA 映射的 P2M 頁表或者哈希函數(shù),找到與該 GPA 對應(yīng)的 MA,再將 MA 填充到真正在硬件上起作用的影子頁表中,從而形成 VA 到 MA 的映射關(guān)系。而客戶機(jī)頁表則無需變動。
注意:影子頁表一般特指有多個(gè)頁表緩存的方案。
其優(yōu)點(diǎn)主要來自于性能上的提升。由于時(shí)間局部性,系統(tǒng)中經(jīng)常會是幾個(gè)進(jìn)程之間回來切換,所以哪怕是 4 組頁表緩存,其重用率也可達(dá)到 80~90%。
其缺點(diǎn)是由于要維護(hù)多份頁表緩存,還是存在一定的額外開銷,并且由于要存放這些緩存,內(nèi)存上也會有些消耗。這些缺點(diǎn)可以通過 MMU 半虛擬化來解決。
(2)內(nèi)存半虛擬化技術(shù)(MMU 半虛擬化)
其基本原理是:當(dāng) Guest OS 創(chuàng)建一個(gè)新的頁表時(shí),會從它所維護(hù)的空閑內(nèi)存中分配一個(gè)頁面,并向 VMM 注冊該頁面,VMM 會剝奪 Guest OS 對該頁表的寫權(quán)限,之后 Guest OS 對該頁表的寫操作都會陷入到 VMM 加以驗(yàn)證和轉(zhuǎn)換。VMM 會檢查頁表中的每一項(xiàng),確保他們只映射了屬于該虛擬機(jī)的機(jī)器頁面,而且不得包含對頁表頁面的可寫映射。后 VMM 會根據(jù)自己所維護(hù)的映射關(guān)系,將頁表項(xiàng)中的物理地址替換為相應(yīng)的機(jī)器地址,最后再把修改過的頁表載入 MMU。如此,MMU就可以根據(jù)修改過頁表直接完成虛擬地址到機(jī)器地址的轉(zhuǎn)換。
簡單來說,如果通過使用頁表寫入法實(shí)現(xiàn)虛擬化。即 Guest OS 在創(chuàng)建一個(gè)新的頁表時(shí),會向 VMM 注冊該頁表。之后在 Guest Machine 運(yùn)行的時(shí)候,VMM 將不斷的管理和維護(hù)這個(gè)表,使 Guest Machine上面的程序能直接訪問到合適的地址。
Xen 是 MMU 半虛擬化的主要使用者。
(3)內(nèi)存硬件輔助虛擬化技術(shù)-內(nèi)存全虛擬化(影子頁表)的替代者
內(nèi)存的芯片輔助虛擬化技術(shù)是用于替代虛擬化技術(shù)中軟件實(shí)現(xiàn)的“影子頁表”的一種芯片輔助虛擬化技術(shù),其基本原理是:
GVA(客戶操作系統(tǒng)的虛擬地址)-> GPA(客戶操作系統(tǒng)的物理地址)-> HPA(宿主操作系統(tǒng)的物理地址)
其中兩次地址轉(zhuǎn)換都由 CPU 硬件自動完成(軟件實(shí)現(xiàn)內(nèi)存開銷大、性能差)。
在這種方案中,Guest OS 完成 VA 到 GPA 這第一層轉(zhuǎn)化,硬件幫忙完成 GPA 到 MA 這第二層轉(zhuǎn)化。第二層轉(zhuǎn)化對于 Guest OS 來說是透明的。Guest OS 訪存時(shí)做的事和在裸機(jī)上跑時(shí)一樣,所以可以實(shí)現(xiàn)全虛擬化。這種特性 Intel 和 AMD 都有支持。Intel 稱之為Extended Page Tables (EPT),AMD 稱之為 Nested Page Tables (NPT)。其優(yōu)點(diǎn)是hypervisor 省了很多活,缺點(diǎn)是需要硬件支持。
以 VT-x 技術(shù)的頁表擴(kuò)充技術(shù) Extended Page Table(EPT)為例,首先 VMM 預(yù)先把客戶機(jī)物理地址轉(zhuǎn)換到機(jī)器地址的 EPT 頁表設(shè)置到 CPU 中;其次客戶機(jī)修改客戶機(jī)頁表無需 VMM 干預(yù);最后,地址轉(zhuǎn)換時(shí),CPU 自動查找兩張頁表完成客戶機(jī)虛擬地址到機(jī)器地址的轉(zhuǎn)換。下圖示意:
使用內(nèi)存的芯片輔助虛擬化技術(shù),客戶機(jī)運(yùn)行過程中無需 VMM 干預(yù),去除了大量軟件開銷,內(nèi)存訪問性能接近物理機(jī)。
KVM 主要使用內(nèi)存硬件輔助虛擬化。
圖片授權(quán)基于:CC0協(xié)議