內存虛擬化技術,具體的實現方法有哪兩種?
引入內存虛擬化技術后,內存系統中存在3種地址。
機器地址(Machine Address,MA):真實硬件的機器地址,在地址總線上可以見到的地址信號。
虛擬機物理地址(Guest Physical Address,GPA):經過VMM抽象后虛擬機看到的偽物理地址。
虛擬地址(Virtual Address,VA):Guest OS提供給其應用程序使用的線性地址空間。
虛擬地址到虛擬機物理地址的映射關系,記作g
虛擬機物理地址到機器地址的映射關系,記作f
操作系統的內存管理單元(Memory Management Unit,MMU)只能完成一次虛擬地址到物理地址的映射,但獲得的物理地址只是虛擬機物理地址而不是機器物理地址,所以需要VMM參與,以獲得總線上可以使用的機器地址為實現虛擬地址到機器地址的高效轉換,目前普遍采用的方法是由VMM根據映射f和g生成復合映射f·g并直接寫入MMU,具體的實現方法有兩種:
MMU半虛擬化(MMU Paravirtualization)
這種方式主要為Xen所用
主要原理是:當Guest OS創建新頁表時,VMM從維護的空閑內存中為其分配頁面并進行注冊,以后,Guest OS對該頁表的寫操作都會陷入VMM進行驗證和轉換;VMM檢查頁表中的每一項,確保它們只映射到屬于該虛擬機的機器頁面,而且不包含對頁表頁面的可寫映射;然后,VMM會根據其維護的映射關系f,將頁表項中的虛擬機物理地址替換為相應的機器地址;***把修改過的頁表載入MMU,MMU就可以根據修改過的頁表直接完成虛擬地址到機器地址的轉換。這種方式的本質是將映射關系f·g直接寫入Guest OS的頁表中,以替換原來的映射g。
影子頁表
全虛擬化使用影子頁表技術實現內存虛擬化。其與MMU半虛擬化不同的是,VMM為Guest OS的每個頁表維護一個影子頁表,并將f·g的映射關系寫入影子頁表,Guest OS的頁表內容保持不變,然后,VMM將影子頁表寫入MMU。
影子頁表的維護將帶來時間和空間上的較大開銷。時間開銷主要體現在Guest OS構造頁表時不會主動通知 VMM,VMM 必須等到Guest OS發生缺頁時才會分析缺頁原因再為其補全影子頁表。而空間的開銷主要體現在VMM需要支持多臺虛擬機同時運行,每臺虛擬機的 Guest OS 通常會為其上運行的每個進程創建一套頁表系統,因此影子頁表的空間開銷會隨著進程數量的增多而迅速增大。
影子頁表緩存
為權衡時間開銷和空間開銷,現在一般采用影子頁表緩存(Shadow Page Table Cache)技術,即VMM在內存中維護部分最近使用過的影子頁表,只有當影子頁表在緩存中找不到時,才構建一個新的影子頁表。當前主要的虛擬化技術都采用了影子頁表緩存技術。
虛擬機文件系統的虛擬化技術