1 基本概念
frontend:gpa地址
backend:hva地址
notify host:触发vmexit
desc table:类似于USB主机的TD传输描述符
2 Protocol
2.1 virtio0.95 - legacy
Legacy模式只使用了PCI的BAR0
Figure 2-1 BAR0指向的寄存器
2.2 virtio1.0
2.2.1 寄存器
#define VIRTIO_PCI_CAP_COMMON_CFG 1
#define VIRTIO_PCI_CAP_NOTIFY_CFG 2
#define VIRTIO_PCI_CAP_ISR_CFG 3
#define VIRTIO_PCI_CAP_DEVICE_CFG 4
#define VIRTIO_PCI_CAP_PCI_CFG 5
这5组寄存器对应到PCI的BAR1
2.2.2 协议描述
Figure 2-2 vring
Figure 2-3 工作原理
图片来自于:http://m.blog.chinaunix.net/uid-28541347-id-5819237.html
- virtio1.0,split模式,包括desc ring、avail ring、used ring
- avail ring,avail->idx 不是desc ring的idx,而是avail->ring的idx,对应的avail->ring[idx]最后一个后端可用的(对前端来说是下一个可用)desc chain的header idx。last_avail_idx也不是desc ring的idx,记录的也是avail->ring的idx,对应的avail->ring[idx]表示上一轮拷贝用到的最后一个desc chain的header idx(avail->ring[idx+1]为本轮拷贝可用的第一个desc chain的header idx)
- used ring,last_used_idx记录的也不是desc ring的idx,而是used->ring的idx,对应used->ring[idx]记录的是上一次后端已经处理好可以给前端释放(对于guest rx来说)的desc chain的header idx
2.3 virtio1.1
- virtio1.1,packed模式,将virtio1.0中的3个ring合成一个
2.4 每个协议版本使用哪个PCI BAR
在Linux上使用libpci库在用户空间解析PCI配置空间的前64个字节,就可以知道每个协议版本使用哪个BAR。
3 passthrough
3.1 Principle
- DMA重映射由IOMMU负责,根据物理BDF号;Guest中使用的BDF号是虚拟的,VMM负责两者之间的转换
- MMIO映射由EPT负责
- 中断虚拟化,VMM给每个vCPU虚拟一个LAPIC,同时VMM也负责物理LAPIC和虚拟LAPIC的转换;PCI/PCIe设备中断都是level触发;MSI中断绕过了IOAPIC而直接送达LAPIC
- passthrough的目标是实现vmexit-less
3.2 URLs
DevicePass-through及网卡的直接分配在Xen里面的实现
https://blog.csdn.net/ysbj123/article/details/52517333
4 URLs
Virtio Overview
https://kernelgo.org/virtio-overview.html
从dpdk1811看virtio1.1 的实现—packed ring
http://m.blog.chinaunix.net/uid-28541347-id-5819237.html
5 Abbreviations
fio:flexiable io