KVM原理与架构系列之五 IO虚拟化篇

IO虚拟化

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可以共享或独占物理设备,由于相关功能主要在硬件层面实现,所以相比软件模拟的方式来说,有更好的性能。这里不做详细描述。


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在收到相应通知后,执行相应的操作。


      本文非原创,尊重他人劳动成果,转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=14528823&id=4362390

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值