- DPDK 技术框架 技术框架分为 Linux Kernel、User Space 和 应用App 三个部分。
- 内核态模块
- KNI 内核网卡接口 KNI ( Kernel NIC interface 内核网卡接口)是DPDK允许用户态和内核态交换报文的渠道,KNI 模拟虚拟的网口,提供 DPDK 应用程序和 Linux 内核直接同学链接, 即 KNI 接口允许报文从用户态接收后转发到 Linux 内核协议栈中。
- IGB_UIO 在前面 《DPDK 实现原理解析》 中,已经介绍 igb_uio 内核模块。 DPDK 利用 Linux 提供的UIO机制,通过read()感知中断、mmap()实现和网卡设备的通信,在 Linux 内核中安装 igb_uio.ko 模块(代替网卡驱动模块),重设中断回调函数入口参数,当网卡与 igb_uio.ko 绑定后,igb_uio接管网卡,并为 用户态 PMD 提供服务接口。
- 用户态模块
- 3.1 Core Libraries 核心部件库 核心部件库是 DPDK 面向用户态协议栈程序开发的模块,如:VPP 就是基于 DPDK的核心库接口实现的用户态协议栈应用。想学习此部分内容请参考 《 VPP 快速入门简介 》 。
- 3.2 Platform 操作系统平台相关模块
- 3.3 PMD-Natives&Virtual 用户态轮询模式的网卡驱动程序 以太网轮询模式驱动架构,把以太网驱动从内核移动到应用层,采用同步轮询机制而不是内核态的异步中断机制来提高报文的接收和发送效率。此部分内容请参考 igb_uio 部分内容。
- 3.4 Classify 报文转发分类算法库 支持精确匹配 (Exact Match)、最长匹配 (LPM)和 通配符匹配 (ACL)数据报文,并提供常用的包处理的查表操作。
- 3.5 Qos 调度和流控库 提供网络服务质量相关的组件,如:限速 (Meter) 和调度 (Scheduler),调度库支持随机早检测、流量整形、严格优先级、和加权随机循环优先级调度等。
- 3.6 Extensions 扩展内容 此部分内容待续…
- DPDK核心组件、与核心部件库关系
名词解释:
RTE: run time environment
EAL: environment abstraction layer
PMD: poll mode driver
librte_malloc 堆内存管理器库,提供一组API、用于从 HugePage 内存中创建 memzones 分配内存,而不是在系统用户堆中分配。这有助于改善 Linux 用户空间环境下典型 4KB 页面、而引起的TLB 不命中影响效利问题。
librte_mempool 内存池管理器,负责分配内存中的 Pool 对象。它提供一些可选择的服务,例如:每个 CPU Core 的对象缓存和对齐方式、以确保将填充的对象在所有内存通道上得到均匀分布。
librte_ring 环形队列管理器,在一个大小有限的页表中,Ring数据结构提供了一个无锁的多生产者/多消费者 FIFO API 。 相较于无锁队列,他有一些优势,例如:更容易实现、适应于大容量操作,而且速度更快。 一个 Ring 可以在 Memory Pool manager 中被使用,也可以用于不同 cpu Core 或 processor 之间作为通用的通信机制。
librte_mbuf 网络报文缓冲区管理器,用于分配、释放和操作 MBUFS 数据报文缓冲区,DPDK 应用程序中可以通过接口API、使用这些缓存区来存储信息以及报文数据。
librte_timer 定时器管理器,为 DPDK 应用程序的执行单元、提供定时服务,支持以异步方式执行函数。定时器可以设置周期调用、也可以设置为只调用一次, DPDK 应用程序可以使用 EAL 提供的 HPET 接口、来获取高精度时钟引用,并且能在每个 Core 上更加需要进行初始化。
- 库代码
参考链接:
http://doc.dpdk.org/api/ http://doc.dpdk.org/guides/prog_guide/