全虛擬化影子頁面法
在沒有虛擬化的時候,進程在線性地址內存空間當中是以連續的頁框進行存在的,注意,它是一片連續的地址空間。線性地址內存空間是以連續的地址空間被進程使用,但是它的底層是真正的物理內存存儲單元,物理內存存儲單元並不是連續的空間,當內核掌控所有的硬件之間,內核就是在物理內存基礎上抽象出線性地址空間分配給進程使用,當然,在線性地址空間和物理內存之間是有對照關係的,有一種對應保存機制,保存了線性地址空間與物理內存的對應關係。
而用了虛擬化之後,OS也有自己的虛擬內存空間和物理內存空間,只不過是OS它自己不知道,它不知道不要緊,關鍵VMM得知道呀!不然OS也沒法工作,OS上的進程佔用的空間最終還是要落在真正物理機的內存當中的,這是怎麼實現的呢?VMM會把自己的內存空間一一映射到OS的物理內存空間當中,就像下圖:
VA虛擬機邏輯內存,OS進程使用的地址
PV虛擬機的物理內存
MA物理機的內存
VMM會把一一映射的對應關係對應起來,就是MV到PV的映射。
VMM爲每個OS都維護一個影子頁表,影子頁表維護虛擬地址(VA)到機器地址(MA)的映射關係,下面是關係圖:
當VMM捕獲到OS頁表修改後,VMM會查找負責PV到MA映射的P2M頁表或者哈希函數,找到與該PV對應的MA,再將MA填充到真正在硬件上起作用的影子頁表,從而形成VA到MA的映射關係,而OS的頁表無需變動。
半虛擬化頁表寫入法
影子頁面法是當OS發生寫入和讀取操作時被VMM察覺,OS認爲自己把數據寫入到了自己的內存了而實際上寫入的卻是物理機的內存,也就是在這一過程當中,OS是無感的。
而我們現在要講的頁表寫入法就類似於XEN的CPU虛擬化,實際上半虛擬擬的概念最早就是由思傑公司提出的,與CPU的虛擬化類似,也是需要改代碼,讓OS的做的“心裏有數”,讓其知道自己就是一個虛擬機,不要“妄想”自己是物理機,那麼頁表寫入法是怎樣實現的呢?
半虛擬化的方法是修改操作系統的代碼,剝奪了OS寫入內存權利,每當OS要寫入內存時,VMM會創建一個虛擬物理地址與物理機地址之間的映射對應表,一旦OS執行了對內存的敏感操作時,OS由於知道了自己是虛擬機,所以不會向自己的虛擬內存寫入數據,而是主動告訴VMM自己有數據要寫入,請VMM幫助把數據寫入到真正物理內存當中。
硬件輔助內存虛擬化
硬件輔助內存虛擬化採用intel的EPT技術實現虛擬化。
當OS對內存操作時就是直接對VMM的物理內存進行操作,無需VMM的幫忙,對應關係表直接存儲在CPU當中,效率爲所有的內存虛擬化之最,圖解如下: