DPDK Programmer’s Guide(2)概述

官方文档查看地址:
http://doc.dpdk.org/guides/prog_guide/overview.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-programmers-guide.html
2. 概述

本节将全面概述数据平面开发工具包(DPDK)的体系结构。

DPDK的主要目标是为数据平面应用程序中的快速数据包处理提供一个简单、完整的框架。用户可以使用这些代码来理解所使用的一些技术、构建原型或添加自己的协议栈。使用DPDK的其他生态系统选项是可用的。

该框架通过创建环境抽象层(EAL)为特定环境创建了一组库,该抽象层可能特定于Intel®体系结构(32位或64位)、Linux*用户空间编译器或特定平台的模式。这些环境是通过使用make文件和配置文件创建的。创建EAL库之后,用户可以链接到这个库来创建自己的应用程序。除了EAL之外,还提供了其他库,包括散列、最长前缀匹配(LPM)环库(Hash, Longest Prefix Match (LPM) and rings libraries)。本文提供了示例应用程序,帮助用户了解如何使用DPDK的各种特性。

DPDK实现了包处理的run to completion模型,其中所有资源必须在调用数据平面应用程序之前分配,作为逻辑处理核心上的执行单元运行。该模型不支持调度程序,所有设备都通过轮询访问。不使用中断的主要原因是中断处理带来性能开销

除了run-to-completion模型之外,还可以通过环(ring)在CPU核之间传递包或消息来使用管道(pipeline)模型。这允许分阶段执行工作,并可能允许更有效地使用CPU核上的代码。

2.1开发环境

DPDK项目安装需要Linux和相关的工具链,例如一个或多个编译器、汇编器、make实用程序、编辑器和各种库来创建DPDK组件和库。

一旦为特定的环境和体系结构创建了这些库,就可以使用它们创建用户的数据平面应用程序。

当为Linux用户空间创建应用程序时,使用glibc库。对于DPDK应用程序,在编译应用程序之前必须配置两个环境变量(RTE_SDKRTE_TARGET)。以下是如何设置变量的例子:

export RTE_SDK=/home/user/DPDK
export RTE_TARGET=x86_64-native-linux-gcc

有关设置开发环境的信息,请参阅DPDK入门指南(DPDK Getting Started Guide)。

2.2环境抽象层

环境抽象层(EAL)提供了一个通用接口,它向应用程序和库隐藏环境细节。EAL提供的服务包括:

  • DPDK loading and launching(加载和启动DPDK)
  • Support for multi-process and multi-thread execution types(支持多进程和多线程执行类型)
  • Core affinity/assignment procedures(核心亲和力/作业程序)
  • System memory allocation/de-allocation(系统内存分配/释放)
  • Atomic/lock operations(原子/锁操作)
  • Time reference(时间参考)
  • PCI bus access(PCI总线访问)
  • Trace and debug functions(跟踪和调试功能)
  • CPU feature identification(CPU功能鉴定)
  • Interrupt handling(中断处理)
  • Alarm operations(报警操作)
  • Memory management (malloc)(内存管理(malloc))

在环境抽象层(Environment Abstraction Layer)中对EAL进行了全面的描述。

2.3核心组件

核心组件是一组库,提供高性能包处理应用程序所需的所有元素。

在这里插入图片描述
rte_timer:计时器设施。基于EAL提供的HPET接口。
rte_malloc:使用libc的malloc()分配命名内存zones。
rte_mempool:处理一个对象池通过使用一个环来来存储它们。允许批量入/出队列和每个cpu缓存。
rte_mbuf:对承载网络数据的包缓冲区的操作。
rte_ring:固定大小的无锁FIFO,用于在表中存储对象。
rte_debug:提供调试助手
rte_eal + libc:环境抽象层:RTE加载、内存分配、时间引用、PCI访问、日志记录。

2.3.1环管理器(librte_ring)
环形结构在一个有限大小的表中提供了一个无锁的多生产者、多消费者FIFO API。它比无锁队列有一些优势;易于实现,适应批量操作,速度更快。内存池管理器(librte_mempool)使用一个环,它可以用作逻辑CPU核心上连接在一起的核心和/或执行块之间的通用通信机制

这个环缓冲区及其用法在环库( Ring Library)中有详细的描述。

2.3.2内存池管理器(librte_mempool)
内存池管理器负责分配内存中的对象池。池按名称标识,并使用一个环存储空闲对象。它还提供了一些其他可选服务,比如每个核心对象缓存和对齐帮助器,以确保填充对象以使它们在所有RAM通道上均匀分布。

这个内存池分配器在Mempool库中描述。

2.3.3网络包缓冲区管理(librte_mbuf)
mbuf库提供了创建和销毁DPDK应用程序可能用于存储消息缓冲区的缓冲区的功能。消息缓冲区在启动时创建,并使用DPDK mempool库存储在mempool中。这个库提供一个API来分配/释放mbufs,操作用于携带网络数据包的数据包缓冲区。

在Mbuf库中描述了网络包缓冲区管理。

2.3.4计时器管理器(librte_timer)
此库为DPDK执行单元提供计时器服务,提供异步执行函数的能力。它可以是周期函数调用,也可以是一次性调用。它使用环境抽象层(EAL)提供的定时器接口来获取精确的时间引用,并且可以根据需要在每个CPU核的基础上进行初始化。

库文档在计时器库( Timer Library)中可用。

2.4以太网*轮询模式驱动程序架构
DPDK包括用于1个GbE、10个GbE和40个GbE的轮询模式驱动程序(PMDs)和准虚拟化virtio以太网的控制器,这些控制器设计用于在没有异步、基于中断的信令机制的情况下工作。

参见轮询模式驱动程序(Poll Mode Driver)章节。

2.5包转发算法支持
DPDK包含散列(librte_hash)和最长前缀匹配(LPM,librte_lpm)库,以支持相应的包转发算法。

有关更多信息,请参见散列库和LPM库( Hash Library and LPM Library )章节。

2.6librte_net
librte_net库是IP协议定义和便利宏的集合。它基于FreeBSD* IP栈中的代码,包含协议编号(用于IP头)、IP相关宏、IPv4/IPv6头结构和TCP、UDP和SCTP头结构。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章