Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46954
  • 博文数量: 11
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 55
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-19 20:34
个人简介

这家伙很懒,什么都没留下!

文章分类

全部博文(11)

文章存档

2016年(11)

我的朋友
最近访客

分类: LINUX

2016-06-04 11:26:43

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-d或AMD IOMMU,通过硬件提供的虚拟化特性,可以实现IO设备的透传,使Guest可以共享或独占物理设备,由于相关功能主要在硬件层面实现,所以相比软件模拟的方式来说,有更好的性能。这里不做详细描述。


2 Virtio

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

阅读(1841) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~