考虑到NVMe SSD是一个通用的PCI设备,VFIO的PCI设备实现层(vfio-pci模块)提供了和普通设备驱动类似的作用,可高效地穿过内核若干抽象层,在/dev/vfio目录下为设备所在的IOMMU group生成相关文件,继而将设备暴露出来。 UIO和VFIO两种方式各有优势,也在不断地完善和演进中。如果想要更安全可控地操作硬件设备,笔者推荐通过...
简单来说它主要是利用UIO/VFIO驱动把PCIe设备的相关信息,如配置空间和bar空间,通过/sys接口暴露出来,SPDK利用这些信息构建用户态的ctrlr来驱动这些设备,从而实现了用户态的驱动和zero copy。这些实现的前提需要用UIO/VFIO驱动替换device默认的驱动,这也是为什么在跑SPDK的case之前需运行spdk/scripte/setup.h,它的主要作...
自动根据系统当前环境执行配置: 1.分配内存大页; 2. 解绑设备传统驱动; 3. 改绑 UIO 或 VFIO 驱动;reset# 将 PCI 设备重新改绑回其原始驱动程序,同时也清理任何剩余的spdk文件/资源,对内存大页不做变动;cleanup# 清除SPDK应用程序退出后可能留在系统中的孤立文件status# 打印系统中所有兼容 SPDK 的设备状态 ...
Iommu.passthrough:如果 IOMMU 可用,SPDK 建议使用 vfio-pci 驱动程序。否则,请使用 uio_pci_generic 或 igb_uio。要使用 uio_pci_generic 或 igb_uio 驱动程序,应禁用 IOMMU 或将其设为直通模式。如果未设置 iommu.passthrough,vfio-pci 驱动程序将对 DMA 使用 I/O 虚拟地址 (IOVA)。这对于 IOMMU ...
在用户态,目前可以通过UIO(Userspace I/O)或VFIO(Virtual Function I/O)两种方式对硬件固态硬盘设备进行访问。 1)UIO 要在用户态实现设备驱动,主要需要解决以下两个问题。 ·如何访问设备的内存:Linux通过映射物理设备的内存到用户态来提供访问,但是这种方法会引入安全性和可靠性的问题。UIO通过限制不相关的物理设备...
2. 用户态IO: UIO/VFIO/mdev/DPDK/SPDK [1]是内核文档,[2]是一个VFIO、mdev和QEMU相关的论文。[3][4]是两个不错的说明博客。 2.1 UIO和VFIO UIO和VFIO都是用户态IO框架。VFIO较UIO更新,性能更好,更安全,这是因为VFIO利用了内核较新的IOMMU特性,从而安全地(隔离地)支持了UIO所不支持的DMA设备。
用户空间驱动程序利用 uio 或 vfio 中的功能将设备的 PCI BAR 映射到当前进程,从而允许驱动程序直接执行 MMIO。例如,SPDK NVMe 驱动程序映射 NVMe 设备的 BAR,然后按照 NVMe 规范初始化设备、创建队列对并最终发送 I/O。 ...
接下来,运行位于SPDK目录下的scripts/setup.sh脚本,将VMD设备(即RAID bus controller)的BDF绑定到uio_pci_generic或vfio-pci,通过PCI_WHITELIST参数来实现。绑定命令如下:$PCI_WHITELIST=”若要继续操作,请确保已正确绑定VMD设备到uio_pci_generic或vfio-pci,并使用PCI_WHITELIST参数进行指定。接下来,可以尝试...
According to the [SPDK System Configuration User Guide](https://spdk.io/doc/system_configuration.html), neither uio_pci_generic nor vfio_pci is universally suitable for all devices and environments. Therefore, the preflight installation enables both uio_pci_generic and vfio_pci kernel modules, al...