DPDK基础结构
1 mbuf
rte_mempool_objhdr rte_mbuf priv_data headroom data rte_mempool_objtlr
2 mempool
rte_mempool rte_mempool_cache … rte_mempool_cache priv_data
cache 块和 lcore 一一对应,减少alloc和free的冲突,提高效率
3 用户空间中断
事件驱动编程:基于epoll,监控uio/vfio设备文件。启动配置时,将网卡等硬件向量映射到对应的文件中(数据包到达,触发文件fd),此时epoll能监控到变化,进行收包。
epoll 了解
4 日志和调试
5 Linux和网卡的联系
/sys/devices/pci0000:00/0000:00:1c.5/0000:04:00.0/net/eth0 和 /sys/class/net/eth0/ 都是 Linux 系统中管理网络接口(如以太网卡)的两个关键路径。它们之间的联系如下:
/sys/devices/pci0000:00/0000:00:1c.5/0000:04:00.0/net/eth0:
这个路径下包含了一个特定物理设备(通常是 PCI 设备)的网络接口信息。具体来说,pci0000:00/0000:00:1c.5/0000:04:00.0 可能代表主板上的一个 PCI 插槽,其中的 net/eth0 则是表示在这个设备上的一个以太网接口(可能是第一个接口,名称为 eth0)。 /sys/class/net/eth0/:
这个路径是 Linux 网络设备类别的一部分。在这里,eth0 是一个符号链接,指向真正的网络接口设备信息,通常位于 /sys/devices/ 下对应设备路径的一个别名。 为什么不在 /dev 下呢?
/dev 目录主要用于存放设备文件,这些文件通常用于访问设备的底层功能和控制。物理网络接口通常不直接在 /dev 下表现为设备文件,因为它们的管理和配置更多地依赖于内核的网络子系统。 /sys 目录(包括 /sys/devices/ 和 /sys/class/net/)提供了更多详细的设备信息,包括设备的状态、统计、配置等,这些信息可以帮助系统管理员和开发人员更精细地管理网络接口和其他硬件设备。 综上所述,/sys/devices/pci0000:00/0000:00:1c.5/0000:04:00.0/net/eth0 提供了一个特定物理设备上网络接口的详细信息,而 /sys/class/net/eth0/ 则是对网络接口的抽象表示,帮助用户更方便地访问和管理这些接口。这种分离和抽象使得 Linux 能够更有效地管理复杂的硬件设备和网络接口。
6 DPDK结构走读
- 利用
struct rte_bus定义总线的功能,将常用的PCI BUS和VDEV BUS等,使用宏RTE_REGISTER_BUS注册到链表中,用于管理不同的总线。 - 启用设备时,对设备参数进行解析,利用
struct rte_devargs保存到链表中,后续使用。 - 使用总线的
scan方法,扫描对应设备的驱动,让其与设备对应。例如有rte_pci_scan和vdev_scan。其中 PCI 设备通常位于/sys/bus/pci/devices下,打开该目录后,pci_scan_one函数来读取该设备的配置等信息,加入到链表中。 - 利用
find_device获取步骤3.中的设备,使用plug启动。PCI 使用rte_pci_probe_one_driver来启动对应vendor/device ID的设备,调用probe函数。
6.1 DPDK 启动
所有的dpdk程序启动时,都需要通过rte_eal_init函数初始化环境,其中有多种参数可以进行配置,在版本21.11.*中,能通过路径open_source/dpdk/doc/guides/linux_gsg/eal_args.include.rst下的文档来进行查看。