目录
DPDK是Intel公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案。主要技术有用户态、轮询取代中断、零拷贝,网卡RSS、访存DirectIO等。
一、主要特点
1、UIO (Linux Userspace I/O)
提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间的,减下了报文在用户空间和应用空间的多次拷贝。如图:DPDK绕过了Linux内核的网络驱动模块,直接从网络硬件到达用户空间,不需要进行频繁的内存拷贝和系统调用。
UIO技术工作原理图如下:
UIO是用户态的一种IO技术,是DPDK能够绕过内核协议栈,提供用户态PMD Driver支持的基础。DPDK架构在Linux内核中安装了IGB_UIO(igb_uio.ko和kni.ko.IGB_UIO)模块,以此借助UIO 技术来截获中断,并重设中断回调行为,从而绕过内核协议栈后续处理流程,并且IGB_UIO会在内核初始化的过程中将网卡硬件寄存器映射到用户态。
dpdk一般用的都是igb_uio驱动, 在系统加载igb_uio驱动后,每当有网卡和igb_uio驱动进行绑定时, 就会在/dev目录下创建一个uio设备,例如/dev/uio1。uio设备是一个接口层,用于将pci网卡的内存空间以及网卡的io空间暴露给应用层。通过这种方式,应用层访问uio设备就相当于访问网卡。具体来说,当有网卡和uio驱动绑定时,被内核加载的igb_uio驱动, 会将pci网卡的内存空间,io空间保存在uio目录下,例如/sys/class/uio/uio1/maps文件中,同时也会保存到pci设备目录下的uio文件中。这样应用层就可以访问这两个文件中的任意一个文件里面保存的地址空间,然后通过mmap将文件中保存网卡的物理内存映射成虚拟地址, 应用层访问这个虚拟地址空间就相当于访问pci设备。
1.1 为什么igb_uio驱动将PCI网卡的内存空间和I/O空间保存在两个地方
这两个位置分别用于不同目的
1)/sys/class/uio/uioX/maps 目录
目的:
这个目录下包含了 UIO 设备的内存映射信息,主要用于描述 UIO 驱动如何将设备的内存或 I/O 空间映射到用户空间。具体来说,它包括了设备的内存区域(如 BARs)以及它们的物理地址和虚拟地址映射。
功能:
maps 目录中的文件记录了与设备的内存空间相关的信息,包括起始地址、长度等。用户空间程序可以通过访问这些信息来获取设备的内存映射,进而进行直接的 I/O 操作。
2)/sys/bus/pci/devices/0000:xx:xx.x/uio 目录
目的:
这个目录下包含了与 PCI 设备相关的 UIO 信息,具体到每个 PCI 设备的 UIO 驱动绑定信息。这个位置显示了 UIO 驱动如何将设备与系统中的 PCI 子系统关联起来。
功能:
在这个目录下,你可以找到与 PCI 设备相关的 UIO 文件,这些文件包含了设备的标识、状态、以及 UIO 驱动的绑定信息等。
小结
将 UIO 驱动相关的信息分开存放在两个位置是为了清晰地分离设备内存映射和设备管理的信息。/sys/class/uio/uioX/maps 目录提供了详细的内存映射信息,方便用户空间程序进行 I/O 操作;而 /sys/bus/pci/devices/0000:xx:xx.x/uio 目录则提供了与 PCI 设备管理相关的 UIO 绑定信息,有助于系统进行设备管理和控制。这样的设计提高了系统的可维护性和管理效率
1.2 PMD用户态驱动是通过轮询的方式,直接从网卡收发报文,将内核旁路了,绕过了协议栈。那为什么还要实现uio
在 DPDK 的环境中,igb_uio 或类似的 UIO 驱动主要负责将硬件中断的信息传递到用户空间,但并不是所有的硬件中断处理都由用户态完成。
1)硬件中断的内核态处理:
大部分的硬件中断(例如网卡的接收和发送中断)仍然在内核态进行处理。内核态的 igb_uio 驱动负责将这些中断转换为适合用户空间程序处理的信号或事件。这个过程涉及到对硬件的低级操作,如读取硬件寄存器、处理中断请求等。
2)UIO 驱动注册的硬件中断:
igb_uio 驱动在内核态中处理与硬件的交互,并将特定的中断事件(如统计信息变化、硬件状态变化等)转换为用户空间的事件。为了使用户空间程序能够接收到这些中断事件,igb_uio 会通过 /dev/uioX 设备文件来通知用户空间。用户空间程序可以使用 epoll 等机制来监控这个设备文件,从而响应中断事件。
3)用户态处理:
一旦内核态驱动将中断信息传递到用户空间(例如,通过 /dev/uioX 设备文件),用户空间应用可以通过 epoll 等机制来监控这些事件。用户空间程序能够接收到这些事件后,可以进行进一步处理,例如获取网卡的状态信息、执行硬件中断次数的统计操作等。
小结
在 DPDK 环境中,尽管大部分数据处理是由用户态程序通过轮询完成的,但硬件中断的处理仍然需要内核态驱动来执行。UIO 驱动将硬件中断转换为用户空间可以处理的事件,并通过特定的设备文件(如 /dev/uioX)通知用户空间应用。这样,用户空间应用程序可以通过事件通知机制(如 epoll)来响应中断,并进行相应的处理,获得网卡状态等信息。这种方式结合了内核态的硬件管理和用户态的高效数据处理,实现了高性能的网络处理和有效的中断管理。
转载:DPDK介绍