接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录
本文参考以下文章:
特此致谢!
本文对于中移(苏州)软件技术有限公司面试问题中的“(1)virtio会创建哪些设备?”进行解答与解析。
要弄清楚并回答这个问题,首先得从virtio这个“根”上讲起。
传统的设备模拟中,虚拟机内部设备驱动完全不知道自己处在虚拟化环境中。对于网络和存储等设备,I/O操作会完整地走完“虚拟机内核栈->QEMU->宿主机内核栈”这一过程,会产生很多的VM Exit和VM Entry,因此性能很差。
以e1000网卡为例,在传统的全模拟方案下,虚拟机操作系统内核中的网卡驱动还是跟具体的硬件设备相同。也就是说,QEMU模拟的是e1000的网卡,虚拟机操作系统还是通过传统的方式进行收发包。e1000以及其它模拟设备网卡的驱动在进行收发包的时候,会有很多次的写网卡寄存器或IO端口的操作,这会导致大量的VM Exit,使得网卡的性能比较差。
virtio方案则是旨在提高性能的一种优化方案。在该方案中,虚拟机能够感知到自己处于虚拟化环境,并且会加载相应的virtio总线驱动和virtio设备驱动。
半虚拟化的基本原理如下图所示:
主要包括两部分的内容:一个是VMM创建出模拟的设备,即后端设备;另一个是虚拟机操作系统内部安装好该模拟设备的驱动,即前端驱动。在半虚拟化环境下,设备和驱动都是新的、专门用来适应虚拟化环境的。虚拟机中的设备驱动(前端驱动)与QEMU中的虚拟网卡设备(后端设备)定义一套自己的协议来进行数据传输,通过自己约定的接口,可以很方便地进行通信。virtio即是这样一种利用半虚拟化技术提供I/O性能的框架。
到这儿,就可以初步知道题目的意思了,所谓“virtio会创建哪些设备”主要指的是virtio后端设备都有哪些。具体的设备接下来就会讲到,这里先别着急,且容我慢慢道来。
先来介绍一下virtio框架,如下图所示:
virtio是一种前后端架构,包括前端驱动(Front-End Driver)和后端设备(Back-End Device)、以及自身定义的传输协议。通过传输协议,virtio不仅可以用于QEMU/KVM方案,也可以用于其它的虚拟化方案。如虚拟机可以不必是QEMU,也可以是其它类型的虚拟机。后端不一定要在QEMU中实现,也可以在内核中实现(这实际上就是vhost方案)。接下来对这三个组件做简单介绍。
前端驱动为虚拟机内部的virtio模拟设备对应的驱动,每一种前端设备都需要有对应的驱动才能正常运行。前端驱动的主要作用是接收用户态的请求;然后按照传输协议将这些请求进行封装;之后再写I/O端口;发送一个通知到QEMU的后端设备。
后端设备则是在Host(QEMU)中,用来接收前端驱动发过来的I/O请求;然后从接受的数据中,按照传输协议的格式进行解析。对于网卡等需要实际物理设备交互的请求,后端驱动会对物理设备进行操作,从而完成请求;并且会通过中断机制通知前端驱动。