guest physical address, gpa 客戶機實體地址
guest virtual address, gva 客戶機虛擬位址
host physical address, hpa 宿主機實體地址
host virtual address, hva 宿主機虛擬位址
客戶機實體地址(pb 表示 實體地址區間)
pb0 | pb1 | pb2 | .... | pbn
vb0 | vb1 | vb2 | .... | vbn
宿主機虛擬機器位址(vb 表示 虛擬機器位址區間)
上面的對映一定不是 pb0 == vb0 , pb1 == vb1 ..... pbn == vbn;他們之間有些是錯開對映的;
由於在訪問記憶體位址時,要進過mmu的對映,物理位址對映為匯流排上的位址(可以理解為記憶體卡上位址);客戶機裡的實體地址不能直接進行mmu對映使用,所以就必須把客戶機的物理位址對映為宿主機的實體地址,然後mmu訪問匯流排記憶體位址;
kvm 用乙個 kvm_memory_slot 資料結構來記錄每乙個位址區間的對映關係,此資料結構包含了對應此對映區間的起始客戶機頁幀號 (guest frame number, gfn),對映的記憶體頁數目以及起始宿主機虛擬位址。
首先根據客戶機實體地址找到對應的對映區間,然後根據此客戶機實體地址在此對映區間的偏移量就可以得到其對應的宿主機虛擬位址。進而再通過宿主機的頁表也可實現客戶機實體地址到宿主機實體地址之間的轉換,也即 gpa 到 hpa 的轉換。
根據上述客戶機實體地址到宿主機實體地址之間的轉換以及客戶機頁表,即可實現客戶機虛擬位址空間到客戶機實體地址空間之間的對映,也即 gva 到 hpa 的轉換。顯然通過這種對映方式,客戶機的每次記憶體訪問都需要 kvm 介入,並由軟體進行多次位址轉換,其效率是非常低的。
提供兩種方法來簡化這種低效的對映:
影子頁表:
首先根據客戶機頁表把客戶機虛擬位址轉傳成客戶機實體地址,然後再通過客戶機實體地址到宿主機虛擬位址之間的對映轉換成宿主機虛擬位址,最後再根據宿主機頁表把宿主機虛擬位址轉換成宿主機實體地址。而通過影子頁表,則可以實現客戶機虛擬位址到宿主機實體地址的直接轉換。
影子頁表簡化了位址轉換過程,實現了客戶機虛擬位址空間到宿主機實體地址空間的直接對映。但是由於客戶機中每個程序都有自己的虛擬位址空間,
所以 kvm 需要為客戶機中的每個程序頁表都要維護一套相應的影子頁表。在客戶機訪問記憶體時,真正被裝入宿主機 mmu 的是客戶機當前頁表所對應的影子頁表,從而實現了從客戶機虛擬位址到宿主機實體地址的直接轉換。而且,在 tlb 和cpu快取上快取的是來自影子頁表中客戶機虛擬位址和宿主機實體地址之間的對映,也因此提高了快取的效率。
為了快速檢索客戶機頁表所對應的的影子頁表,kvm 為每個客戶機都維護了乙個雜湊表,影子頁表和客戶機頁表通過此雜湊表進行對映。對於每乙個客戶機來說,客戶機的頁目錄和頁表都有唯一的客戶機實體地址,通過頁目錄 / 頁表的客戶機實體地址就可以在雜湊鍊錶中快速地找到對應的影子頁目錄 / 頁表。在檢索雜湊表時,kvm 把客戶機頁目錄 / 頁表的客戶機實體地址低 10 位作為鍵值進行索引,根據其鍵值定位到對應的鍊錶,然後遍歷此鍊錶找到對應的影子頁目錄 / 頁表。當然,如果不能發現對應的影子頁目錄 / 頁表,說明 kvm 還沒有為其建立,於是 kvm 就為其分配新的物理頁並加入此鍊錶,從而建立起客戶機頁目錄 / 頁表和對應的影子頁目錄 / 頁表之間的對映。當客戶機切換程序時,客戶機作業系統會把待切換程序的頁表基址載入 cr3而 kvm 將會截獲這一特權指令,進行新的處理,也即在雜湊表中找到與此頁表基址對應的影子頁表基址,載入客戶機 cr3,使客戶機在恢復執行時 cr3 實際指向的是新切換程序對應的影子頁表。
重點:
gva->gpa->kvm_memory_slot->hva->hpa
2、影子頁表:客戶機虛擬位址空間到宿主機實體地址空間的直接映;kvm 需要為客戶機中的每個程序頁表都要維護一套相應的影子頁表;在客戶機訪問記憶體時,真正被裝入宿主機 mmu 的是客戶機當前頁表所對應的影子頁表;
kvm 把客戶機頁目錄/頁表的客戶機實體地址低 10 位作為鍵值進行索引,根據其鍵值定位到對應的鍊錶,然後遍歷此鍊錶找到對應的影子頁目錄/頁表。
4、異常
如果該異常是由客戶機本身引起的,kvm 則直接把該異常交由客戶機的缺頁異常處理機制來進行處理。
如果該異常是由客戶機頁表和影子頁表不一致引起的,kvm 則根據客戶機頁表同步影子頁表。
雜湊表之所以用物理位址對映(到影子頁表是用虛擬機器位址的)是因為每個客戶機只有乙個雜湊表,而虛擬位址每個客戶機有多個程序對應的虛擬機器位址,也有多個影子表。而實體地址只有乙個;以通過實體地址唯一來對應雜湊表唯一,並且影子頁表也是通過cr3來確定唯一;
知識點:
tlb表,tlb:
QEMU KVM虛擬化 CPU管理
以下命令列親自執行有效,執行環境 compiled against library libvirt 4.5.0 using library libvirt 4.5.0 using api qemu 4.5.0 running hypervisor qemu 1.5.3 架構細節可檢視 cpu 和記憶...
QEMU KVM核心虛擬化概述
本文翻譯自 主要內容為qemu kvm的記憶體虛擬化的架構描述 的梗概 由於linux核心的layz mode得到策略,qemu kvm會為guest分配虛擬記憶體空間,但直到訪問時,才真正分配物理空間。以前 指使用shadow page table時 每當guest修改頁表,必然會影響host.h...
qemu kvm記憶體預留
功能 記憶體預留,顧名思義,將虛擬機器使用的內存在主機上預留出來,不讓其它記憶體使用,同時也禁止主機將記憶體交換到swap。記憶體預留的虛擬機器,使用的記憶體與正常虛機有三點不同 核心不會對這段記憶體執行頁 流程,因此如果虛擬機器程序不退出,這段記憶體永遠不會被釋放 記憶體一旦預留,核心將為虛機程序...