Skip to the content.

vfio 基础

就是从这个项目开始了:

source tree 中的这个也是极好的: tools/testing/selftests/vfio/ ,这里也是带有一个驱动例子的

iova 的含义是什么?

vfio 使用也是如此:

/**
 * VFIO_IOMMU_MAP_DMA - _IOW(VFIO_TYPE, VFIO_BASE + 13, struct vfio_dma_map)
 *
 * Map process virtual addresses to IO virtual addresses using the
 * provided struct vfio_dma_map. Caller sets argsz. READ &/ WRITE required.
 *
 * If flags & VFIO_DMA_MAP_FLAG_VADDR, update the base vaddr for iova. The vaddr
 * must have previously been invalidated with VFIO_DMA_UNMAP_FLAG_VADDR.  To
 * maintain memory consistency within the user application, the updated vaddr
 * must address the same memory object as originally mapped.  Failure to do so
 * will result in user memory corruption and/or device misbehavior.  iova and
 * size must match those in the original MAP_DMA call.  Protection is not
 * changed, and the READ & WRITE flags must be 0.
 */
struct vfio_iommu_type1_dma_map {
	__u32	argsz;
	__u32	flags;
#define VFIO_DMA_MAP_FLAG_READ (1 << 0)		/* readable from device */
#define VFIO_DMA_MAP_FLAG_WRITE (1 << 1)	/* writable from device */
#define VFIO_DMA_MAP_FLAG_VADDR (1 << 2)
	__u64	vaddr;			/* Process virtual address */
	__u64	iova;				/* IO virtual address */
	__u64	size;				/* Size of mapping (bytes) */
};

看 qemu 的这个调用而已

vfio_legacy_dma_map

具体就不测试了,似乎这个是 qemu 特殊的需求,对于 dpdk 没有这种要求

iova : 实际上就是 gpa ,这个是和 PCIe 设备沟通使用的,通过 iommu 自动将 gpa 映射到物理地址上 同时提供 vaddr ,这个用于 hva -> gpa 。当 Guest os 和 PCI 设备沟通的时候,命令中 需要 iova ,实际上是 gpa 。设备获取到 iova ,HPA 。当 QEMU

所以,这里的关键,就是 iova 是 DMA command 中需要的。

iova 和 vaddr 是重复的吗?

有重复的,iova 可以通过 memslot 计算出来,但是 vfio 不是总是和 kvm 工作

iova 和 vaddr 如何和 dpdk 之类的设备工作的

很容易,让 iova 和 vaddr 相等,当提交命令的时候和数据拷贝始终都是 使用的 dpdk 的虚拟地址就可以了。

2026-02-14 似乎 6.19 内核开始出现这个报错 ?

似乎现在直通有 bug ?

static void vfio_device_error_append(VFIODevice *vbasedev, Error **errp)
{
    /*
     * MMIO region mapping failures are not fatal but in this case PCI
     * peer-to-peer transactions are broken.
     */
    if (vfio_pci_from_vfio_device(vbasedev)) {
        error_append_hint(errp, "%s: PCI peer-to-peer transactions "
                          "on BARs are not supported.\n", vbasedev->name);
    }
}

然后直接无法开机了:

qemu-system-x86_64: -device vfio-pci,host=0000:01:00.0: warning: VFIO dma-buf not supported in kernel: PCI BAR IOMMU mappings may fail

drivers/vfio/pci/vfio_pci_dmabuf.c 刚刚添加的问题,似乎是这个配置

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。