virtio技术(2)设备规范

概述

virtio协议定义了virtio通信遵循的接口,包含设备状态、设备支持的特性以及前后端数据传输的通道(virtqueue)。目前在使用的virtio规范有三个版本:0.95、1.0和1.1。0.95版本是目前广泛在使用的版本,称为传统模式;1.0版本中协议将设备的配置部分做了一些调整,被称为现代模式;1.1版本则主要是新增了packed virtqueue的支持。本文重点关注于virtio设备相关的规范定义。

virtio设备

virtio作为一个通用半虚拟化框架,可以在不同类型设备总线之上实现,包括PCI、MMIO、channel IO等。virtio协议规范的定义的virtio设备类型如下:

Virtio Device ID Virio Device Type
0 reserved(invalid)
1 network card
2 block device
3 console
4 entropy source
5 memory ballooning(traditional)
6 ioMemory
7 rpmsg
8 SCSI host
9 9P transport
10 mac80211 wlan
11 rproc serial
12 virtio CAIF
13 memory ballon
16 GPU device
17 Timer/Clock device
18 Input device

在此我们基于最普遍的PCI总线介绍virtio设备实现。基于PCI总线的virtio设备有着专属的Vendor ID(0x1AF4)和特定的Device ID区间(0x1000~0x107F),其中0x1000~0x103F用于传统模式设备,0x1040~0x107F用于现代模式设备。系统可以通过Vendor ID可以识别出virtio pci设备,而Device ID则可以用于指示该virtio pci设备支持的virtio设备类型。

virtio-pci设备发现

virito使用PCI接口实现时,Hypervisor会在后端模拟一个PCI设备,并将这个设备添加到虚拟机配置中,虚拟机启动的时候会发现设备并接入到系统中。virtio-pci设备接入系统的拓扑关系如下:
virtio技术(2)设备规范_第1张图片
为了支持PCI总线,每种virtio设备需要对应一个virtio-pci代理设备。virtio-pci代理设备能够通过与PCI设备相似的方式被虚拟机中的BIOS或客户机操作系统识别,并挂载到PCI总线。virtio-pci代理设备的一个重要作用是提供virtio设备的访问接口,它会创建一条virtio总线,并将virtio设备挂载到virtio总线,这样virtio驱动便能够访问virtio设备。

传统virtio-pci设备的配置空间

传统virtio-pci设备使用PCI设备的BAR0指向的IO区域来对virtio-pci设备进行配置。该IO区域包含一个virito-header结构,用于存放virtio设备的通用配置项以及设备的专属配置。下图展示了virtio-header中的通用配置项:
在这里插入图片描述
各个配置项的作用描述如下:

  • Device Features:由virtio设备填写,用于告诉驱动支持的设备特性;
  • Guest Features:用于告诉驱动支持的设备特性;
  • Queue Address:表示virtqueue所在的地址,这个地址由驱动分配,并告知设备;
  • Queue Size:表示virtqueue的描述符表中描述符的个数,设备端初始化队列时设置;
  • Queue Select:当某个操作是针对某个virtqueue时,驱动通过Queue Select指定这个virtqueue;
  • Queue Notify:当某个virtqueue准备好后,驱动需要通知设备进行消费,virtio协议采用的方式就是对某个约定地址进行IO,触发CPU从Guest切换到Host;
  • Device Status:用于表示设备的状态;
  • ISR Status:中断相关。

现代virtio-pci设备的配置空间

和传统设备固定使用BAR0不同,现代virtio-pci设备通过标准的PCI配置空间中的能力列表(capability list),可以指定配置信息的存储位置(使用哪个BAR,从BAR空间开始的偏移地址等)。1.0规范中定义了4种配置信息:通用配置、中断配置、通知配置、设备专属配置。相应的配置信息和内存区域的空间分布图如下:
virtio技术(2)设备规范_第2张图片

相关参考

  • 《深入浅出DPDK》
  • 《深入浅出系统虚拟化:原理与实践》
  • 《深度探索Linux系统虚拟化:原理与实现》

你可能感兴趣的:(虚拟化技术手札,网络,linux)