kvm(kernel virtual machine) , 作為開源的核心虛擬機器,越來越受到 ibm,redhat,hp,intel 等各大公司的大力支援,基於 kvm 的開源虛擬化生態系統也日益完善。而實現 kvm 虛擬化,使客戶機高效地、安全地使用宿主機的記憶體資源,就必須實現記憶體的虛擬化。
為了實現記憶體虛擬化,讓客戶機使用乙個隔離的、從零開始且具有連續的記憶體空間,kvm 引入一層新的位址空間,即客戶機實體地址空間 (guest physical address, gpa),這個位址空間並不是真正的實體地址空間,它只是宿主機虛擬位址空間在客戶機位址空間的乙個對映。對客戶機來說,客戶機實體地址空間都是從零開始的連續位址空間,但對於宿主機來說,客戶機的實體地址空間並不一定是連續的,客戶機實體地址空間有可能對映在若干個不連續的宿主機位址區間,如下圖 1 所示:
圖 1. 客戶機實體地址到宿主機虛擬位址的轉換
實現記憶體虛擬化,最主要的是實現客戶機虛擬位址 (guest virtual address, gva) 到宿主機實體地址之間的轉換。根據上述客戶機實體地址到宿主機實體地址之間的轉換以及客戶機頁表,即可實現客戶機虛擬位址空間到客戶機實體地址空間之間的對映,也即 gva 到 hpa 的轉換。顯然通過這種對映方式,客戶機的每次記憶體訪問都需要 kvm 介入,並由軟體進行多次位址轉換,其效率是非常低的。因此,為了提高 gva 到 hpa 轉換的效率,kvm 提供了兩種實現方式來進行客戶機虛擬位址到宿主機實體地址之間的直接轉換。其一是基於純軟體的實現方式,也即通過影子頁表 (shadow page table) 來實現客戶虛擬位址到宿主機實體地址之間的直接轉換。其二是基於硬體對虛擬化的支援,來實現兩者之間的轉換。下面就詳細闡述兩種方法在 kvm 上的具體實現。
回頁首由於宿主機 mmu 不能直接裝載客戶機的頁表來進行記憶體訪問,所以當客戶機訪問宿主機物理記憶體時,需要經過多次位址轉換。也即首先根據客戶機頁表把客戶機虛擬位址轉傳成客戶機實體地址,然後再通過客戶機實體地址到宿主機虛擬位址之間的對映轉換成宿主機虛擬位址,最後再根據宿主機頁表把宿主機虛擬位址轉換成宿主機實體地址。而通過影子頁表,則可以實現客戶機虛擬位址到宿主機實體地址的直接轉換。如下圖 2 所示:
圖 2. 客戶機實體地址到宿主機實體地址的轉換
在影子頁表中,每個頁表項指向的都是宿主機的實體地址。這些表項是隨著客戶機作業系統對客戶機頁表的修改而相應地建立的。客戶機中的每乙個頁表項都有乙個影子頁表項與之相對應。如下圖 3 所示:
圖 3. 客戶機頁表和影子頁表
影子頁表異常處理機制
在通過影子頁表進行定址的過程中,有兩種原因會引起影子頁表的缺頁異常,一種是由客戶機本身所引起的缺頁異常,具體來說就是客戶機所訪問的客戶機頁表項存在位 (present bit) 為 0,或者寫乙個唯讀的客戶機物理頁,再者所訪問的客戶機虛擬位址無效等。另一種異常是由客戶機頁表和影子頁表不一致引起的異常。
當缺頁異常發生時,kvm 首先截獲該異常,然後對發生異常的客戶機虛擬位址在客戶機頁表中所對應頁表項的訪問許可權進行檢查,並根據引起異常的錯誤碼,確定出此異常的原因,進行相應的處理。如果該異常是由客戶機本身引起的,kvm 則直接把該異常交由客戶機的缺頁異常處理機制來進行處理。如果該異常是由客戶機頁表和影子頁表不一致引起的,kvm 則根據客戶機頁表同步影子頁表。為此,kvm 要建立起相應的影子頁表資料結構,填充宿主機實體地址到影子頁表的頁表項,還要根據客戶機頁表項的訪問許可權修改影子頁表對應頁表項的訪問許可權。
由於影子頁表可被載入物理 mmu 為客戶機直接定址使用, 所以客戶機的大多數記憶體訪問都可以在沒有 kvm 介入的情況下正常執行,沒有額外的位址轉換開銷,也就大大提高了客戶機執行的效率。但是影子頁表的引入也意味著 kvm 需要為每個客戶機的每個程序的頁表都要維護一套相應的影子頁表,這會帶來較大記憶體上的額外開銷,此外,客戶機頁表和和影子頁表的同步也比較複雜。因此,intel 的 ept(extent page table) 技術和 amd 的 npt(nest page table) 技術都對記憶體虛擬化提供了硬體支援。這兩種技術原理類似,都是在硬體層面上實現客戶機虛擬位址到宿主機實體地址之間的轉換。下面就以 ept 為例分析一下 kvm 基於硬體輔助的記憶體虛擬化實現。
回頁首ept 技術在原有客戶機頁表對客戶機虛擬位址到客戶機物理位址對映的基礎上,又引入了 ept 頁表來實現客戶機實體地址到宿主機實體地址的另一次對映,這兩次位址對映都是由硬體自動完成。客戶機執行時,客戶機頁表被載入 cr3,而 ept 頁表被載入專門的 ept 頁表指標暫存器 eptp。ept 頁表對位址的對映機理與客戶機頁表對位址的對映機理相同,下圖 4 出示了乙個頁面大小為 4k 的對映過程:
圖 4.ept 頁表轉換
由此可以看出,ept 頁表相對於前述的影子頁表,其實現方式大大簡化。而且,由於客戶機內部的缺頁異常也不會致使客戶機退出,因此提高了客戶機執行的效能。此外,kvm 只需為每個客戶機維護一套 ept 頁表,也大大減少了記憶體的額外開銷。
KVM 記憶體虛擬化及其實現
為保證客戶機作業系統在虛擬環境下觀察到的記憶體空間布局與在實際物理機環境下相同,就必須對記憶體進行虛擬化。對於記憶體虛擬化,目前主要有兩種實現方法,其一是利用傳統的影子頁表進行虛擬化,其二就是通過硬體輔助進行實現。本文主要闡述了這兩種記憶體虛擬化方法在 kvm 上的具體實現。kvm kernel v...
KVM 記憶體虛擬化及其實現
kvm kernel virtual machine 作為開源的核心虛擬機器,越來越受到 ibm,redhat,hp,intel 等各大公司的大力支援,基於 kvm 的開源虛擬化生態系統也日益完善。而實現 kvm 虛擬化,使客戶機高效地 安全地使用宿主機的記憶體資源,就必須實現記憶體的虛擬化。為 了...
KVM 記憶體虛擬化及其實現
kvm kernel virtual machine 作為開源的核心虛擬機器,越來越受到 ibm,redhat,hp,intel 等各大公司的大力支援,基於 kvm 的開源虛擬化生態系統也日益完善。而實現 kvm 虛擬化,使客戶機高效地 安全地使用宿主機的記憶體資源,就必須實現記憶體的虛擬化。為了實...