赞
踩
作为一个通用半虚拟化框架,virtio技术能够应用到不同的体系架构中,并为各种业务类型提供服务。virtio协议支持基于多种类型设备总线进行实现,包括PCI、MMIO、channel IO等,同时也扩展实现了多种设备类型。
一个标准的virtio设备通常定义了以下几个部分的属性:
virtio驱动需要遵循标准定义的顺序来对virtio设备进行初始化,Device status field提供了特定的一些位,用于配合完成设备的初始化。
virtio设备使用Feature bits描述它所支持的所有功能,在设备初始化期间,驱动程序读取此信息,并选择需要的功能与设备进行协商。
Feature bits | 作用 |
---|---|
0~23 | 特定设备类型的Feature bits |
24~37 | 保留,用于队列和Feature协商机制的扩展 |
38及以上 | 保留,用于未来扩展的Feature bits |
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 |
在virtio协议规范中,约束了驱动程序如何初始化和配置一个virtio设备。
驱动必须遵循定义的顺序对设备进行初始化:
在通用服务器上,virtio设备主要基于PCI总线进行实现。基于PCI总线的virtio设备有着专属的Vendor ID(0x1AF4)和特定的Device ID区间(0x1000~0x107F),其中0x1000~0x103F用于传统模式设备,0x1040~0x107F用于现代模式设备。系统可以通过Vendor ID可以识别出virtio pci设备,而Device ID则可以用于指示该virtio pci设备支持的virtio设备类型。
virito使用PCI接口实现时,Hypervisor会在后端模拟一个PCI设备,并将这个设备添加到虚拟机配置中,虚拟机启动的时候会发现设备并接入到系统中。virtio-pci设备接入系统的拓扑关系如下:
为了支持PCI总线,每种virtio设备需要对应一个virtio-pci代理设备。virtio-pci代理设备能够通过与PCI设备相似的方式被虚拟机中的BIOS或客户机操作系统识别,并挂载到PCI总线。virtio-pci代理设备的一个重要作用是提供virtio设备的访问接口,它会创建一条virtio总线,并将virtio设备挂载到virtio总线,这样virtio驱动便能够访问virtio设备。
传统virtio-pci设备使用PCI设备的BAR0指向的IO区域来对virtio-pci设备进行配置。该IO区域包含一个virito-header结构,用于存放virtio设备的通用配置项以及设备的专属配置。下图展示了virtio-header中的通用配置项:
各个配置项的作用描述如下:
和传统设备固定使用BAR0不同,现代virtio-pci设备通过标准的PCI配置空间中的能力列表(capability list),可以指定配置信息的存储位置(使用哪个BAR,从BAR空间开始的偏移地址等)。1.0规范中定义了4种配置信息:通用配置、中断配置、通知配置、设备专属配置。相应的配置信息和内存区域的空间分布图如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。