分类: LINUX
2016-06-04 11:26:43
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-d或AMD IOMMU,通过硬件提供的虚拟化特性,可以实现IO设备的透传,使Guest可以共享或独占物理设备,由于相关功能主要在硬件层面实现,所以相比软件模拟的方式来说,有更好的性能。这里不做详细描述。
Virtio是KVM中的一套半虚拟化驱动,最初是从别的虚拟化方案(Rusty Russell的lguest)中移植过来的。通过Guest OS和KVM内核的配合,提供高效的通信方式,性能出众。在传统的KVM虚拟化解决方案中,需要对虚拟机提供一个完整的虚拟设备,Guest OS通过标准的IO接口对虚拟设备进行操作,由于IO操作是敏感指令,会导致VM-Exit,此时需要使用较多的指令去捕获IO请求,当IO繁忙时,VMX模式切换会非常频繁,效率很低;而virtio在设备模拟层引入了半虚拟化的方法,即在虚拟机和KVM中分别实现相应前后端virtio驱动,通过该驱动接口进行通信,效率更高。两种方式的对比如下图所示。
Virtio充分利用了全虚拟化和半虚拟化各自的优势,这种场景下,VM仍为全虚拟化虚拟机,这样可以充分利用硬件提供的虚拟化特性(如VT-x等),提供更好的虚拟化性能(比如CPU和内存的虚拟化),且Guest OS不需任何修改即可运行于虚拟化环境中;与此同时,virtio以半虚拟化驱动的形式,使前后端(VM和VMM)的通信更加高效,在全虚拟化环境中提供更高效的IO方式,提升IO性能。
基于virtio的驱动程序如下图所示。
KVM虚拟化环境中,每个虚拟机都是以系统进程方式运行的,virtio通信方式的实质是通过共享内存实现。
大致通信过程如下:
1. Virtio通过提供一个virt queue,将Guest OS的各种IO请求保存在其对应的缓冲区中;
2. 然后kick给VMM处理(一次可提交多个请求);
3. 最终会调用到Qemu-kvm的notify函数,通知Qemu-kvm;
Qemu-kvm在收到相应通知后,执行相应的操作。
本文非原创,尊重他人劳动成果,转载自:http://blog.chinaunix.net/xmlrpc.?r=blog/article&uid=14528823&id=4362390