KVM基本原理及架构五-IO虚拟化

2070阅读 0评论2014-08-06 tostick
分类:LINUX

KVM基本原理及架构五-IO虚拟化

5.1 基本原理

KVM虚拟化环境中,有两种IO虚拟化方式:纯软件方式(Qemu模拟)和基于硬件虚拟化特性的方式。

ü  纯软件方式是通过Qemu-kvm来模拟相应IO指令的方式,大致流程为:

1、    Guest OS执行IO相关指令时(敏感指令),触发VM-Exit

2、    VMM捕获VM-Exit,并从VMCS结构中获取相关信息;

3、    然后判断该指令模拟是否可在内核态处理;

4、    如果可以则在内核态完成处理;

5、    如果不行,则返回用户态,由Qemu-kvm模拟相关的IO请求

6、    完成后返回内核态;

7、    最后VM-Entry返回Guest OS继续执行。

ü  基于硬件虚拟化特性的方式,主要是依赖硬件的IO虚拟化特性,如Intel VT-dAMD IOMMU,通过硬件提供的虚拟化特性,可以实现IO设备的透传,使Guest可以共享或独占物理设备,由于相关功能主要在硬件层面实现,所以相比软件模拟的方式来说,有更好的性能。这里不做详细描述。

5.2 Virtio

VirtioKVM中的一套半虚拟化驱动,最初是从别的虚拟化方案(Rusty Russelllguest)中移植过来的。通过Guest OSKVM内核的配合,提供高效的通信方式,性能出众。在传统的KVM虚拟化解决方案中,需要对虚拟机提供一个完整的虚拟设备,Guest OS通过标准的IO接口对虚拟设备进行操作,由于IO操作是敏感指令,会导致VM-Exit,此时需要使用较多的指令去捕获IO请求,当IO繁忙时,VMX模式切换会非常频繁,效率很低;而virtio在设备模拟层引入了半虚拟化的方法,即在虚拟机和KVM中分别实现相应前后端virtio驱动,通过该驱动接口进行通信,效率更高。两种方式的对比如下图所示。


Virtio充分利用了全虚拟化和半虚拟化各自的优势,这种场景下,VM仍为全虚拟化虚拟机,这样可以充分利用硬件提供的虚拟化特性(VT-x),提供更好的虚拟化性能(比如CPU和内存的虚拟化),且Guest OS不需任何修改即可运行于虚拟化环境中;与此同时,virtio以半虚拟化驱动的形式,使前后端(VMVMM)的通信更加高效,在全虚拟化环境中提供更高效的IO方式,提升IO性能。

基于virtio的驱动程序架构如下图所示。


KVM虚拟化环境中,每个虚拟机都是以系统进程方式运行的,virtio通信方式的实质是通过共享内存实现。大致通信过程如下:

1、    Virtio通过提供一个virt queue,将Guest OS的各种IO请求保存在其对应的缓冲区中;

2、    然后kickVMM处理(一次可提交多个请求)

3、    最终会调用到Qemu-kvmnotify函数,通知Qemu-kvm;

Qemu-kvm在收到相应通知后,执行相应的操作。
上一篇:Virtio:针对 Linux 的 I/O 虚拟化框架
下一篇:linux内核更换