2018-12-06 19:47:25 +08:00

5.7 KiB
Raw Blame History

[Draft] Virtio

1、基本概念

Virtio 是一种标准虚拟化技术virtio 设备能够像普通设备那样被 Guest 系统枚举和使用。Virtio 设备具备以下特点:

  • 简单易开发virtio 设备使用通用的中断和 DMA 机制,对于设备驱动开发者来说不会带来困难。
  • 高效virtio 设备使用针对输入和输出使用不同的 vring规避了可能的由高速缓存带来的影响。
  • 标准virtio 不假定其所处的环境。
  • 可扩展virtio 设备包含一组 Feature Bits在设备安装过程中可以告知 guest OS。设备和驱动之间相互协调驱动可以根据设备提供的特性以及驱动自身能够支持的特性来最终确定在 guest OS 里面能够使用的设备特性。这样可以顾及到设备的前后兼容性。

每个 virtio 设备由以下 4 部分构成:

  • 设备状态域Device status field
  • 特征位Feature bits
  • 设备配置空间Device Configuration space
  • 一个或多个 Virtqueues

1.1 设备状态域

https://www.ibm.com/developerworks/cn/linux/1402_caobb_virtio/

https://www.ibm.com/developerworks/cn/linux/l-virtio/index.html

2、系统结构

3、Virtio 设备

3.1、Virtio 设备类型

主要分为 PCI 设备和非 PCI 的 mmio 设备。mmio 设备属于 Platform 设备,通过向 kernel 提供

virtio_mmio.device=<size>@<baseaddr>:<irq>[:<id>]

启动参数来让内核感知到设备存在,其中:

<size>      := size (can use standard suffixes like K, M and G)
<baseaddr>  := physical base address
<irq>       := interrupt number (as passed to request_irq())
<id>        := (optional) platform device id

使用 virtio mmio 内核参数的示例如下:

virtio_mmio.device=1K@0x100b0000:48:7

可以多次使用该内核参数来指定不同的 virtio mmio 设备。

非 mmio 设备有 Legacy 和 Modern 两种类型,这两种类型设备是通过 PCI 总线枚举而感知到虚拟设备存在的。如果在加载 virtio pci 设备模块时强制使用 Legacy 设备,则优先按 Legacy 设备进行加载,如果加载失败则按 Modern 设备加载。否则优先使用 Modern 设备加载。

Legacy 设备使用 CONFIGURATION ADDRESS0xCF8 和 CONFIGURATION DATA PORT0xCFC来进行设备访问CAMModern 设备使用 ENHANCED 方式进行设备访问ECAM。参见《PCI_Configuration_Register_Access》。

其他还有 virtio vop 设备和 virtio ccw 设备vop 设备指 Intel Virtio Over PCIe (VOP) driverccw 指 Concurrent I/O (CIO) 设备。virtio vop 和 virtio ccw 是分别属于这两种类型的 virtio 设备。

3.2、Virtio 设备 ID

virtio 设备的 Vendor ID 为 0x1AF4Subsystem device ID 如下:

Subsystem Device ID Virtio Device
1 Network card
2 Block device
3 Console
4 Entropy source
5 Memory ballooning
6 IoMemory
7 Rpmsg
8 SCSI host
9 9P transport
10 Mac80211 wlan

3.3、Virtio 设备的配置空间

需要使用 PCI 设备的第一块 I/O region 来对 PCI 设备进行配置。针对 virtio 设备来说,在 device 特定的配置区域后会有一块区域存放 virtio header(下表)。

Virtio MMIO Config Space
Offset Byte 0 Byte 1 Byte 2 Byte 3
0x000 Magic Value
0x004 Version
0x008 Device ID
0x00c Vendor ID
0x010 设备特征位 (R)
0x020 Guest 特征位 (RW)
0x030 Queue Address (RW)
0x034 Queue Size (R) Queue Select (RW)
0x050 Queue Notify (RW) 设备 Status (RW) ISR Status (R)
Offset+X+5 (如果使能了MSI-X) Configuration Vector (RW) Queue Vector (RW)
Offset+X+5/Offset+X+6(如果使能了MSI-X) 设备专属的 headers

Virtio PCI 配置空间如下:

Virtio PCI Config Space
Offset Byte 0 Byte 1 Byte 2 Byte 3
0x000 Vendor ID Device ID
0x008 REVID PROGIF Sub Class ID Class ID
0x02C Sub Vendor ID 0 Sub Device ID 0

4、Virtqueue

5、Network Device

6、Block Device

7、Console Device

8、Entropy Device

9、Traditional Memory Balloon Device

10、SCSI Host Device

11、Reserved Feature Bits

12、Creating New Device Types