virtio基本原理(kvm半虚拟化驱动)

先来看下什么是彻底虚拟化和半虚拟化. 前端

彻底虚拟化:来宾操做系统运行在位于物理机器上的hypervisor之上.来宾操做系统并不知道它已被虚拟化,而且不须要任何更改就能够工做. 后端

半虚拟化:来宾操做系统不只知道它运行在hypervisor之上,还包括让来宾操做系统更高效地过分到hypervisor的代码 网络

在彻底虚拟化模式中,hypervisor必须模拟设备硬件,它是在会话的最低级别进行模拟的(例如:网络驱动程序,磁盘,显卡等等).尽管在该抽象中模拟很干净,但它同时也是最低效,最复杂的.在半虚拟化中,来宾操做系统和hypervisor可以共同合做,让模拟更加高效.缺点是操做系统知道它被虚拟化,而且须要修改才能工做. 性能

以上是彻底虚拟化和半虚拟化环境下的设备模拟 spa

左图在传统的彻底虚拟化环境中,hypervisor必须捕捉这些请求,而后模拟物理硬件的行为。尽管这也作提供很大的灵活性(即运行未更改的操做系统),但它的效率比较低. 操作系统

右图,半虚拟化,来宾操做系统知道它运行在hypervisor之上,并包含了充当当前的驱动程序.hypervisor为特定的设备模拟实现后端驱动程序.经过在这些前端和后端驱动程序中的virtio,为开发模拟设备提供标准化接口,从而增长代码的跨平台重用率并提升效率. 调试

咱们先来看下QUEM模拟I/O设备的基本原理和优缺点: orm

使用QEMU模拟I/O的状况下,当客户机中的设备驱动程序(device driver)发起I/O操做请求之时,KVM模块中的I/O操做捕获代码会拦截此次I/O请求,而后通过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序。QEMU模拟程序得到I/O操做的具体信息以后,交由硬件模拟代码来模拟出本次的I/O操做,完成以后,将结果放回到I/O共享页,并通知KVM模块中的I/O操做捕获代码。最后,由KVM模块中的捕获代码读取I/O共享页中的操做结果,并把结果返回到客户机中。固然,这个操做过程当中客户机做为一个QEMU进程在等待I/O时也可能被阻塞。另外,当客户机经过DMA(Direct Memory Access)访问大块I/O之时,QEMU模拟程序将不会把操做结果放到I/O共享页中,而是经过内存映射的方式将结果直接写到客户机的内存中去,而后经过KVM模块告诉客户机DMA操做已经完成。 视频

QEMU模拟I/O设备的方式,其优势是能够经过软件模拟出各类各样的硬件设备,包括一些不经常使用的或者很老很经典的设备(如4.5节中提到RTL8139的网卡),并且它不用修改客户机操做系统,就能够实现模拟设备在客户机中正常工做。在KVM客户机中使用这种方式,对于解决手上没有足够设备的软件开发及调试有很是大的好处。而它的缺点是,每次I/O操做的路径比较长,有较多的VMEntry、VMExit发生,须要屡次上下文切换(context switch),也须要屡次数据复制,因此它的性能较差。 接口


再来看看半虚拟化virtio的基本原理和优缺点

其中前端驱动(frondend,如virtio-blk、virtio-net等)是在客户机中存在的驱动程序模块,然后端处理程序(backend)是在QEMU中实现的。在这先后端驱动之间,还定义了两层来支持客户机与QEMU之间的通讯。其中,“virtio”这一层是虚拟队列接口,它在概念上将前端驱动程序附加到后端处理程序。一个前端驱动程序可使用0个或多个队列,具体数量取决于需求。例如,virtio-net网络驱动程序使用两个虚拟队列(一个用于接收,另外一个用于发送),而virtio-blk块驱动程序仅使用一个虚拟队列。虚拟队列实际上被实现为跨越客户机操做系统和hypervisor的衔接点,但它能够经过任意方式实现,前提是客户机操做系统和virtio后端程序都遵循必定的标准,以相互匹配的方式实现它。而virtio-ring实现了环形缓冲区(ring buffer),用于保存前端驱动和后端处理程序执行的信息,而且它能够一次性保存前端驱动的屡次I/O请求,而且交由后端去动去批量处理,最后实际调用宿主机中设备驱动实现物理上的I/O操做,这样作就能够根据约定实现批量处理而不是客户机中每次I/O请求都须要处理一次,从而提升客户机与hypervisor信息交换的效率。

Virtio半虚拟化驱动的方式,能够得到很好的I/O性能,其性能几乎能够达到和native(即:非虚拟化环境中的原生系统)差很少的I/O性能。因此,在使用KVM之时,若是宿主机内核和客户机都支持virtio的状况下,通常推荐使用virtio达到更好的性能。固然,virtio的也是有缺点的,它必需要客户机安装特定的Virtio驱动使其知道是运行在虚拟化环境中,且按照Virtio的规定格式进行数据传输,不过客户机中可能有一些老的Linux系统不支持virtio和主流的Windows系统须要安装特定的驱动才支持Virtio。不过,较新的一些Linux发行版(如RHEL 6.三、Fedora 17等)默认都将virtio相关驱动编译为模块,可直接做为客户机使用virtio,并且对于主流Windows系统都有对应的virtio驱动程序可供下载使用。


virtio是对半虚拟化hypervisor中的一组通用模拟设备的抽象.该设置还容许hypervisor导出一组通用的模拟设备,并经过一个通用的应用程序接口(API)让它们变得可用.有了半虚拟化hypervisor以后,来宾操做系统可以实现一组通用的接口,在一组后端驱动程序以后采用特定的设备模拟.后端驱动程序不须要是通用的,由于它们只实现前端所需的行为.

注意,在现实中(尽管不须要),设备模拟发生在使用 QEMU 的空间,所以后端驱动程序与 hypervisor 的用户空间交互,以经过 QEMU 为 I/O 提供便利。QEMU 是一个系统模拟器,它不只提供来宾操做系统虚拟化平台,还提供整个系统(PCI 主机控制器、磁盘、网络、视频硬件、USB 控制器和其余硬件元素)的模拟

相关文章
相关标签/搜索