新聞中心
解剖KVM的內(nèi)部是如何運(yùn)作的?
作者:佚名 2020-02-12 15:08:41
云計(jì)算
虛擬化 kvm已經(jīng)是內(nèi)核模塊,被看作是一個(gè)標(biāo)準(zhǔn)的linux 字符集設(shè)備(/dev/kvm)。Qemu通過(guò)libkvm應(yīng)用程序接口,用fd通過(guò)ioctl向設(shè)備驅(qū)動(dòng)來(lái)發(fā)送創(chuàng)建,運(yùn)行虛擬機(jī)命令。

一、 KVM架構(gòu)
kvm基本結(jié)構(gòu)有2個(gè)部分構(gòu)成:
kvm 驅(qū)動(dòng),現(xiàn)在已經(jīng)是linux kernel的一個(gè)模塊了。其主要負(fù)責(zé)虛擬機(jī)的創(chuàng)建,虛擬內(nèi)存的分配,VCPU寄存器的讀寫以及VCPU的運(yùn)行。
另一個(gè)組成是Qemu,用于模擬虛擬機(jī)的用戶空間組件,提供I/O設(shè)備模型,訪問(wèn)外設(shè)的途徑。
圖1 kvm基本結(jié)構(gòu)
kvm基本結(jié)構(gòu)如上圖。kvm已經(jīng)是內(nèi)核模塊,被看作是一個(gè)標(biāo)準(zhǔn)的linux 字符集設(shè)備(/dev/kvm)。Qemu通過(guò)libkvm應(yīng)用程序接口,用fd通過(guò)ioctl向設(shè)備驅(qū)動(dòng)來(lái)發(fā)送創(chuàng)建,運(yùn)行虛擬機(jī)命令。設(shè)備驅(qū)動(dòng)kvm就會(huì)來(lái)解析命令(kvm_dev_ioctl函數(shù)在kvm_main.c文件中),如下圖:
圖2 kvm_dev_ioctl函數(shù)
kvm 模塊讓Linux主機(jī)成為一個(gè)虛擬機(jī)監(jiān)視器(VMM),并且在原有的Linux兩種執(zhí)行模式基礎(chǔ)上,新增加了客戶模式,客戶模式擁有自己的內(nèi)核模式和用戶模式。在虛擬機(jī)運(yùn)行時(shí),三種模式的工作各為:
客戶模式: 執(zhí)行非I/O的客戶代碼,虛擬機(jī)運(yùn)行在這個(gè)模式下。
用戶模式:代表用戶執(zhí)行I/O指令,qemu運(yùn)行在這個(gè)模式下。
內(nèi)核模式:實(shí)現(xiàn)客戶模式的切換,處理因?yàn)镮/O或者其他指令引起的從客戶模式退出(VM_EXIT)。kvm 模塊工作在這個(gè)模式下。
在kvm的模型中,每一個(gè)Gust OS都是作為一個(gè)標(biāo)準(zhǔn)的linux進(jìn)程,都可以使用linux進(jìn)程管理命令管理。
這里假如qemu通過(guò)ioctl發(fā)出KVM_CREATE_VM 指令,創(chuàng)建了一個(gè)VM后,qemu需要需要發(fā)送一些命令給VM,如KVM_CREATE_VCPU。這些命令當(dāng)然也是通過(guò)ioctl發(fā)送的,用戶程序中用ioctl發(fā)送KVM_CREATE_VM得到的返回值就是新創(chuàng)建的VM對(duì)應(yīng)的fd(kvm_vm),fd是創(chuàng)建的指向特定虛擬機(jī)實(shí)例的文件描述符,之后利用這個(gè)fd發(fā)送命令給VM進(jìn)行訪問(wèn)控制。kvm解析這些命令的函數(shù)是kvm_vm_ioctl。
二、 KVM 工作原理
kvm基本工作原理概述:
用戶模式的qemu利用libkvm通過(guò)ioctl進(jìn)入內(nèi)核模式,kvm模塊為虛擬機(jī)創(chuàng)建虛擬內(nèi)存,虛擬CPU后執(zhí)行VMLAUCH指令進(jìn)入客戶模式。加載Guest OS并執(zhí)行。如果Guest OS 發(fā)生外部中斷或者影子頁(yè)表缺頁(yè)之類的情況,會(huì)暫停Guest OS的執(zhí)行,退出客戶模式出行異常處理,之后重新進(jìn)入客戶模式,執(zhí)行客戶代碼。如果發(fā)生I/O事件或者信號(hào)隊(duì)列中有信號(hào)到達(dá),就會(huì)進(jìn)入用戶模式處理。(如下圖)
圖3 KVM工作原理流程圖
本文名稱:解剖KVM的內(nèi)部是如何運(yùn)作的?
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/dhochjg.html


咨詢
建站咨詢
