內存虛擬化的目標:
兩個:第一個是提供給虛擬機一個從零開始連續的物理內存空間;
第二個是對不同的虛擬機進行內存資源的共享和隔離。
至於內存虛擬化需要完成兩次轉換呀,客戶機維持前半部分,物理機維護後半部分,這都是基礎,先不說了。只說主要的,影子頁表。
影子頁表:
說的真的就像影子一樣,一直不太懂。該下狠心了....
首先明確幾個常識,這個影子頁表是被物理CPU裝載的。完成的是從VGA到HPA的直接轉換,一次性搞定。那麼這裏就必須VMM要對MMU進行虛擬化,客戶機看到和操作的都是虛擬MMU。
客戶機使用的頁表不是靜態的,客戶機也總在不停的修改客戶機頁表,在傳統的物理機上,刷新TLB有三種場合:寫CR3寄存器,調用INVLPG指令,然後就是操作系統修改部分頁表。
這樣當客戶機修改了客戶機虛擬地址到客戶機物理地址的內存映射關係後,爲了保證一致性,VMM必須對影子頁表做相應的維護。所以VMM必須要能截獲客戶機內存的訪問操作,截獲之後再對影子也表和客戶機頁表的修改。那麼這裏如何修改呢?
首先CR3的寫入和INVLPG都是屬於特權指令,這個可以自然地被VMM捕獲,比較複雜的就是客戶機操作系統修改客戶機頁表。
下面理清思緒: 這裏有兩個頁表,客戶機中的頁表,然後是影子頁表中,對於影子頁表項的訪問權限是隻讀的。任何寫頁表的操作都會引發異常,由VMM捕獲。然後在處理函數中,VMM除了代替客戶及更新頁表之外,還會更新影子頁表。所以影子頁表的建立和修改都是由VMM完成的,所以,VMM總是可以控制影子頁表的頁訪問權限,由此,VMM也總可以控制何時和怎樣截獲客戶機對客戶機頁表的修改。。。
還是不懂,普通的客戶機對頁表的修改,VMM爲什麼能截獲??? 誰能告訴...
這裏是說,每次客戶機去訪問頁表的時候都會嘗試去更改和影子頁表的映射關係,而這個更改時沒有權限的,所以會被VMM捕獲。 BING GO ,暫時這樣理解了。