UIO & VFIO: DPDK实现PMD的基石

前言

写这篇只因为好奇PMD是如何实现在用户空间,所以只涉及表层和一点皮下知识,想深挖这两种技术还是看代码和其他文章吧。

UIO & VFIO

全称Userspace I/O和Virtual Function I/O;

这两种技术都是用于在用户空间完成对设备的操作和配置的,是DPDK实现PMD(Poll Mode Driver)的基石;

不过从UIO相对来说兼容性更差,有一些固有缺陷,新版本已经将igb_uio模块移到了其他Repo,这有具体细节。

然后细说一下:

UIO

题外话

这个2006年的邮件往来里面,Linus本人把UIO骂惨了,不知道后来UIO是怎么合到Linux里面的;

我理解比较准确的定义:UIO是Linux内核提供的用户态驱动框架,能够在用户空间运行设备驱动,无需重编内核,内核中只需维护一小块内核模块(与UIO交互的驱动)即可,下图是对比图,分别是传统驱动和UIO模式下的驱动;
UIO & VFIO: DPDK实现PMD的基石_第1张图片

UIO & VFIO: DPDK实现PMD的基石_第2张图片

大致的工作原理

首先UIO不可能自动把你的设备绑定,而是需要手动将设备绑定到uio_pci_generic或者igb_uio这类内核模块上(即上图FIGURE 2右上角与UIO交互的内核驱动),该内核模块会将UIO需要的信息上报给UIO,并做一些中断应答等操作;有了这些信息UIO就创建了UIO设备,通过/dev/uioX设备文件及一些sysfs文件将设备暴露出来,让用户空间能够对设备进行配置和操作;

UIO & VFIO: DPDK实现PMD的基石_第3张图片


和UIO交互的内核模块:Linux提供了uio_pci_generic模块,如果设备与其适配的话就可以直接用,将其绑定到指定设备上,只写用户空间的设备驱动即可;如果不适配或者需要自己实现了,也可以自己写一个内核模块(如DPDK的igb_uio);

这个内核模块要做的事情:

  • struct uio_info,该结构体用于告诉UIO框架你的驱动程序的细节,比如物理地址及大小、偏移量等,内核模块里面需要填充该结构体;
  • 应答或禁止中断;在其中添加中断处理程序(interrupt handler),这部分应该尽量少,如果不需要在中断后执行任何操作,则可以留空;
  • ……剩下的一知半解,有需要在这自己看吧:

所以我理解,把设备绑定到igb_uio这种用于与UIO交互的内核模块,UIO框架就能将该设备通过/dev/uioX以及其他sysfs文件暴露出去,接下来只需要在用户空间实现设备驱动:


用户空间的设备驱动要做的事:

  • 读取UIO的sysfs文件暴露出来的设备信息;

  • 通过mmap()将设备的内存映射到用户空间,对设备进行需要的初始化;

  • 等待中断或者干其他的;驱动可以通过read()访问/dev/uioX,在中断发生前read都会处于阻塞状态(block),以此来处理中断;

    这里的中断和内核模块中处理的中断有什么区别?

    我理解:设备的中断首先必须要在内核空间被应答(因为用户程序可能会被杀掉,导致设备中断无法被处理?)所以必须在内核模块中应答设备的中断,但是其余工作都交给用户空间处理;然后DPDK虽然使用的是Poll Mode Driver,轮询网卡收包,但对于其他中断还是需要被正确处理,所以还是得在内核模块中实现中断处理函数,并在用户空间对中断进行处理(这部分可以看一下DPDK PMD的中断处理函数在干啥)

以DPDK为例

DPDK可以使用Linux提供的uio_pci_generic模块绑定到指定网卡接口与UIO交互,此外DPDK还提供igb_uio用来绑定指定网卡接口与UIO交互;只不过从v20.02开始就默认把igb_uio disable了,20.11开始则是把igb_uio完全移到了另一个Repository,新版本中想用的话还得另外把源码下回来;

然后对照理解一下DPDK是怎么和UIO交互的;我们先要使用dpdk-devbind脚本来将igb_uio绑定网卡,如:

dpdk-devbind.py --bind=igb_uio eth1

这就是前面说的与UIO交互的内核模块,绑定以后,igb_uio就会将eth1详细信息上报给UIO框架,UIO得以通过/dev/uioX文件及其他sysfs文件将eth1暴露给用户空间,然后用户空间的PMD就能够对设备进行配置和操作;

VFIO

VFIO需要IOMMU的支持,这部分涉及的内容太多了……以后再看;

总之VFIO比UIO安全、快速、兼容性强,现在DPDK默认就是绑定vfio-pci模块到设备,通过VFIO将设备暴露给用户空间,让PMD得以控制设备;

喜欢给个三连呗,有错误或者问题还请指出,多谢[抱拳]

你可能感兴趣的:(linux,网络)