4 內(nèi)存虛擬化
4.1 客戶機(jī)物理地址空間在物理機(jī)上,虛擬地址通過(guò)Guest頁(yè)表即可轉(zhuǎn)換為物理地址。但是在虛擬化環(huán)境中,由于VMM和VM都需要獨(dú)立的地址空間,則產(chǎn)生了沖突。
為實(shí)現(xiàn)內(nèi)存虛擬化,讓客戶機(jī)使用一個(gè)隔離的、從零開(kāi)始且具有連續(xù)的內(nèi)存空間,KVM 引入一層新的地址空間,即客戶機(jī)物理地址空間 (Guest Physical Address, GPA),該地址空間并不是真正的物理地址空間,它只是宿主機(jī)(Host主機(jī))虛擬地址空間在Guest地址空間的一個(gè)映射。對(duì)Guest來(lái)說(shuō),客戶機(jī)物理地址空間都是從零開(kāi)始的連續(xù)地址空間,但對(duì)于宿主機(jī)來(lái)說(shuō),客戶機(jī)的物理地址空間并不一定是連續(xù)的,客戶機(jī)物理地址空間有可能映射在若干個(gè)不連續(xù)的宿主機(jī)地址區(qū)間,如下圖所示:
1、 影子頁(yè)表(Shadow Page Table),是純軟件的實(shí)現(xiàn)方式2、 基于硬件特性的地址轉(zhuǎn)換。如基于Intel EPT(Extended Page Table,擴(kuò)展頁(yè)表),或AMD NPT(Nested Page Table,嵌套頁(yè)表)4.2 影子頁(yè)表4.2.1 基本原理
由于內(nèi)存虛擬化在將GVA轉(zhuǎn)換為HPA的過(guò)程中,需要經(jīng)歷多次轉(zhuǎn)換,無(wú)法直接使用Guest機(jī)頁(yè)表和CR3。使用影子頁(yè)表(Shadow Page Table)可以實(shí)現(xiàn)客戶機(jī)虛擬地址(GVA)到宿主機(jī)物理地址(HPA)的直接轉(zhuǎn)換,與傳統(tǒng)方式的轉(zhuǎn)換過(guò)程對(duì)比如下:
Guest機(jī)中的每一個(gè)頁(yè)表項(xiàng)都有一個(gè)影子頁(yè)表項(xiàng)與之相對(duì)應(yīng)。為了快速檢索Guest機(jī)頁(yè)表所對(duì)應(yīng)的的影子頁(yè)表,KVM 為每個(gè)客戶機(jī)都維護(hù)了一個(gè)哈希表,影子頁(yè)表和Guest機(jī)頁(yè)表通過(guò)此哈希表進(jìn)行映射,基本原理如下:
對(duì)于每一個(gè)Guest機(jī)來(lái)說(shuō),Guest機(jī)的頁(yè)目錄/頁(yè)表都有唯一的GPA,通過(guò)頁(yè)目錄/頁(yè)表的GPA就可以在哈希鏈表中快速地找到對(duì)應(yīng)的影子頁(yè)目錄/頁(yè)表。在檢索哈希表時(shí),KVM 把Guest頁(yè)目錄/頁(yè)表的客戶機(jī)物理地址低10位作為鍵值進(jìn)行索引,根據(jù)其鍵值定位到對(duì)應(yīng)的鏈表,然后遍歷此鏈表找到對(duì)應(yīng)的影子頁(yè)目錄/頁(yè)表。當(dāng)然,如果沒(méi)有找到對(duì)應(yīng)的影子頁(yè)目錄/頁(yè)表,則說(shuō)明影子頁(yè)表項(xiàng)和Guest頁(yè)表項(xiàng)的對(duì)應(yīng)關(guān)系還沒(méi)有建立 ,此時(shí)KVM 會(huì)為其分配新的物理頁(yè),并建立起Guest頁(yè)目錄/頁(yè)表和對(duì)應(yīng)的影子頁(yè)目錄/頁(yè)表之間的映射。
4.2.2 影子頁(yè)表的建立與更新影子頁(yè)表的建立和更新過(guò)程交織在一起,影子頁(yè)表的建立和更新主要發(fā)生在如下3中情況下: 1、 Guest OS修改Guest CR3寄存器。由于相關(guān)指令為敏感指令,所以相關(guān)操作會(huì)被VMM截獲,此時(shí)VMM會(huì)根據(jù)相關(guān)情況進(jìn)行影子頁(yè)表的維護(hù)。比如,當(dāng)客戶機(jī)切換進(jìn)程時(shí),客戶機(jī)操作系統(tǒng)會(huì)把待切換進(jìn)程的頁(yè)表基址載入 CR3,而該特權(quán)指令將被VMM截獲,進(jìn)行新的處理,即在哈希表中找到與此頁(yè)表基址對(duì)應(yīng)的影子頁(yè)表基址,載入客戶機(jī) CR3,使客戶機(jī)在恢復(fù)運(yùn)行時(shí) CR3 實(shí)際指向的是新切換進(jìn)程對(duì)應(yīng)的影子頁(yè)表。 2、 因Guest機(jī)頁(yè)表和影子頁(yè)表不一致而觸發(fā)的缺頁(yè)異常,此時(shí)也會(huì)VM-Exit到VMM,進(jìn)而可進(jìn)行相關(guān)維護(hù)操作。 3、 Guest OS中執(zhí)行INVLPG指令刷新TLB時(shí),由于INVLPG指令為敏感指令,所以該操作也會(huì)被VMM進(jìn)行截獲,并進(jìn)行影子頁(yè)表相關(guān)維護(hù)操作。 其中,第2中情況發(fā)生幾率最高,相關(guān)處理也最復(fù)雜。如下做重點(diǎn)描述。不同的缺頁(yè)異常,處理方式不用,常見(jiàn)的缺頁(yè)異常包括如下3類: 1、 影子頁(yè)表初始化時(shí)產(chǎn)生的缺頁(yè)異常。在虛擬機(jī)運(yùn)行之初,VMM中與Guest機(jī)頁(yè)表對(duì)應(yīng)的影子頁(yè)表都沒(méi)有建立,而物理CR3中載入的卻是影子頁(yè)目錄地址,所以,此時(shí)任何的內(nèi)存操作都會(huì)引發(fā)異常,如果此時(shí)Guest機(jī)的相應(yīng)頁(yè)表已經(jīng)建立,那么處理這種異常即是建立相應(yīng)的影子頁(yè)表即可;如果Guest機(jī)的頁(yè)表項(xiàng)尚未建立,那就是Guest機(jī)自身的缺頁(yè)異常,即為如下的第2中情況。 2、 Guest機(jī)上的缺頁(yè)異常。如果Guest OS尚未給這個(gè)GVA分配Guest機(jī)物理頁(yè),即相應(yīng)的Guest機(jī)頁(yè)表項(xiàng)尚未建立,此時(shí)將引發(fā)缺頁(yè)異常。另外,當(dāng)Guest機(jī)訪問(wèn)的Guest頁(yè)表項(xiàng)存在位(Present Bit)為0,或相關(guān)訪問(wèn)權(quán)限不匹配時(shí),也將引發(fā)缺頁(yè)異常。 3、 VMM將Host機(jī)物理頁(yè)換出到硬盤上時(shí)引發(fā)的缺頁(yè)異常。 影子頁(yè)表缺頁(yè)異常的默認(rèn)處理流程
VMM截獲缺頁(yè)異常(VM-Exit),并檢查此異常是否由Guest即自身引發(fā),如果是,則將直接返回Guest OS(Vm-Entry),然后由Guest OS自身的page fault流程處理;如果不是,則為影子頁(yè)表和Guest機(jī)頁(yè)表不一致導(dǎo)致,這樣的異常也叫“影子缺頁(yè)異常”,此時(shí),VMM會(huì)根據(jù)Guest機(jī)頁(yè)表同步影子頁(yè)表,過(guò)程如下: 1、 VMM根據(jù)Guest機(jī)頁(yè)表項(xiàng)建立影子頁(yè)目錄和頁(yè)表結(jié)構(gòu) 2、 VMM根據(jù)發(fā)生缺頁(yè)異常的GVA,在Guest機(jī)頁(yè)表的相應(yīng)表項(xiàng)中得到對(duì)應(yīng)的GPA 3、 VMM根據(jù)GPA,在GPA與HPA的映射表中(通過(guò)之前描述的HASH表建立),得到相應(yīng)的HPA,再將HPA填入到影子頁(yè)表的相應(yīng)表項(xiàng)中。 影子頁(yè)表和Guest機(jī)頁(yè)表不是時(shí)刻同步的,只有在需要時(shí)才進(jìn)行通過(guò),從某種角度看,影子頁(yè)表可以看做是Guest頁(yè)表的TLB,常稱為虛擬TLB(VTLB)。 影子頁(yè)表解決了傳統(tǒng)IA32架構(gòu)下的內(nèi)存虛擬化問(wèn)題,由于影子頁(yè)表可被載入物理 MMU 為客戶機(jī)直接尋址使用, 所以客戶機(jī)的大多數(shù)內(nèi)存訪問(wèn)都可以在沒(méi)有 KVM 介入的情況下正常執(zhí)行,沒(méi)有額外的地址轉(zhuǎn)換開(kāi)銷,也就大大提高了客戶機(jī)運(yùn)行的效率。但也有比較明顯的缺點(diǎn): 1、 實(shí)現(xiàn)復(fù)雜。影子頁(yè)表同步需要考慮各種情況。 2、 內(nèi)存開(kāi)銷大。需要為每個(gè)Guest機(jī)進(jìn)程維護(hù)一個(gè)影子頁(yè)表。 4.3 EPT 頁(yè)表4.3.1 基本原理為解決影子頁(yè)表的問(wèn)題,Intel和AMD都提供了相應(yīng)的硬件技術(shù),直接在硬件上支持GPA到HPA的轉(zhuǎn)換,從而大大降低了內(nèi)存虛擬化的難度,并提升了相關(guān)性能。本文主要描述Intel EPT技術(shù)。
EPT 技術(shù)在原有Guest機(jī)頁(yè)表對(duì)GVA到GPA轉(zhuǎn)換的基礎(chǔ)上,又引入了 EPT 頁(yè)表來(lái)實(shí)現(xiàn)GPA到HPA轉(zhuǎn)換,這兩次地址轉(zhuǎn)換都是由硬件自動(dòng)完成,可高效的實(shí)現(xiàn)地址轉(zhuǎn)換。Guest運(yùn)行時(shí),Guest頁(yè)表被載入 CR3,而 EPT 頁(yè)表被載入專門的 EPT 頁(yè)表指針寄存器 EPTP。從GVA到HPA的具體轉(zhuǎn)換過(guò)程如下(以經(jīng)典的2級(jí)頁(yè)表為例):
完整的地址翻譯流程描述為: 1、 Guest OS加載Guest進(jìn)程的gCR3,gCR3中存放的是Guest進(jìn)程頁(yè)目錄表的GPA。 2、 處于非根模式的CPU的MMU查詢硬件EPT TLB,如果有所請(qǐng)求的GPA到HPA的映射,則使用其對(duì)應(yīng)的HPA作為Guest頁(yè)目錄表的基址。 3、 如沒(méi)有所請(qǐng)求的GPA到HPA的映射,則查詢EPT,獲得gCR3所映射的HPA,并將其作為Guest頁(yè)目錄表的基址。 4、 根據(jù)GVA獲得頁(yè)目錄偏移(圖中的Dir Offset),獲得用于索引Guest頁(yè)表的基址,該地址為GPA。 5、 再由VCPU的MMU查詢硬件EPT TLB,如果有所請(qǐng)求的GPA到HPA的映射,則使用其對(duì)應(yīng)的HPA作為Guest頁(yè)表的基址。 6、 如沒(méi)有所請(qǐng)求的GPA到HPA的映射,則查詢EPT,將其轉(zhuǎn)換為HPA,使用該HPA再加上GVA中的頁(yè)表偏移(圖中的Table Offset),即可得到PTE(頁(yè)表項(xiàng))的GPA。 7、 再由VCPU的MMU查詢硬件EPT TLB,如果有所請(qǐng)求的GPA到HPA的映射,則其對(duì)應(yīng)的HPA加上GVA中的Offset即為最終的宿主機(jī)物理地址(HPA)。 8、 如沒(méi)有所請(qǐng)求的GPA到HPA的映射,則查詢EPT,將其轉(zhuǎn)換為HPA,使用該HPA加上GVA中的Offset即為最終的宿主機(jī)物理地址(HPA)。 EPT頁(yè)表實(shí)現(xiàn)GPA到HPA的轉(zhuǎn)換的原理,與Guest頁(yè)表實(shí)現(xiàn)GVA到GPA的轉(zhuǎn)換原理相同,需要經(jīng)歷多級(jí)頁(yè)表的查詢,圖中沒(méi)有詳細(xì)畫出。假設(shè)Guest機(jī)有m級(jí)頁(yè)表,宿主機(jī)EPT有n級(jí),在TLB均miss的最壞情況下,會(huì)產(chǎn)生m*n次內(nèi)存訪問(wèn),完成一次客戶機(jī)的地址翻譯,EPT硬件通過(guò)增大硬件EPT TLB來(lái)盡量減少內(nèi)存訪問(wèn)。 4.3.2 EPT缺頁(yè)異常處理在GPA到HPA轉(zhuǎn)換的過(guò)程中,由于缺頁(yè)、寫權(quán)限不足等原因也會(huì)導(dǎo)致客戶機(jī)退出,產(chǎn)生 EPT 異常。對(duì)于 EPT 缺頁(yè)異常,處理過(guò)程大致如下: 1、 KVM 首先根據(jù)引起異常的GHA,映射到對(duì)應(yīng)的HVA; 2、 然后為此虛擬地址分配新的物理頁(yè); 3、 最后 KVM 再更新 EPT 頁(yè)表,建立起引起異常的GPA到HPA的映射。 EPT 頁(yè)表相對(duì)于影子頁(yè)表,其實(shí)現(xiàn)方式大大簡(jiǎn)化,主要地址轉(zhuǎn)換工作都由硬件自動(dòng)完成,而且Guest內(nèi)部的缺頁(yè)異常也不會(huì)導(dǎo)致VM-Exit,因此Guest運(yùn)行性能更好,開(kāi)銷更小。 |
|
來(lái)自: treereet > 《內(nèi)存管理》