KVM:Kernel-based Virtual Machine,是基於Linux內核的開源虛擬化解決方案,從2.6.20版本開始被合入kernel主分支維護。最初只支持X86平台的上支持VMX或者SVM的CPU,不久後被確認為標准Linux內核的虛擬化方案並逐步支持S390、IA64和PowerPC等體系架構;KVM本身只提供部分的虛擬化功能(虛擬CPU和內存),而由經過特殊改造後的Qemu(Qemu-kvm)來幫助下提供完整的平台虛擬化功能。
KVM依賴於x86硬件的虛擬化特性,提供全虛擬化的虛擬機,其基本思想是在Linux內核的基礎上添加虛擬機管理模塊,重用Linux內核中已完善和成熟的機制和模塊,比如進程調度、內存管理、IO管理等,使之成為一個可以支持運行虛擬機的Hypervisor。整體架構如下圖所示:
KVM是基於硬件輔助虛擬化技術(如Intel VT-x)的全虛擬化解決方案,如上圖所示,說明如下:
ü VMM(即KVM內核)運行於根模式下的Ring0;
ü 主機上的用戶態進程運行於根模式下的Ring3;
ü 虛擬機中的Kernel運行於非根模式下的Ring0;
ü 虛擬機中的用戶態進程運行於非根模式下的Ring3;
ü Qemu-kvm是KVM官方提供並維護的改進後的Qemu,針對KVM解決方案,將標准Qemu做了針對性的改造,使其具有更好的性能,並與KVM進行了完美的融合;
ü 一個VM(虛擬機)就是一個傳統的Linux進程,VM運行於Qemu-KVM進程的地址空間中;
ü VMM向上層提供/dev/kvm接口,/dev/kvm是一個標准的字符設備,通過ioctl接口控制;Qemu-kvm通過調用/dev/kvm設備的ioctl接口,對虛擬機進行相關控制,比如創建虛擬機、創建VCPU、運行虛擬機等;
ü 為提升KVM虛擬機中的IO性能,KVM還提供了Virtio驅動,相當於Xen環境中的半虛擬化驅動。
KVM運行的基本如下圖所示:
流程描述:
1、 運行在用戶態的Qemu-kvm通過ioctl系統調用操作/dev/kvm字符設備,創建VM和VCPU
2、 內核KVM模塊負責相關數據結構的創建即初始化,然後返回用戶態
3、 Qemu-kvm通過ioctl調用運行VCPU,即調度相應的VM運行
4、 內核進行相關處理後,執行VMLAUNCH指令,通過VM-Entry進入Guest OS運行,Guest OS運行於非根模式下。
5、 Guest OS執行相應的虛擬機代碼,非敏感指令可直接在物理CPU上運行
6、 當Guest OS中執行到敏感指令、發生外部中斷、或Guest OS發生內部異常時,將產生VM-Exit,並將相關信息記錄到VMCS結構中
7、 VM-Exit使CPU退回到根模式下,由VMM讀取VMCS結構判斷VM-Exit的原因
8、 如是IO操作或是其他外設指令,則返回到用戶態Qemu-kvm(即根模式下的Ring3),由Qemu-kvm完成對相關指令的模擬。
9、 如果不是,則由VMM自行處理
10、處理完成後,重新VM-entry進入到Guest OS運行。
KVM主要由3個內核模塊組成:
ü Kvm.ko
ü Kvm-intel.ko
ü Kvm-amd.ko
Kvm.ko是KVM的核心公共模塊,kvm-intel.ko和kvm-amd.ko分別是針對Intel和AMD平台架構的獨立模塊。在KVM核心公共模塊中,包含了IOMMU、中斷控制、KVM arch、設備管理等部分代碼,這些代碼構成了虛擬機管理的核心功能,從這些模塊的大致信息,也可以看出KVM自身並沒有實現一個完整的PC系統的虛擬化,而只是實現了最核心的CPU虛擬化、內存虛擬化和IO虛擬化等部分功能並向上層提供了相應的API,其余虛擬化和管理工作主要交給了Qemu-kvm負責。