影子頁表和EPT

影子頁表

不得不承認,一直對影子頁表和EPT技術都一知半解,是時候好好的認真的理解了。


先說普通的內存地址轉換,首先明確基本知識點。

頁表:確定了線性地址和物理地址的轉換。

TLB 就是保存頁表中對應的線性地址和物理地址的轉換,這樣的作用是爲了加速。


過程:首先CPU會去根據線性地址查找TLB,如果有,則立馬得到物理地址;若沒有,則進行地址轉換 ,並將結果更新到TLB。

所以說CPU並沒有說頁表一定要和TLB緩存的數據保持一致,若不一致的時候,查找TLB會引發 LTB Miss,然後會通過 TLB fill去修正TLB使之與頁表保持一致。


之前,一直對頁表這個詞不太理解,現在可以這麼理解吧,有了它,就可以通過線性地址找到物理地址,而這個頁表是可以被用戶更改,但是是給CPU查找的。


然後我們說下VTLB,這是基於VT_X技術優化。這裏VM中的頁表就不直接控制着線性地址和物理地址的轉換了,即CR3寄存器指向的不是頁表,而是影子頁表了。所以呢,地址轉換就通過的是影子頁表和TLB來共同控制。

既然不是通過頁表來查找地址了,那麼每次修改其頁表,也就不會引發VM_Exit了。 所以呀,這裏的頁表和影子頁表之間其實是不太同步的,有兩種情況:

1,VM頁表比影子頁表有更多的訪問權限,比如吧,VM頁表中記錄着線性地址和物理地址的對應關係,而影子頁表不存在此關係,那麼VM對線性地址的訪問將導致頁面故障,這裏注意,是訪問,不是修改,其實修改是不會產生頁面故障的。VMM會捕獲這個異常,然後根據VM頁表來修正影子頁表。

2,如果影子頁表的關係更多,而VM頁表被修改之後關係很少呢。此時,VM需要執行INVLPG指令或重裝CR3寄存器來刷新TLBVM在執行INVLPG指令或重裝CR3寄存器時將導致VM exit,使VMM有機會根據VM的頁表來修改影子頁表,從而修補這種不一致性。發現沒,其實影子頁表的修改還是通過VM頁表來作爲參照的。


-------------

對於A位,只要VMM不先於VM建立線性地址到物理地址的映射關係,就可以確保捕獲客戶對內存的訪問,進而有機會確保影子頁表項和客戶頁表項在A位上的一致。因爲,當客戶首次訪問某個線性地址時,由於影子頁表中沒有該線性地址到物理地址的對應關係,將導致一次頁面故障,VMM可以捕獲該故障,在影子頁表中建立線性地址到物理地址的對應關係,並將客戶頁表中相應項的A位置1

對於D位,VMM在影子頁表中建立線性地址到物理地址間的映射之初,可以將頁置爲只讀,這樣當VM對該頁進行寫操作時,將導致頁面故障,使VMM獲得控制,進而有機會確保影子頁表項和VM頁表項在D位上的一致


EPT

EPTVMM控制,並且僅在處理器工作於非根模式時才參與地址轉換。採用EPT後,客戶在讀寫CR3和執行INVLPG指令時不會導致VM exit,並且由於客戶頁表結構自身導致的頁故障也不會導致VM exit因此極大地提高了內存虛擬化的效率,簡化了內存虛擬化的實現。 

發佈了111 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章