半虚拟化PCI virtio

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

发布了121 篇原创文章 · 获赞 47 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/zoosenpin/article/details/103106638