1. 一句話總結(jié)
內(nèi)存虛擬化解決虛擬機(jī)里面的進(jìn)程如何訪問物理機(jī)上的內(nèi)存這一問題。
GuestOS本身有虛擬地址空間,用GVA表示。虛擬機(jī)認(rèn)為自己獨(dú)占整個(gè)內(nèi)存空間,用GPA表示。
HostOS本身有虛擬機(jī)地址空間,用HVA表示。宿主機(jī)本身有物理內(nèi)存空間,用HPA表示。
好,內(nèi)存虛擬化的問題變成了GVA->HPA的映射問題。
GVA->GPA通過GuestOS頁表映射。HVA->HPA通過HostOS頁表映射。因此,只要建立GPA->HVA的映射關(guān)系,即可解決內(nèi)存虛擬化的問題。但,這樣三段逐次映射,效率低下。
引入軟件模擬的影子頁表和硬件輔助的EPT頁表。
影子頁表:GuestOS創(chuàng)建GVA->GPA頁表的時(shí)候,kvm知道GVA對應(yīng)的HPA,并偷偷記錄下映射關(guān)系GVA->HPA。后續(xù)需要GVA到GPA映射的時(shí)候,根據(jù)影子頁表就能查到HPA。
EPT頁表:硬件層面引入EPTP寄存器。直接將Guest的CR3加載到宿主機(jī)的MMU中。同時(shí)EPT頁表被載入專門的EPT頁表指針寄存器 EPTP。也就是說GVA->GPA->HPA兩次地址轉(zhuǎn)換都由硬件實(shí)現(xiàn)。
2. 概述
我們知道80386引入了保護(hù)模式后,內(nèi)存空間分為虛擬地址空間和物理地址空間。后續(xù)引入頁表機(jī)制,把虛擬機(jī)地址送往mmu,mmu查TLB不中的情況下,依次查頁表就可以找到對應(yīng)的物理地址。
在虛擬化場景下情況略微復(fù)雜,分為以下幾種:
①GuestOS 虛擬地址(guestOS virtual Adress,GVA)
說白了guestos中進(jìn)程使用的虛擬地址就是GVA,也就是程序訪問邏輯存儲器的地址。
②guestOS 物理地址(GuestOS Physical Address,GPA)
Guestos認(rèn)為的物理地址,也是虛擬機(jī)mmu查頁表得出的地址但是他本質(zhì)是一個(gè)邏輯上的地址,是引入虛化后產(chǎn)生的一個(gè)邏輯概念。它必須借助于內(nèi)存虛擬化映射到宿主機(jī)的物理地址上才能訪問內(nèi)存
③主機(jī)虛擬機(jī)地址(Host virtul Address,HVA)
宿主機(jī)中的虛擬地址,宿主機(jī)進(jìn)程使用的虛擬地址空間。
④主機(jī)物理地址(Host Physical Address,HPA)
宿主機(jī)真實(shí)內(nèi)存地址,真實(shí)可以訪問的物理內(nèi)存空間。
至此,在虛擬機(jī)場景下,如何由GVA->HPA就是內(nèi)存虛擬化的工作。其中,Qemu負(fù)責(zé)管理虛擬機(jī)內(nèi)存大小,記錄內(nèi)存對應(yīng)的HVA地址(因?yàn)镼emu是用戶態(tài)的進(jìn)程,無法管理HPA)想要轉(zhuǎn)化為HPA需要借助于KVM內(nèi)核也就是影子頁表SPT(Shadow Page Table)和EPT(Extent Page Table)
2.1 影子頁表
在Guestos建立頁表的時(shí)候,KVM偷偷的建立了一套指向宿主機(jī)物理地址的頁表。客戶機(jī)中的每一個(gè)頁表項(xiàng)都有一個(gè)影子頁表項(xiàng)與之相對應(yīng),就像其影子一樣。
在客戶機(jī)訪問內(nèi)存時(shí),真正被裝入宿主機(jī) MMU 的是客戶機(jī)當(dāng)前頁表所對應(yīng)的影子頁表這樣通過影子頁表就可以實(shí)現(xiàn)真正的內(nèi)存訪問虛擬機(jī)頁表和影子頁表通過一個(gè)哈希表建立關(guān)聯(lián)這樣通過頁目錄/頁表的客戶機(jī)物理地址就可以在哈希鏈表中快速地找到對應(yīng)的影子頁目錄/頁表當(dāng)客戶機(jī)切換進(jìn)程時(shí),客戶機(jī)操作系統(tǒng)會把待切換進(jìn)程的頁表基址載入 CR3而 KVM 將會截獲這一特權(quán)指令,進(jìn)行新的處理,也即在哈希表中找到與此頁表基址對應(yīng)的影子頁表基址,載入客戶機(jī) CR3使客戶機(jī)在恢復(fù)運(yùn)行時(shí) CR3 實(shí)際指向的是新切換進(jìn)程對應(yīng)的影子頁表。
2.2 EPT
EPT 技術(shù)在原有客戶機(jī)頁表對客戶機(jī)虛擬地址到客戶機(jī)物理地址映射的基礎(chǔ)上引入了 EPT頁表來實(shí)現(xiàn)客戶機(jī)物理地址到宿主機(jī)物理地址的另一次映射,這兩次地址映射都是由硬件自動完成。客戶機(jī)運(yùn)行時(shí),客戶機(jī)頁表被載入 CR3,而 EPT 頁表被載入專門的EPT 頁表指針寄存器 EPTP。
在客戶機(jī)物理地址到宿主機(jī)物理地址轉(zhuǎn)換的過程中,由于缺頁、寫權(quán)限不足等原因也會導(dǎo)致客戶機(jī)退出,產(chǎn)生 EPT異常。對于 EPT 缺頁異常,KVM首先根據(jù)引起異常的客戶機(jī)物理地址,映射到對應(yīng)的宿主機(jī)虛擬地址,然后為此虛擬地址分配新的物理頁最后 KVM 再更新 EPT 頁表,建立起引起異常的客戶機(jī)物理地址到宿主機(jī)物理地址之間的映射。對 EPT 寫權(quán)限引起的異常,KVM 則通過更新相應(yīng)的 EPT 頁表來解決。
由此可以看出,EPT 頁表相對于前述的影子頁表,其實(shí)現(xiàn)方式大大簡化。而且,由于客戶機(jī)內(nèi)部的缺頁異常也不會致使客戶機(jī)退出,因此提高了客戶機(jī)運(yùn)行的性能。此外,KVM 只需為每個(gè)客戶機(jī)維護(hù)一套 EPT 頁表,也大大減少了內(nèi)存的額外開銷。
3. Qemu到KVM內(nèi)存管理
3.1 設(shè)置鉤子