KVM之EPT與影子頁表(七)

2021-10-24 03:49:57 字數 4116 閱讀 7742

這部分其實是乙個很龐大的話題,它包括分段、分頁機制等,在不同架構、不同位址轉換機制下,位址轉換過程是不同的。本文的重點不在於這些複雜的分段分頁保護機制、保護模式、實模式等內容。主要著眼於以下幾個概念和問題:

總的來說,實體地址用於訪問真實存在於記憶體空間中的內容;虛擬位址則是應用程式所能看到的位址資訊。在實際執行中需要將程序中的虛擬位址轉化為實體地址後,繼續之後的執行。

那麼實際操作過程中,是如何進行虛擬位址和實體地址的轉化呢?這就是接下來要介紹的mmu。

通過mmu來實現虛擬位址和實體地址的轉換

mmu(記憶體管理單元,memory management unit;又稱pmmu,分頁記憶體管理單元,paged memory management unit)。它的作用包括:

如下圖所示,沒有啟動或者沒有mmu時,外設(包括物理記憶體)等所有部件使用的都是實體地址,cpu通過實體地址來訪問外設(包括物理記憶體)。啟動mmu後,cpu核心對外發出虛擬位址給mmu,mmu把虛擬位址轉換為實體地址,最後使用實體地址讀取實際裝置

以二級頁表為例分析mmu的工作原理

以下圖32位cpu為例,線性位址32位。

外部傳入cr3暫存器的值,該值為存放頁目錄表頁面的實體地址,即下圖中第乙個表的基位址,該位址可以認為是位址對映的入口。

在整個過程中,需要外部輸入給mmu的內容有:cr3暫存器的值、程序需訪問的虛擬位址。

我被乙個問題困惑了很久:我們都買過手機或者pc,並且結合已知的虛擬位址和實體地址的概念,可以知道虛擬記憶體位址空間遠遠大於物理記憶體位址空間,而物理記憶體才是真正能被cpu訪問並取值的地方,那麼是否存在多個虛擬位址對映到乙個實體地址的情況呢?如果是這樣,cpu和作業系統又是怎麼解決這樣的衝突呢?畢竟不同的程序訪問相同的物理記憶體肯定是有內容上的衝突的。

虛擬記憶體的概念

虛擬記憶體,是指將記憶體中暫時不需要的部分寫入硬碟,看上去硬碟擴充套件了記憶體的容量,所以叫做「虛擬」記憶體。使用虛擬記憶體,應用程式可以使用比實際物理記憶體更大的記憶體空間。

頁面置換

基於上述的描述,我們可以知道:不是所有程序的虛擬頁面都會作為頁幀存在於物理記憶體中。並且虛擬頁只有載入到物理記憶體才可以被cpu訪問或讀寫。

假設某一時刻,物理記憶體頁幀已經被寫滿了,但這時又需要將乙個頁寫到物理記憶體中,就需要將原本在物理記憶體中的某一頁換出來。這個過程就叫做頁面置換。

有多種原因可能導致缺頁中斷,這裡只討論由於虛擬記憶體頁沒有被對映到物理記憶體或者被置換出的情況。

根據1.3可知,程序執行過程中,訪問的虛擬位址對應的虛擬頁可能不在物理記憶體中。這時該如何處理?

程序訪問的物理頁不在記憶體時如何處理

其中缺頁中斷處理函式的工作為:

缺頁中斷處理過程詳解 這篇文章可以再看一下。

最開始的時候使用者態物理記憶體為空,當不斷有程序開始執行時,就會開始訪問虛擬記憶體,由於此時的虛擬頁並沒有對映到物理頁幀,因此會觸發缺頁中斷,然後從物理頁中申請頁,並分配給虛擬頁,進而建立虛擬頁和物理頁幀之間的對映關係,同時填充頁表項。

和第一部分中linux物理機的記憶體對映機制不同,虛擬機器執行在vmm之上,虛擬機器可以認為是物理機的乙個程序在執行。因此可以認為虛擬機器將自己的虛擬位址分配給虛擬機器,虛擬機器將其作為實體地址使用。本文將主要介紹kvm框架下的虛擬機器的記憶體對映關係。

為了實現記憶體虛擬化,讓客戶機使用乙個隔離的、從零開始且具有連續的記憶體空間,kvm 引入一層新的位址空間,即客戶機實體地址空間 (guest physical address, gpa),這個位址空間並不是真正的實體地址空間,它只是宿主機虛擬位址空間在客戶機位址空間的乙個對映。

對客戶機來說,客戶機實體地址空間都是從零開始的連續位址空間。但對於宿主機來說,客戶機的實體地址空間並不一定是連續的,客戶機實體地址空間有可能對映在若干個不連續的宿主機位址區間。

由於客戶機實體地址不能直接用於宿主機物理 mmu 進行定址,所以需要把客戶機實體地址轉換成宿主機虛擬位址 (host virtual address, hva),為此,kvm 用乙個 kvm_memory_slot 資料結構來記錄每乙個位址區間的對映關係,此資料結構包含了:

實現記憶體虛擬化,最主要的是實現客戶機虛擬位址 (guest virtual address, **a) 到宿主機實體地址之間的轉換。

**a--

->hpa

從第二部分可以看到,客戶機虛擬位址(**a)到宿主機實體地址(hpa)的轉換需要分為三次,這會造成很大的效能開銷。影子頁表的提出實現了從**a到hpa的一次轉換。即下圖中,原始的kvm虛擬機器記憶體對映為該圖左側流程,影子頁表為該圖右側流程。

通過影子頁表進行定址的過程中,有兩種原因會引起影子頁表的缺頁異常:

另一種異常是由客戶機頁表和影子頁表不一致引起的異常。

由此可見,只要是缺頁異常,不論是由客戶機產生的還是vmm都會陷入到vmm進行處理。

影子頁表與客戶機頁表的關係

在影子頁表中,每個頁表項指向的都是宿主機的實體地址。這些表項是隨著客戶機作業系統對客戶機頁表的修改而相應地建立的。客戶機中的每乙個頁表項都有乙個影子頁表項與之相對應。

影子頁表與mmu的關係

影子頁表可被載入物理 mmu 為客戶機直接定址使用, 所以客戶機的大多數記憶體訪問都可以在沒有 kvm 介入的情況下正常執行,沒有額外的位址轉換開銷,也就大大提高了客戶機執行的效率。

此部分內容可以和1.5的過程模擬。

gpa--

->hpa

ept技術由以下兩部分組成,這兩部分都是由硬體自動完成的:

ept頁表實現從客戶機實體地址(gpa)到宿主機實體地址(hpa)的轉換,借助ept。

這裡值得說明的是,客戶機內部的缺頁異常不會致使客戶機退出,提高了客戶機執行的效能。

此部分內容可以和本文1.5、3.4過程模擬。

本部分從四個角度對影子頁表機制和ept機制進行對比:

實現方式複雜度

影子頁表基於軟體實現**a到hpa的的對映關係,客戶機頁表和和影子頁表的同步也比較複雜。ept基於硬體,將兩種位址轉換演算法都嵌入到mmu硬體單元中,實現方式簡化。

因此,ept機制實現過程更為簡化。

缺頁異常

影子頁表對於所有的缺頁異常(包括客戶機內部觸發缺頁異常、影子頁表與客戶機頁表不一致)都會觸發vm-exit,陷入到vmm中,由vmm判斷異常型別後再決定交由客戶機處理或由vmm處理。ept機制中,由於gpa到hpa轉化過程中產生的ept缺頁異常會導致vm-exit,陷入vmm;而對於客戶機自身產生的缺頁,則由客戶機自省處理。

因此,ept機制下,整個系統缺頁異常處理的效率更高。

記憶體消耗

影子頁表機制下,由於客戶機中每個程序都有自己的虛擬位址空間,所以 kvm 需要為客戶機中的每個程序頁表都要維護一套相應的影子頁表。ept維護的是虛擬機器實體地址(gpa)到宿主機實體地址(hpa)之間的對映關係,所以需要為每乙個虛擬機器維護一套ept頁表。。

因此,ept機制占用更小的記憶體資源。

執行效率

影子頁表實現一步轉化,並且影子頁表可以載入到mmu中,因此在執行過程中,只需要執行一次位址轉換就可以實現**a到hpa的轉換。ept頁表需要進行兩次位址轉換,先執行**a轉gpa,再執行gpa轉hpa。

因此,影子頁表具有更高的執行效率。

影子頁表和EPT

不得不承認,一直對影子頁表和ept技術都一知半解,是時候好好的認真的理解了。先說普通的記憶體位址轉換,首先明確基本知識點。tlb 就是儲存頁表中對應的線性位址和實體地址的轉換,這樣的作用是為了加速。所以說cpu並沒有說頁表一定要和tlb快取的資料保持一致,若不一致的時候,查詢tlb會引發 ltb m...

KVM的vMMU相關資料結構及其影子頁表關係分析

閱讀本文前,請先參閱文章 tdp page fault 函式解析之level,gfn變數的含義 依然感謝intel otc的 wufeng oenhan chenhe ruanshuai給予的幫助和支援 本文將會對kvm中虛擬mmu的的幾個關鍵成員含義進行分析。這系資料結構和影子頁表 spt 的關係...

vmware的原理和影子頁表

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