解剖KVM的內部是如何運作的?

一、 KVM架構

kvm基本結構有2個部分構成:

kvm 驅動,現在已經是linux kernel的一個模塊了。其主要負責虛擬機的創建,虛擬內存的分配,VCPU寄存器的讀寫以及VCPU的運行。

另一個組成是Qemu,用於模擬虛擬機的用戶空間組件,提供I/O設備模型,訪問外設的途徑。


解剖KVM的內部是如何運作的?

圖1 kvm基本結構

kvm基本結構如上圖。kvm已經是內核模塊,被看作是一個標準的linux 字符集設備(/dev/kvm)。Qemu通過libkvm應用程序接口,用fd通過ioctl向設備驅動來發送創建,運行虛擬機命令。設備驅動kvm就會來解析命令(kvm_dev_ioctl函數在kvm_main.c文件中),如下圖:


解剖KVM的內部是如何運作的?

圖2 kvm_dev_ioctl函數

kvm 模塊讓Linux主機成為一個虛擬機監視器(VMM),並且在原有的Linux兩種執行模式基礎上,新增加了客戶模式,客戶模式擁有自己的內核模式和用戶模式。在虛擬機運行時,三種模式的工作各為:

客戶模式: 執行非I/O的客戶代碼,虛擬機運行在這個模式下。

用戶模式:代表用戶執行I/O指令,qemu運行在這個模式下。

內核模式:實現客戶模式的切換,處理因為I/O或者其他指令引起的從客戶模式退出(VM_EXIT)。kvm 模塊工作在這個模式下。

在kvm的模型中,每一個Gust OS都是作為一個標準的linux進程,都可以使用linux進程管理命令管理。

這裡假如qemu通過ioctl發出KVM_CREATE_VM 指令,創建了一個VM後,qemu需要需要發送一些命令給VM,如KVM_CREATE_VCPU。這些命令當然也是通過ioctl發送的,用戶程序中用ioctl發送KVM_CREATE_VM得到的返回值就是新創建的VM對應的fd(kvm_vm),fd是創建的指向特定虛擬機實例的文件描述符,之後利用這個fd發送命令給VM進行訪問控制。kvm解析這些命令的函數是kvm_vm_ioctl。

二、 KVM 工作原理

kvm基本工作原理概述:

用戶模式的qemu利用libkvm通過ioctl進入內核模式,kvm模塊為虛擬機創建虛擬內存,虛擬CPU後執行VMLAUCH指令進入客戶模式。加載Guest OS並執行。如果Guest OS 發生外部中斷或者影子頁表缺頁之類的情況,會暫停Guest OS的執行,退出客戶模式出行異常處理,之後重新進入客戶模式,執行客戶代碼。如果發生I/O事件或者信號隊列中有信號到達,就會進入用戶模式處理。(如下圖)


解剖KVM的內部是如何運作的?

圖3 KVM工作原理流程圖

——邁拓維矩


分享到:


相關文章: