DPDK的主要目标是为数据平面应用程序中的快速数据包处理提供一个简单、完整的框架。用户可以使用代码来理解所采用的一些技术,构建原型或添加自己的协议栈。可提供使用DPDK的替代生态系统选项。
DPDK框架通过创建环境抽象层(EAL)为特定环境创建一组库,EAL可能特定于英特尔体系结构(32位或64位)模式、Linux*用户空间编译器或特定平台。这些环境是通过使用介子文件和配置文件创建的。一旦创建了EAL库,用户就可以链接到该库来创建自己的应用程序。还提供了EAL之外的其他库,包括哈希、最长前缀匹配(LPM)和环库。提供的示例应用程序有助于向用户展示如何使用DPDK的各种功能。
DPDK为数据包处理实现了一个从运行到完成的模型,其中所有资源必须在调用数据平面应用程序之前分配,这些应用程序作为逻辑处理核心上的执行单元运行。该模型不支持调度程序,所有设备都通过轮询访问。不使用中断的主要原因是中断处理带来的性能开销。
除了运行到完成模型之外,还可以通过经由环在核心之间传递分组或消息来使用流水线模型。这允许分阶段执行工作,并且可以允许更有效地使用内核上的代码。
1.开发环境
DPDK项目安装需要Linux和相关的工具链,如一个或多个编译器、汇编程序、meson实用程序、编辑器和各种库来创建DPDK组件和库。
一旦为特定环境和体系结构创建了这些库,它们就可以用于创建用户的数据平面应用程序。
在为Linux用户空间创建应用程序时,将使用glibc库。
有关设置开发环境的信息,请参阅DPDK入门指南。
2.环境抽象层
环境抽象层(EAL)提供了一个通用接口,它对应用程序和库隐藏环境细节。EAL提供的服务包括:
DPDK装载和发射
支持多进程和多线程执行类型
核心亲和力/分配程序
系统内存分配/取消分配
原子/锁定操作
时间参考
PCI总线访问
跟踪和调试功能
CPU特征识别
中断处理
报警操作
内存管理(malloc)
EAL在环境抽象层中有充分的描述。
3.核心组件
核心组件是一组库,提供高性能数据包处理应用程序所需的所有元素。
3.1环形管理器(librte_Ring)
环形结构在有限大小的表中提供了一个无锁的多生产者、多消费者FIFO API。与无锁定队列相比,它具有一些优势;更易于实现,适用于批量操作且速度更快。环由内存池管理器(librte_mempool)使用,并且可以用作逻辑核上连接在一起的核和/或执行块之间的通用通信机制。
这个环形缓冲区及其用法在环形库中有详细描述。
3.2内存池管理器(librte_mempool)
内存池管理器负责分配内存中的对象池。池由名称标识,并使用环来存储空闲对象。它提供了一些其他可选服务,如每个核心对象缓存和对齐帮助程序,以确保对象被填充,从而在所有RAM通道上均匀分布。
这个内存池分配器在Mempool Library中有描述。
3.3网络数据包缓冲区管理(librte_mbuf)
mbuf库提供了创建和销毁缓冲区的功能,DPDK应用程序可以使用这些缓冲区来存储消息缓冲区。消息缓冲区在启动时创建,并使用DPDK内存池库存储在内存池中。
这个库提供了一个API来分配/释放mbufs,操作用于承载网络数据包的数据包缓冲区。
网络数据包缓冲区管理在Mbuf库中进行了描述。
3.4计时器管理器(librte_Timer)
此库为DPDK执行单元提供计时器服务,提供异步执行函数的能力。它可以是周期性的函数调用,也可以只是一次调用。它使用环境抽象层(EAL)提供的定时器接口来获得精确的时间参考,并且可以根据需要在每个核心的基础上启动。
Timer library中提供了库文档。
3.5以太网轮询模式驱动程序体系结构
DPDK包括用于1GbE、10GbE和40GbE的轮询模式驱动程序(PMD),以及半虚拟化的virtio以太网控制器,这些控制器设计为在没有异步、基于中断的信令机制的情况下工作。
请参阅轮询模式驱动程序。
3.6支持数据包转发算法
DPDK包括散列(librte_Hash)和最长前缀匹配(LPM,librte_LPM)库,以支持相应的数据包转发算法。
有关详细信息,请参阅哈希库和LPM库。
3.7librte_net
librte_net库是IP协议定义和方便宏的集合。它基于FreeBSD*IP堆栈中的代码,包含协议号(用于IP标头)、与IP相关的宏、IPv4/IPv6标头结构以及TCP、UDP和SCTP标头结构。
4.源码组织
4.1库
库位于dpdk/lib的子目录中。按照惯例,库是指为应用程序提供API的任何代码。通常,它会生成一个归档文件(.a),但内核模块也会位于同一目录中。
4.2驱动程序
驱动程序是为设备(硬件设备或伪/虚拟设备)提供轮询模式驱动程序实现的特殊库。它们包含在drivers子目录中,按类型进行分类,并各自编译为librte_X_Y.a格式的库,其中X是设备类名,Y是驱动程序名。
注意
几个driver/net目录包含一个子目录。基本目录通常包含不应由用户直接修改的代码。任何增强都应该通过该目录中的X_osdep.c和/或X_osdep.h文件来完成。请参阅基本目录中的本地自述文件