接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录

本文参考以下文章:

VirtIO实现原理——PCI基础

VirtIO实现原理——virtblk设备初始化

特此致谢!

本文对于中移(苏州)软件技术有限公司面试问题中的“(1)virtio会创建哪些设备?”进行解答与解析。

要弄清楚并回答这个问题,首先得从virtio这个“根”上讲起。

传统的设备模拟中,虚拟机内部设备驱动完全不知道自己处在虚拟化环境中。对于网络和存储等设备,I/O操作会完整地走完“虚拟机内核栈->QEMU->宿主机内核栈”这一过程,会产生很多的VM Exit和VM Entry,因此性能很差。

以e1000网卡为例,在传统的全模拟方案下,虚拟机操作系统内核中的网卡驱动还是跟具体的硬件设备相同。也就是说,QEMU模拟的是e1000的网卡,虚拟机操作系统还是通过传统的方式进行收发包。e1000以及其它模拟设备网卡的驱动在进行收发包的时候,会有很多次的写网卡寄存器或IO端口的操作,这会导致大量的VM Exit,使得网卡的性能比较差。

virtio方案则是旨在提高性能的一种优化方案。在该方案中,虚拟机能够感知到自己处于虚拟化环境,并且会加载相应的virtio总线驱动virtio设备驱动

半虚拟化的基本原理如下图所示:

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1-LMLPHP

主要包括两部分的内容:一个是VMM创建出模拟的设备,即后端设备;另一个是虚拟机操作系统内部安装好该模拟设备的驱动,即前端驱动。在半虚拟化环境下,设备和驱动都是新的、专门用来适应虚拟化环境的。虚拟机中的设备驱动(前端驱动)与QEMU中的虚拟网卡设备(后端设备)定义一套自己的协议来进行数据传输,通过自己约定的接口,可以很方便地进行通信。virtio即是这样一种利用半虚拟化技术提供I/O性能的框架。

到这儿,就可以初步知道题目的意思了,所谓“virtio会创建哪些设备”主要指的是virtio后端设备都有哪些。具体的设备接下来就会讲到,这里先别着急,且容我慢慢道来。

先来介绍一下virtio框架,如下图所示:

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1-LMLPHP

virtio是一种前后端架构,包括前端驱动(Front-End Driver)后端设备(Back-End Device)、以及自身定义的传输协议。通过传输协议,virtio不仅可以用于QEMU/KVM方案,也可以用于其它的虚拟化方案。如虚拟机可以不必是QEMU,也可以是其它类型的虚拟机。后端不一定要在QEMU中实现,也可以在内核中实现(这实际上就是vhost方案)。接下来对这三个组件做简单介绍。

  • 前端驱动(Front-End Driver)

前端驱动为虚拟机内部的virtio模拟设备对应的驱动,每一种前端设备都需要有对应的驱动才能正常运行前端驱动的主要作用是接收用户态的请求;然后按照传输协议将这些请求进行封装;之后再写I/O端口;发送一个通知到QEMU的后端设备

  • 后端设备(Back-End Device)

后端设备则是在Host(QEMU)中,用来接收前端驱动发过来的I/O请求;然后从接受的数据中,按照传输协议的格式进行解析。对于网卡等需要实际物理设备交互的请求,后端驱动会对物理设备进行操作,从而完成请求;并且会通过中断机制通知前端驱动

  • virtio队列

virtio前端和后端驱动的数据传输通过virtio队列(virtio queue,virtqueue)完成一个设备会注册若干个virtio队列每个队列负责处理不同的数据传输,有的是控制层面的队列,有的是数据层面的队列。virtqueue是通过vring实现的。vring是虚拟机和QEMU之间共享的一段环形缓冲区。当虚拟机需要发送请求到QEMU的时候,就准备好数据,将数据描述放到vring中,写一个I/O端口然后QEMU就能够从vring中读取数据信息,进而从内存中读出数据。QEMU完成请求之后,也将数据结构存放在vring中,前端驱动也就可以从vring中得到数据了。vring的基本原理如下图所示:

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1-LMLPHP

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1-LMLPHP

vring包含三个部分

  • 第一部分是描述符表(Descriptor Table),用来描述I/O请求的传输数据信息,包括地址、长度等信息;
  • 第二部分是可用的vring(Available Vring),这是前端驱动设置的表示后端设备可用的描述符表中的索引
  • 第三部分是已经使用的vring(Used Vring),这是后端设备在使用完描述符表后设置的索引,这样前端驱动可以知道哪些描述符已经被用了。

至此,对于问题“virtio会创建哪些设备?”就有了初步答案。这个问题会转换为virtio后端设备都有哪些?根据上图可知,分为两大类设备virtio PCI控制设备virtio设备。具体来说,就是virtio-pci设备和具体的virtio设备,包括:

下一回对于细节进行讲解,在初步回答此面试问题的基础上,深入回答此问题。

01-26 01:16