影子頁表和EPT

2021-06-25 07:04:01 字數 1522 閱讀 6272

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

先說普通的記憶體位址轉換,首先明確基本知識點。

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暫存器來重新整理

tlb,

vm在執行

invlpg

指令或重灌

cr3暫存器時將導致

vm exit

,使vmm

有機會根據

vm的頁表來修改影子頁表,從而修補這種不一致性。發現沒,其實影子頁表的修改還是通過vm頁表來作為參照的。

-------------對於a

位,只要

vmm不先於

vm建立線性位址到實體地址的對映關係,就可以確保捕獲客戶對記憶體的訪問,進而有機會確保影子頁表項和客戶頁表項在

a位上的一致

。因為,當客戶首次訪問某個線性位址時,由於影子頁表中沒有該線性位址到實體地址的對應關係,將導致一次頁面故障,

vmm可以捕獲該故障,在影子頁表中建立線性位址到實體地址的對應關係,並將客戶頁表中相應項的a位置

1。 對於

d位,vmm在影子頁表中建立線性位址到實體地址間的對映之初,可以將頁置為唯讀,這樣當

vm對該頁進行寫操作時,將導致頁面故障,使

vmm獲得控制,進而有機會確保影子頁表項和

vm頁表項在

d位上的一致。

ept由

vmm控制,並且僅在處理器工作於非根模式時才參與位址轉換。

採用ept

後,客戶在讀寫

cr3和執行

invlpg

指令時不會導致

vm exit

,並且由於客戶頁表結構自身導致的頁故障也不會導致

vm exit

,因此極大地提高了記憶體虛擬化的效率,簡化了記憶體虛擬化的實現。

KVM之EPT與影子頁表(七)

這部分其實是乙個很龐大的話題,它包括分段 分頁機制等,在不同架構 不同位址轉換機制下,位址轉換過程是不同的。本文的重點不在於這些複雜的分段分頁保護機制 保護模式 實模式等內容。主要著眼於以下幾個概念和問題 總的來說,實體地址用於訪問真實存在於記憶體空間中的內容 虛擬位址則是應用程式所能看到的位址資訊...

vmware的原理和影子頁表

vmware啟動的時候同時會有乙個vmware vmx啟動,二者通過pipe或者socket通訊,實際上,vmware只是乙個輸入 顯示客戶端,類似x伺服器,它一般在乙個視窗中執行乙個虛擬作業系統。真正工作的是vmware vmx這個程序,它和核心中monitor通訊完成虛擬作業系統的執行和資料向v...

核心頁表和程序頁表

初學核心時,經常被 核心頁表 和 程序頁表 搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係 核心頁表 程序頁表 每個程序自己的頁表,放在程序自身的頁目錄task struct.pgd中。在保護模式下,從硬體角度看,其執行的基本物件為 程序 或執行緒 而定址則依賴於 程序頁表 在程序排程而...