内容提要
VFIO是Linux内核中的一个功能,可以将PCIe设备暴露给用户态程序,实现虚拟机PCIe直通。VFIO提供了一系列用户API,可以在用户态中直接控制PCIe设备。VFIO的用户API定义在include/uapi/linux/vfio.h中,通过ioctl调用来初始化VFIO设备。VFIO提供了访问Configuration空间和BAR空间、DMA映射、中断设置等功能。QEMU通过VFIO实现了PCIe设备直通,将VFIO设备挂载到虚拟PCIe总线上,并通过回调函数实现对BAR空间和Configuration空间的访问。VFIO还可以与DPDK框架一起使用,实现在用户态运行网卡驱动。与UIO驱动相比,VFIO处理了IOMMU映射,更安全可靠。
关键要点
-
VFIO是Linux内核中的功能,用于将PCIe设备暴露给用户态程序,实现虚拟机PCIe直通。
-
VFIO配置IOMMU以确保用户态程序无法通过设备的DMA访问其他地址空间的数据。
-
VFIO提供用户态API,允许直接控制PCIe设备,包括访问Configuration空间和BAR空间、DMA映射和中断设置。
-
VFIO的用户API定义在include/uapi/linux/vfio.h中,通过ioctl调用初始化VFIO设备。
-
VFIO支持与DPDK框架一起使用,实现在用户态运行网卡驱动。
-
VFIO处理IOMMU映射,相比UIO驱动更安全可靠。
-
IOMMU是硬件支持的,负责PCIe设备的地址转换,确保安全性。
-
VFIO设计了三个层级:Device(实际的PCIe设备)、Group(IOMMU隔离地址空间的粒度)、Container(方便同时操作多个Group)。
-
VFIO的初始化流程包括绑定vfio-pci设备、打开IOMMU Group和Device等步骤。
-
QEMU通过VFIO实现PCIe设备直通,使用-device vfio-pci命令添加直通设备。
-
在虚拟机中,QEMU通过回调函数访问BAR空间和Configuration空间。
-
VFIO的中断通过ioctl(VFIO_DEVICE_SET_IRQS)初始化,eventfd与中断绑定。
-
DPDK框架可以使用VFIO接管网卡,用户态运行网卡驱动。
-
UIO驱动不处理IOMMU映射,存在安全问题,使用时需关闭IOMMU。