QEMU KVM核心虛擬化概述

2022-01-10 06:17:34 字數 2599 閱讀 3279

本文翻譯自

主要內容為qemu/kvm的記憶體虛擬化的架構描述(的梗概)。

由於linux核心的layz-mode得到策略, qemu/kvm會為guest分配虛擬記憶體空間,但直到訪問時,才真正分配物理空間。

以前(指使用shadow page table時),每當guest修改頁表, 必然會影響host. host會確認2點:

guest放到頁表中的entry是有效的

entry沒有訪問不被允許訪問的memory

為什麼會影響host呢? 有2方面的機制影響.

虛擬化硬體使用的頁表集和guest使用的頁表是分離的.首先guest在自己的頁表上做了修改,然後host發現了這個修改,確認該修改並在硬體訪問的真實頁表中做修改.guest不能直接訪問和操作真實頁表.這就是spt(shadow page table).

vmx/amd-v擴充套件允許當guest嘗試設定指向base page table(cr3)的指標時, 就trap(發生異常).

spt機制下,缺點在於:

每次訪問頁表都必須經歷guest+host都訪問的過程

guest訪問一次,host可能要訪問25次,成本極高

確認和維護spt成本非常高

amd和intel提出了ept/npt來解決這些問題(spt的缺點). ept/npt在硬體層面提供了一系列結構,能夠直接將gpa轉化成hpa,而不用經歷每次訪問頁表都必須guest+host訪問的過程.

問題在於, 如果host把我們使用的page table 交換出去了,我們必須更新ept/npt裡面的結構.

解決辦法是linux稱為mmu_notifier的東西. 在kernel釋放或交換出去這些記憶體之前,kvm/qemu guest會收到host的意圖通知. kvm/qemu guest會將即將被host使用的page從spt或ept結構中移除, 在guest做完移除工作之後, host就可以對這些page做它想做的操作了.

qemu呼叫malloc()並且為該page分配虛擬位址空間,但是沒有對應的物理空間.(也就是就分配了個名頭)

guest訪問了它認為是乙個實體地址的東西, 但是因為沒有分配對應的物理空間,traps into host

host kernel看到了乙個page fault, 對之前malloc()的區域呼叫do_page_fault()處理這個page fault,如果沒什麼問題,就分配一些memory給到該區域.

host kernel 建立了pte_t連線malloc()好的虛擬位址和分配的實體地址, 在pte_t中建立rmapentry, 把pte_t放到lru等

mmu_notifier和change_pte()被呼叫,允許kvm為新的page建立乙個ept entry

完成處理page fault,vmresume, guest繼續執行

如果host面臨memory壓力,會發生什麼情況呢?

上面提到的,之前分配給guest的物理page發現自己已經上了待退休名單, kernel決定該page下崗,接下來會發生:

host kernel使用rmap結構找出該物理page被對映到哪個vma(vm_area_struct)中去了

host kernel先尋找與該vma關聯的mm_struct,然後再遍歷linux page tables,尋找該page的host hardware page table entry(pte_t).

host kernel 將該page交換出去,並清除了pte_t, 但是,在釋放該page之前:

host kernle 呼叫了mmu_notifier invalidate_page().這倆東西尋找ept結構中的該page的entry,然後移除掉.

下次訪問該page時,就會到fault-in path中去.

某個時刻guest訪問某實體地址(它認為的) ==》 page fault ==》 trap into host ==》 為產生page fault的位址分配實際空間(fault-in path) ==》 回到guest繼續執行... 執行了一段時間 ==》 host的記憶體不夠用了,要收回之前分配給guest的記憶體 ==》 給guest乙個意圖通知 ==》 guest會意,將ept中的對映刪除 ==》 host收回之前分配的物理空間 ==> 某個時刻guest訪問某實體地址(它認為的)

qemu kvm記憶體虛擬化原理

guest physical address,gpa 客戶機實體地址 guest virtual address,gva 客戶機虛擬位址 host physical address,hpa 宿主機實體地址 host virtual address,hva 宿主機虛擬位址 客戶機實體地址 pb 表示 ...

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 和記憶...

Linux核心 虛擬檔案系統

1.虛擬檔案系統是核心子系統,為使用者空間的程式提供了檔案和檔案系統的介面 2.vfs使得使用者可以直接使用系統呼叫而無需考慮具體檔案系統和實際物理介質 3.vfs定義了所有檔案系統都支援的介面和資料結構,同時檔案系統也將自身的一些概念在形式上和vfs保持一致 4.其實在核心中,除了檔案系統本身,其...