一、 概述
KVM的全稱是Kernel-based Virtual Machine,其是一種基于linux內(nèi)核的采用硬件輔助虛擬化技術(shù)的全虛擬化解決方案。它最初由以色列的初創(chuàng)公司Qumranet開(kāi)發(fā),并在linux-2.6.20中開(kāi)始被納入在linux內(nèi)核,成為內(nèi)核源碼的一部分。KVM自誕生之初就定位于基于硬件輔助的虛擬化來(lái)提供全虛擬化的支持,其以內(nèi)核模塊的形式被加載。加載KVM模塊的linux內(nèi)核相當(dāng)于變成了一個(gè)Hypervisor,同時(shí)依賴linux內(nèi)核提供的各種功能來(lái)實(shí)現(xiàn)硬件管理,擁有極高的兼容性及可擴(kuò)展性。
上面提到KVM是作為一個(gè)內(nèi)核模塊出現(xiàn)的,所以它還得借助用戶空間的程序來(lái)和用戶進(jìn)行交互,這就不得不提到大名鼎鼎的QEMU了。QEMU是一套由法布里斯·貝拉(Fabrice Bellard)所編寫(xiě)的以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所示。
QEMU盡管非常的強(qiáng)大,但也正是應(yīng)為它的強(qiáng)大導(dǎo)致其對(duì)初學(xué)者非常的不友好。這里推薦大家剛開(kāi)始學(xué)習(xí)KVM時(shí)可以先學(xué)習(xí)kvm tool,這是一個(gè)基于C語(yǔ)言開(kāi)發(fā)的KVM虛擬化工具,其代碼非常精簡(jiǎn)易懂,同時(shí)也可以支持完整的linux虛擬化,非常適合初學(xué)者入門(mén)使用。其項(xiàng)目地址為https://github.com/kvmtool/kvmtool。
二、 ARM64虛擬化支持
arm最早在armv7-a引入硬件虛擬化支持。到了armv8中,arm拋棄了armv7時(shí)代的特權(quán)級(jí),引入了全新的Exception Level(EL),其如圖2所示(armv8.4-A引入了對(duì)安全世界虛擬化的支持)。
圖2
其中4個(gè)異常等級(jí)中的EL2留給Hypervisor用于各種虛擬化功能的訪問(wèn)及配置,如:stage 2轉(zhuǎn)換、EL1/EL0指令和寄存器訪問(wèn)、注入虛擬異常等。
三、 CPU虛擬化
CPU被稱為計(jì)算機(jī)的大腦,是計(jì)算機(jī)系統(tǒng)中最核心的模塊。在沒(méi)有CPU硬件虛擬化技術(shù)之前都是使用二進(jìn)制指令動(dòng)態(tài)翻譯技術(shù)來(lái)實(shí)現(xiàn)對(duì)客戶機(jī)操作系統(tǒng)中執(zhí)行的執(zhí)行(例如qemu的軟件虛擬化),其不僅實(shí)現(xiàn)復(fù)雜而且效率非常低下。因此硬件虛擬化技術(shù)應(yīng)運(yùn)而生,為KVM的誕生創(chuàng)造了必要的條件。
有時(shí)Hypervisor需要模擬一些操作,例如VM里運(yùn)行的軟件試圖配置處理器的一些屬性,如電源管理或是緩存一致性時(shí)。通常你不會(huì)允許VM直接配置這些屬性,因?yàn)檫@會(huì)打破隔離性,從而影響其他VMs。這就需要通過(guò)以陷入的方式產(chǎn)生異常,在異常處理程序中做相應(yīng)的模擬。armv8包含一些陷入控制來(lái)幫助實(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來(lái)說(shuō),如果讓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線程使用。
圖3
四、 內(nèi)存虛擬化
內(nèi)存虛擬化的目的是給虛擬客戶機(jī)操作系統(tǒng)提供一個(gè)從0開(kāi)始的連續(xù)的地址空間,同時(shí)在多個(gè)客戶機(jī)之間實(shí)現(xiàn)隔離與調(diào)度。
arm主要通過(guò)Stage 2轉(zhuǎn)換來(lái)提供對(duì)內(nèi)存虛擬化的支持,其允許Hypervisor控制虛擬機(jī)的內(nèi)存視圖,而在這之前則是使用及其復(fù)雜的影子頁(yè)表技術(shù)來(lái)實(shí)現(xiàn)。Stage 2轉(zhuǎn)換可以控制虛擬機(jī)是否可以訪問(wèn)特定的某一塊物理內(nèi)存,以及該內(nèi)存塊出現(xiàn)在虛擬機(jī)內(nèi)存空間的位置。這種能力對(duì)于虛擬機(jī)的隔離和沙箱功能來(lái)說(shuō)至關(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)了表里,而不是通過(guò)查詢MAIR_ELx寄存器。
圖4
五、 I/O虛擬化
I/O設(shè)備作為一種外部設(shè)備,其虛擬化的實(shí)現(xiàn)相較于前面的CPU虛擬化及內(nèi)存虛擬化有些不同,其目前主要有以下四種虛擬化方案。
1、 設(shè)備模擬:
在虛擬機(jī)監(jiān)控器中模擬具體的I/O設(shè)備的特性,例如qemu。在KVM和qemu的組合中通過(guò)Hypervisor捕獲Guest OS的I/O請(qǐng)求交給用戶空間的qemu進(jìn)行模擬,然后將結(jié)果再通過(guò)Hypervisor傳遞給Guest OS。這種方式能夠提供非常好的兼容性但是性能太差,同時(shí)模擬設(shè)備的功能特性支持不夠多。
2、 前后端驅(qū)動(dòng)接口
在Hypervisor和Guest OS之間定義一種權(quán)限的適用于虛擬機(jī)的交互接口,比如virtio技術(shù)。這個(gè)方案相較于設(shè)備模擬在性能上有所提高,但是兼容性較差,而且在高I/O負(fù)載場(chǎng)景,后端驅(qū)動(dòng)的CPU占用較高。
3、 設(shè)備直接分配
將一個(gè)物理設(shè)備直接分配給Guest OS使用。此方式的性能顯而易見(jiàn),要比上面兩種好很多,但是需要硬件設(shè)備支持,且無(wú)法共享和動(dòng)態(tài)遷移。
4、 設(shè)備共享分配
此方式是設(shè)備直接分配的一個(gè)擴(kuò)展,其主要就是讓一個(gè)物理設(shè)備可以支持多個(gè)虛擬機(jī)功能接口,將不同的接口地址獨(dú)立分配給不同的Guest OS使用。如SR-IOV協(xié)議。
參考文獻(xiàn):
1、《KVM實(shí)戰(zhàn):原理、進(jìn)階與性能調(diào)優(yōu)》
2、https://segmentfault.com/a/1190000022797518
3、https://www.cnblogs.com/LoyenWang/
編輯:jq
-
ARM
+關(guān)注
關(guān)注
134文章
9084瀏覽量
367381 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211578 -
KVM
+關(guān)注
關(guān)注
0文章
188瀏覽量
12947 -
驅(qū)動(dòng)接口
+關(guān)注
關(guān)注
0文章
10瀏覽量
2616
原文標(biāo)題:KVM原理簡(jiǎn)介
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論