vfio_iommu层面详解(vfio_iommu_type1.ko) 以下为container设置其vfio_iommu为type1时的实现,通过这段code可见核心实现最终会调到vfio_iommu_type1驱动中的vfio_iommu_type1_open( )和vfio_iommu_type1_attach_group( ) //举例ioctl(container, VFIO_SET_IOMMU, VFIO_TYPE1_IOMMU) vfio_ioctl_set_iommu //注...
用VFIO_SET_IOMMU绑定一种IOMMU实现层 打开/dev/vfio/N,得到IOMMU group文件描述符 用VFIO_GROUP_SET_CONTAINER将IOMMU group加入container 用VFIO_IOMMU_MAP_DMA将此IOMMU group的DMA地址映射至进程虚拟地址空间 逻辑 VFIO设备实现层与Linux设备模型紧密相连,当前,VFIO中仅有针对PCI的设备实现层(实现在vfio-pci模块中...
IOMMU是一个硬件单元,它可以把设备的IO地址映射成虚拟地址,为设备提供页表映射,设备通过IOMMU将数据直接DMA写到用户空间。 Device是指要操作的硬件设备,这里的设备需要从IOMMU拓扑的角度来看。如果device是一个硬件拓扑上是独立那么这个设备构成了一个IOMMU group。如果多个设备在硬件是互联的,需要相互访问数据,那么这些设...
基于这几点来看VFIO的DMA重映射就比较清晰,首先从VFIO设备的初始化开始,在获取设备信息之前会先获取到设备所属的group和Container,并调用VFIO_SET_IOMMU完成container和IOMMU的绑定,并attach由VFIO管理的所有设备。此外注意到这里的 pci_device_iommu_address_space 函数,意思是qemu为设备dma注册了一段专门的地址空间,这...
ioctl(container, VFIO_IOMMU_MAP_DMA, &dma_map); 很明显,这个概念空间包括container和group两个概念,vfio_container是访问的上下文,vfio_group是vfio对iommu_group的表述。 [vfio_iommu_type1.c] 1staticlongvfio_iommu_type1_ioctl(void*iommu_data,2unsignedintcmd, unsignedlongarg)3{4structvfio_iommu *iom...
structvfio_iommu_type1_dma_mapdma_map={ .argsz =sizeof(dma_map) }; structvfio_device_infodevice_info={ .argsz =sizeof(device_info) }; /* Create a new container */ container = open("/dev/vfio/vfio", O_RDWR); if(ioctl(container, VFIO_GET_API_VERSION) != VFIO_API_VERSION) ...
struct vfio_iommu_type1_dma_map map; uint32_t mask = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE; minsz = offsetofend(struct vfio_iommu_type1_dma_map, size); if (copy_from_user(&map, (void __user *)arg, minsz)) ...
右图是有IOMMU的情况,虚拟机可以将GPA直接写入到设备,当设备进行DMA传输时,设备请求地址GPA由IOMMU转换为HPA(硬件自动完成),进而DMA操作真实的物理空间。IOMMU的映射关系是由VMM维护的,HPA对虚机不可见,保障了安全问题,利用IOMMU可实现设备的透传。 1. 2. ...
int container, group, device, i;struct vfio_group_status group_status ={ .argsz = sizeof(group_status) };struct vfio_iommu_type1_info iommu_info = { .argsz = sizeof(iommu_info) };struct vfio_iommu_type1_dma_map dma_map = { .argsz = sizeof(dma_map) };struct vfio_device_info...
VFIO_IOMMU_MAP_DMA:指定设备端看到的IO地址到进程的虚拟地址之间的映射 第二个层面,group的操作是通过打开/dev/vifo/<group_id>文件, 对其执行ioctl操作,主要的操作有: VFIO_GROUP_GET_STATUS:获取group 的状态信息 VFIO_GROUP_SET_CONTAINER:设置group 和container 之间的绑定关系 ...