新聞中心
一文看懂影子頁表和擴展頁表
作者: cloud3 2021-10-17 19:48:10
云計算
虛擬化 我們知道從intel的80386引入了保護模式后,內(nèi)存空間分為虛擬地址空間和物理地址空間。后引入頁表機制,把虛擬地址送往MMU,MMU查TLB不中的情況下,依次查頁表就可以找到對應(yīng)的物理地址。

我是cloud3,前段時間有虛擬機出現(xiàn)內(nèi)存問題,今天借著這個話題給大家介紹一下內(nèi)存虛擬化,也就是MMU虛擬化。
我們知道從intel的80386引入了保護模式后,內(nèi)存空間分為虛擬地址空間和物理地址空間。后引入頁表機制,把虛擬地址送往MMU,MMU查TLB不中的情況下,依次查頁表就可以找到對應(yīng)的物理地址。
(關(guān)于MMU的原理可以先看我的文章-圖解MMU)
在引入虛擬化技術(shù)后,內(nèi)存地址空間就變得復(fù)雜了,客戶機(Guest)和宿主機(Host)都有自己的地址空間。GuestOS本身有虛擬地址和物理地址。HostOS也有虛擬機地址和物理地址。那虛擬機如何訪問到物理機上的物理地址呢?這就是今天我們要討論的內(nèi)存虛擬化技術(shù)。
首先標(biāo)記幾個概念:
- HPA:Host Physical Address
- HVA:Host Virtual Address
- GPA:Guest Physical Address
- GVA:Guest Virtual Address
- PDBR:頁目錄表物理基地址寄存器,X86上叫CR3
- EPT:擴展頁表
ptr:這里用來描述指向某個頁表的寄存器
一.內(nèi)存虛擬化要解決的問題
內(nèi)存虛擬化實際實現(xiàn)就是MMU虛擬化,要實現(xiàn)GVA -> GPA -> HVA -> HPA,而傳統(tǒng)MMU只能實現(xiàn)VA->PA的轉(zhuǎn)換。所以在虛擬化場景下要解決虛擬機里面的進程如何訪問物理機上的內(nèi)存這一問題,也就是GVA->HPA的映射問題。
在硬件輔助內(nèi)存虛擬化出現(xiàn)之前,這個過程是通過軟件實現(xiàn)的,即通過VMM來實現(xiàn)的。最典型的實現(xiàn)方式就是影子頁表技術(shù)。
二.影子頁表
(Shadow page table)
影子頁表我用一句話來描述就是:VMM把Guest和Host中的頁表合并成一個頁表,稱為影子頁表,來實現(xiàn)GVA->HPA映射。
變?yōu)椋?/p>
影子頁表需要實現(xiàn) GVA -> HPA的轉(zhuǎn)換。如何實現(xiàn)呢?有下面幾步:
1,GVA->GPA,VMM層的軟件會將guest Page Table本身使用的物理頁面設(shè)為write protected的,Guest在進行GVA->GPA 時,由于是只讀的,導(dǎo)致 VM exit, traps to VMM。(關(guān)于VM exit的過程我們在CPU虛擬化時再詳解)。
2, GPA -> HVA,這一過程由VMM軟件實現(xiàn)的,這個很容易理解,就是通用的malloc。
3, HVA->HPA,這一過程就是我們已知的使用物理MMU完成VMM進程的虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換。
4, 把GVA -> HPA,這一路的映射關(guān)系記錄到頁表中,這個頁表就是影子頁表。
虛擬機頁表和影子頁表通過一個哈希表建立關(guān)聯(lián)(當(dāng)然也有其他的關(guān)聯(lián)方式),客戶機操作系統(tǒng)把當(dāng)前進程的頁表基址載入PDBR時而VMM將會截獲這一特權(quán)指令,將進程的影子頁表基址載入客戶機PDBR,使客戶機在恢復(fù)運行時PDBR實際指向的是進程對應(yīng)的影子頁表。這樣通過影子頁表就可以實現(xiàn)真正的內(nèi)存訪問。
影子頁表實現(xiàn)非常復(fù)雜,需要為每個Guest中的每個進程的Guest PT都維護一個對應(yīng)的Shadow PT。page fault和vm-exit的數(shù)量,也加重了CPU的負(fù)擔(dān)。為了提高效率,各個CPU廠家推出了硬件輔助MMU虛擬化的技術(shù)。
三.擴展頁表技術(shù)/EPT
嵌套頁表技術(shù)/NPT
從Intel的Nehalem架構(gòu)開始,EPT(Extended Page Tables)就作為CPU的一個特性加入到CPU硬件中去了。AMD也提供的類似技術(shù)叫做NPT,即Nested Page Tables。
硬件層面引入EPTP寄存器,來指向EPT頁表基地址。Guest運行時,Guest頁表被載入PDBR,而 EPT 頁表被載入專門的EPT 頁表指針寄存器 EPTP。
GVA->GPA的轉(zhuǎn)換依然是通過查找原來頁表完成,而GPA->HPA的轉(zhuǎn)換則通過查找EPT來實現(xiàn),每個guest VM有一個由VMM維護的EPT。
具體過程
當(dāng)Guest中進程訪問GVA時,CPU首先就要通過PDBR寄存器去找頁目錄,但是PDBR中存儲的地址是GPA,所以要到EPT中進行GPA->HPA的轉(zhuǎn)換,這個轉(zhuǎn)換過程和物理MMU的工作流程相同。
找到了頁目錄的HPA基地址,再通過GVA中的Directory offset段,就找到頁表的VGA了,這個頁表VGA再去EPT中進行GPA->HPA的轉(zhuǎn)換,就找到頁表VGA的HPA了。
重復(fù)上述過程,依次查找各級頁表,最終獲得該GVA對應(yīng)的HPA。如果是三級或者四級頁表,也是同樣的原理。
page fault處理
上面的查表過程是最理想的處處命中情況,那如果有page fault的情況如何處理呢?
如果Guest的頁表中沒有命中可直接由guest OS處理,不會產(chǎn)生vm-exit。如果在EPT中沒有命中,則產(chǎn)生EPT violation異常,這是Host中VMM層的page fault,不需要vm exit,只需要按照Host中的page fault處理就可以了。所以說EPT/NPT MMU解耦了GVA->GPA轉(zhuǎn)換和GPA->HPA轉(zhuǎn)換之間的依賴關(guān)系。并且一個VM只需要一套EPT頁表,減少了內(nèi)存開銷,維護也比較簡單。
四.看圖總結(jié)
最后我們直觀的看看引入虛擬化之后MMU的變化情況:
沒有虛擬化:
影子頁表:
EPT/NPT:
通過上面的對比圖,我們應(yīng)該能清楚的看到MMU虛擬化的整個設(shè)計思路。
當(dāng)前名稱:一文看懂影子頁表和擴展頁表
路徑分享:http://www.5511xx.com/article/ccosgjd.html


咨詢
建站咨詢
