KVM原理簡(jiǎn)介
時(shí)間:2021-10-18 16:36:05
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]一、?概述KVM的全稱是Kernel-basedVirtualMachine,其是一種基于linux內(nèi)核的采用硬件輔助虛擬化技術(shù)的全虛擬化解決方案。它最初由以色列的初創(chuàng)公司Qumranet開發(fā),并在linux-2.6.20中開始被納入在linux內(nèi)核,成為內(nèi)核源碼的一部分。KVM...
上面提到KVM是作為一個(gè)內(nèi)核模塊出現(xiàn)的,所以它還得借助用戶空間的程序來和用戶進(jìn)行交互,這就不得不提到大名鼎鼎的QEMU了。QEMU是一套由法布里斯·貝拉(Fabrice Bellard)所編寫的以GPL許可證分發(fā)源碼的模擬處理器,在GNU/Linux平臺(tái)上使用廣泛。其本身是一個(gè)純軟件的支持CPU虛擬化、內(nèi)存虛擬化及I/O虛擬化等功能的用戶空間程序。其借助KVM提供的虛擬化支持可以將CPU、內(nèi)存等虛擬化工作交由KVM處理,自己則處理大多數(shù)I/O虛擬化的功能,可以實(shí)現(xiàn)極高的虛擬化效率。KVM及QEMU配合使用的整體接口如圖1所示。
有時(shí)Hypervisor需要模擬一些操作,例如VM里運(yùn)行的軟件試圖配置處理器的一些屬性,如電源管理或是緩存一致性時(shí)。通常你不會(huì)允許VM直接配置這些屬性,因?yàn)檫@會(huì)打破隔離性,從而影響其他VMs。這就需要通過以陷入的方式產(chǎn)生異常,在異常處理程序中做相應(yīng)的模擬。armv8包含一些陷入控制來幫助實(shí)現(xiàn)陷入(trapping) – 模擬(emulating)。如果對(duì)相應(yīng)操作配置了陷入,則這種操作發(fā)生時(shí)會(huì)陷入到更高的異常級(jí)別。
例如,正常我們?cè)趫?zhí)行WFI指令時(shí)會(huì)使CPU進(jìn)入一個(gè)低功耗的狀態(tài),但是對(duì)于HOST OS來說,如果讓CPU真正進(jìn)入低功耗狀態(tài),顯然會(huì)影響其他VM的運(yùn)行。如果我們配置了HCR_EL2.TWI==1時(shí),那么Guest OS在執(zhí)行WFI時(shí)就會(huì)觸發(fā)EL2的異常,然后陷入Hypervisor,那么此時(shí)Hypervisor就可以將對(duì)應(yīng)VCPU所處的線程調(diào)出出去,將CPU讓給其他的VCPU線程使用。
arm主要通過Stage 2轉(zhuǎn)換來提供對(duì)內(nèi)存虛擬化的支持,其允許Hypervisor控制虛擬機(jī)的內(nèi)存視圖,而在這之前則是使用及其復(fù)雜的影子頁(yè)表技術(shù)來實(shí)現(xiàn)。Stage 2轉(zhuǎn)換可以控制虛擬機(jī)是否可以訪問特定的某一塊物理內(nèi)存,以及該內(nèi)存塊出現(xiàn)在虛擬機(jī)內(nèi)存空間的位置。這種能力對(duì)于虛擬機(jī)的隔離和沙箱功能來說至關(guān)重要。這使得虛擬機(jī)只能看到分配給它自己的物理內(nèi)存。為了支持Stage 2 轉(zhuǎn)換, 需要增加一個(gè)頁(yè)表,我們稱之為Stage 2頁(yè)表。操作系統(tǒng)控制的頁(yè)表轉(zhuǎn)換稱之為stage 1轉(zhuǎn)換,負(fù)責(zé)將虛擬機(jī)視角的虛擬地址轉(zhuǎn)換為虛擬機(jī)視角的物理地址。而stage 2頁(yè)表由Hypervisor控制,負(fù)責(zé)將虛擬機(jī)視角的物理地址轉(zhuǎn)換為真實(shí)的物理地址。虛擬機(jī)視角的物理地址在Armv8中有特定的詞描述,叫中間物理地址(intermediate Physical Address, IPA)。
stage 2轉(zhuǎn)換表的格式和stage 1的類似,但也有些屬性的處理不太一樣,例如,判斷內(nèi)存類型 是normal 還是 device的信息被直接編碼進(jìn)了表里,而不是通過查詢MAIR_ELx寄存器。