Vfio pci

VFIO(Virtual Function I/O)驱动框架是一个用户态驱动框架,在intel平台它充分利用了VT-d等技术提供的DMA Remapping和Interrupt Remapping特性, 在保证直通设备的DMA安全性同时可以达到接近物理设备的I/O的性能。VFIO是一个可以安全的把设备I/O、中断、DMA等暴露到用户空间,用户态进程可以直接使用VFIO驱动访问硬件,从而可以在用户空间完成设备驱动的框架。在内核源码附带的文档<>中对VFIO描述的相关概念有比较清楚的描述,也对VFIO的使用方法有清楚的描述。对于VT-d,DMAR 等硬件技术细节,可以参考VT-d的SPEC等文档,本文不对具体的物理硬件特性进行描述,涉及到相关部分只是做简单介绍。

框架图: 在VFIO驱动框架中,有几个核心概念需要理解。包括:IOMMU,device , group ,container。

IOMMU是一个硬件单元,它可以把设备的IO地址映射成虚拟地址,为设备提供页表映射,设备通过IOMMU将数据直接DMA写到用户空间。

Device 是指要操作的硬件设备,这里的设备需要从IOMMU拓扑的角度来看。如果device 是一个硬件拓扑上是独立那么这个设备构成了一个IOMMU group。如果多个设备在硬件是互联的,需要相互访问数据,那么这些设备需要放到一个IOMMU group 中隔离起来。

Group 是IOMMU 能进行DMA隔离的最小单元。一个group 可以有一个或者多个device。

container 是由多个group 组成。虽然group 是VFIO 的最小隔离单元,但是并不是最好的分割粒度,比如多个group 需要共享一个页表的时候。将多个group 组成一个container来提高系统的性能,也方便用户管理。一般一个进程作为一个container。

下图描述了device , group ,container和用户进程(app)的关系。