DPDK的VFIO
VFIO概述
VFIO是一种设备直通方案,可以在用户态直接通过VFIO驱动访问硬件。相比UIO,VFIO有IOMMU的保护,非特权用户也可以直接使用,还提供了更多的中断支持。
可以使用MMIO寄存器,通过PCI的配置空间来访问。
主要由3部分组成,group,device,iommu(对应container)。
vfio一般用于绑定VF,PF拥有完全的配置资源,可用于配置VF。图中的PF和所有VF共享PCIe端口的带宽.VF不支持IO空间,需要映射到系统内存。
VFIO会用到vfio-pci和vfio_iommu_type1_driver两个驱动.其中vfio-pci用于访问PCI设备。
一般使用VFIO时,主要是读取PCIe设备的配置空间和DMA信息。
Group
Group是IOMMU进行DMA隔离的最小单元。如果两个设备会找到同一个context entry和同一份页表,就属于同一个group,比如在PCIe-PCI桥下就属于同一个group。VFIO的group和iommu的group可以认为是同一个概念。
找到VF隶属的PCI总线
ethtool -i eth0vf0
bus-info: 0002:02:00.1
一般PF的function是0,所以第一个VF发function index从1开始。后续的VF的function index范围是0-7。
判断PCI地址属于哪个iommu的group
PCI地址的表示方式是Domain:Bus:Device:Function。
readlink /sys/bus/pci/devices/0002:02:00.1/iommu_group
../../../../../../../kernel/iommu_groups/66
看属于哪个设备
lspci -ns 0002:02:00.0
0002:02:00.0 0200: 177d:a063 (rev 50)
Device
Device是iommu拓扑角度理解的独立设备。看字符设备属于哪个用户和组。
ls -l /dev/vfio/90
crw------- 1 root root 247, 0 Aug 23 20:10 /dev/vfio/90
设备绑定
设备路径是/sys/bus/pci/devices/$dbdf,其中dbdf表示Domain, bus, device, function
绑定和解绑其实就是把驱动driver(igb_uio/vfio_pci)和dbdf写到PCI总线的文件里。
绑定:
echo $driver > /sys/bus/pci/devices/$dbdf/driver_override
echo $dbdf > /sys/bus/pci/drivers_probe
解绑:
echo $dbdf > /sys/bus/pci/drivers/$dbdf/driver/unbind
IOMMU
屏蔽物理地址,起保护作用。CPU通过MMU转换虚拟地址到物理地址. 设备通过IOMMU转换。
iova是设备发起DMA请求时要访问的地址.IOMMU会转为物理地址.VFIO_IOMMU_MAP_DMA命令把iova通过IOMMU映射到vaddr对应的物理地址.
IOMMU主要实现两个DMA和Interrupt的Remapping功能.
通过DMA Remapping为每个Domian建立独立的IOMMU Page Table,把DMA访问限制在Domain地址空间内。图示为支持DMA remapping的硬件实现地址空间上的隔离.
通过Interrupt Remapping来完成中断重映射和Interrupt Posting,实现中断隔离和中断直接投递。
将来自PCIe设备的中断拦截,是重映射查询中断映射表(Interrupt Remapping Table Entry)找到中断路由信息,然后发给物理CPU.
原文链接:https://mp.weixin.qq.com/s/uZNOhuF6v45Dah4Z65ZGBg
更多dpdk学习资料
DPDK 学习资料、教学视频和学习路线图 :https://space.bilibili.com/1600631218
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 学习地址: https://ke.qq.com/course/5066203?flowToken=1043799
DPDK开发学习资料、教学视频和学习路线图分享有需要的可以自行添加学习交流q 君羊909332607 获取