【C/C++】DPDK 基础使用:从 EAL 初始化到 RX/TX 队列收发数据

DPDK与Oracle 26ai构建微秒级智能安全防护系统实战 在网络安全领域,实时威胁检测与响应是核心挑战。其原理在于对海量网络流量进行高速捕获、深度解析与智能分析。传统方案常因数据采集与AI推理间的延迟而受限,无法满足金融交易、电商秒杀等高并发场景的实时性要求。DPDK技术通过用户态驱动和轮询模式,绕开内核瓶颈,实现微秒级数据包线速处理,解决了网络数据入口的性能问题。而Oracle Database 26ai的创新价值在于将机器学习模型内嵌于数据库,支持通过SQL函数对流入数据进行实时评分与异常检测,实现了数据“就地处理”,避免了跨服务调用的开销。两者结合,形成了一 阅读详情

DPDK 基础使用:从 EAL 初始化到 RX/TX 队列收发数据

标签:DPDK rte_mbuf rte_mempool 收发队列

课程的 receive.c、send.c 与 echo.c 建立了最小收发闭环:初始化 EAL,创建 mbuf 内存池,配置端口队列,轮询接收,解析以太网帧并组包发送。

1. 初始化顺序不能乱

rte_eal_init
  -> rte_pktmbuf_pool_create
  -> rte_eth_dev_configure
  -> rte_eth_rx_queue_setup / rte_eth_tx_queue_setup
  -> rte_eth_dev_start
  -> rte_eth_rx_burst <-> rte_eth_tx_burst

EAL 负责解析 DPDK 参数、初始化大页内存和逻辑核环境。端口启动前,RX/TX 描述符环必须就绪。

if (rte_eal_init(argc, argv) < 0)
    rte_exit(EXIT_FAILURE, "EAL init failed\n");

struct rte_mempool *pool = rte_pktmbuf_pool_create(
    "MBUF_POOL", NUM_MBUFS, MBUF_CACHE_SIZE, 0,
    RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
if (pool == NULL)
    rte_exit(EXIT_FAILURE, "mempool create failed\n");

NUM_MBUFS 在课程中常取 2^n - 1。rte_ring 的容量管理与 2 的幂相关,具体值仍应由队列数、突发大小和内存预算确定。

2. 配置端口与队列

struct rte_eth_conf port_conf = {0};
rte_eth_dev_configure(port_id, 1, 1, &port_conf);
rte_eth_rx_queue_setup(port_id, 0, 1024,
    rte_eth_dev_socket_id(port_id), NULL, pool);
rte_eth_tx_queue_setup(port_id, 0, 1024,
    rte_eth_dev_socket_id(port_id), NULL);
rte_eth_dev_start(port_id);

一个队列对应一组描述符。多队列网卡可将队列、中断(若使用)和 lcore 进行 CPU 亲和性规划;本课程先以单队列把数据路径跑通。

3. 从队列取包并解析

rte_eth_rx_burst 一次取一批 rte_mbuf,没有数据时返回 0。这也是 DPDK 轮询模型的核心。

struct rte_mbuf *mbufs[BURST_SIZE];
uint16_t n = rte_eth_rx_burst(port_id, 0, mbufs, BURST_SIZE);
for (uint16_t i = 0; i < n; i++) {
    struct rte_ether_hdr *eth =
        rte_pktmbuf_mtod(mbufs[i], struct rte_ether_hdr *);
    if (eth->ether_type == rte_cpu_to_be_16(RTE_ETHER_TYPE_IPV4)) {
        struct rte_ipv4_hdr *ip = rte_pktmbuf_mtod_offset(
            mbufs[i], struct rte_ipv4_hdr *, sizeof(*eth));
        /* 按 ip->next_proto_id 继续分发 */
    }
    rte_pktmbuf_free(mbufs[i]);
}

rte_pktmbuf_mtod 取得数据首地址;rte_pktmbuf_mtod_offset 在同一 mbuf 上按字节偏移解释下一个协议头。任何分支处理结束后都要明确释放或转交 mbuf 所有权。

4. 组包与发送

发送方向相反:从内存池申请 mbuf,追加实际数据空间,填充协议头,最后批量入 TX 队列。

struct rte_mbuf *tx = rte_pktmbuf_alloc(pool);
char *buf = rte_pktmbuf_append(tx, pkt_len);
if (buf == NULL) {
    rte_pktmbuf_free(tx);
    return -ENOMEM;
}
/* 填充 Ethernet/IP/UDP 或 ICMP 数据 */
uint16_t sent = rte_eth_tx_burst(port_id, 0, &tx, 1);
if (sent < 1)
    rte_pktmbuf_free(tx);

注意:data_len 是当前分段长度,pkt_len 是完整报文长度;多段 mbuf 时二者并不相等。IP/UDP/TCP 校验和必须在字段填完、校验和字段清零后计算。

5. 验证结果

课程用 echo 回包建立了收发验证闭环:
在这里插入图片描述

小结

掌握这六个 API 就掌握了 DPDK 的骨架:rte_eal_init、rte_pktmbuf_pool_create、rte_eth_dev_configure、队列 setup、rte_eth_rx_burst、rte_eth_tx_burst。后续 ARP、ICMP、UDP 与 TCP 的区别,主要发生在 mbuf 数据区如何解析和重组。

学习链接: https://github.com/0voice

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

相关推荐

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 296

【C/C++】从 DPDK 收包到用户态 TCP/IP 协议栈:一个 ustack 示例拆解

本文介绍了基于DPDK实现用户态TCP/IP协议栈的核心流程。首先明确DPDK并非协议栈,而是绕过内核直接访问网卡的工具箱。文章详细拆解了五个关键环节:(1)DPDK初始化阶段创建内存池和网卡队列;(2)主循环通过ring结构解耦收发包过程;(3)协议分发层处理Ethernet/IPv4/UDP/TCP等协议;(4)UDP报文如何进入应用缓冲区;(5)KNI机制将不处理的数据包交回内核。示例代码展示了如何从DPDK收包到实现用户态协议栈的基本框架,为构建高性能网络应用提供了参考方案。

wycgi的博客 407

【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二02

字段内容类型​云网络自定义路由表(Custom Route Table):允许用户自定义 VPC 或子网的路由规则,控制流量走向,支持黑白名单、策略路由。端计算节点->边缘计算节点->边缘DC->中心云的网络情况及存储需求及配置情况列表​端计算节点为 VPC 内的云资源。边缘计算节点不适用。边缘 DC 和中心云为路由表管理平台。存储需求:路由条目存储于数据库。网络:路由表在虚拟路由器中执行。QoS:无。网络的端到端配置(从接入到汇聚到核心)​。

weixin_49199313的博客 330

Linux C/C++ 学习日记(41):dpdk(四):基于dpdk编写的第一个程序

本文介绍了如何编写程序检测DPDK是否正常使用。首先创建ustack目录和.c文件,复制并修改Makefile指定编译ustack.c。代码示例通过rte_eal_init初始化DPDK环境,使用rte_eth_dev_count_avail检查可用网卡数量,成功运行后输出网卡数目和确认信息。最终通过编译执行验证DPDK正常初始化,系统检测到1个多队列网卡。该过程可用于基础DPDK环境验证。

2302_79943247的博客 291

ISP模块之色彩增强算法--HSV空间Saturation通道调整

色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息。     在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,

松间明月 1万+

保姆级教程:用Ubuntu 22.04搭建RustDesk中继服务器(含Cloudflare避坑指南)

本教程详细指导如何在Ubuntu 22.04上搭建RustDesk中继服务器,解决跨国远程协作的延迟问题。涵盖环境配置、Rust编译优化、服务部署及Cloudflare代理设置等关键步骤,帮助用户实现高性能的私有中继服务。

weixin_29002209的博客 527

【C/C++】从网卡到 socket:一个 DPDK 用户态协议栈的整体架构

I/O lcore 与协议 lcore 通过全局 ring 交换 mbuf,协议线程再借助每个 socket 的 ring、TCP 缓冲和 eventfd,把结果交给应用。这样一来,KNI 为本机流量和用户态未处理的报文保留内核去向,Netlink 把 Linux 已有的路由控制面结果同步给 DPDK FIB,协议线程负责实际的转发查表。awesome-stack 需要协调的,正是这几种不同的节奏:网卡按批次收发,协议线程按连接维护状态,应用则按 socket 和 epoll 语义工作。

wycgi的博客 405

西电计科数据库系统期末复习笔记

本人西电19计科,数据库系统98,这是复习期间整理的笔记,基本涵盖了课程全部重点,有需要的学弟学妹可以在复习的时候参考一下。

Polaris的博客 8599

【C/C++】从零配置 DPDK 实验环境:巨页、VMware 网卡、驱动加载与 PCI 绑定

环境成功的判据不是“模块已加载”,而是:巨页可用、目标 PCI 被 UIO/VFIO 接管、程序能枚举端口,且宿主机能向该 MAC 发出测试流量。代价是环境必须一次配对:CPU、巨页、IOMMU/驱动和 PCI 网卡缺一不可。页面大小和数量要根据 mbuf 数量、NUMA 和可用内存调整,不能在生产主机上盲目照搬。若接口将由 DPDK 独占,则无需配置 IP。这样主机知道目标 MAC,报文才会被发往被 DPDK 接管的虚拟网卡。网卡通过 DMA 直接读写预分配的大页内存,减少中断、系统调用和数据拷贝。

wycgi的博客 181

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。

dally2的博客 6042

手机流畅的秘密:拆解LPDDR5X在骁龙8 Gen2平台上的电源与信号完整性设计

本文深入解析了LPDDR5X内存与骁龙8 Gen2处理器在旗舰手机中的协同设计,重点探讨了0.5V超低电压下的电源完整性设计以及8.5Gbps高速传输中的信号完整性挑战。通过详细的电源树架构、关键器件选型和布线策略分析,揭示了如何实现高性能与低功耗的完美平衡,为手机流畅体验提供硬件保障。

weixin_30235225的博客 484

DPDK与零拷贝技术:构建微秒级延迟的C++交易系统网络核心

在追求极致性能的分布式系统和高并发服务中,网络I/O延迟和吞吐量是核心瓶颈。传统基于内核协议栈的通信模型,由于系统调用、上下文切换和内存拷贝等开销,难以满足对延迟和吞吐有严苛要求的场景。DPDK(数据平面开发套件)通过用户态轮询和内核旁路技术,从根本上消除了这些开销,实现了网络数据包从网卡到应用层的直接路径。结合零拷贝技术,进一步避免了数据在用户空间和内核空间之间的冗余复制,极大降低了CPU负载和内存带宽占用。这两项技术的工程价值在于,它们能够将网络处理延迟稳定降低至微秒甚至纳秒级,同时将吞吐量推至硬件极限

weixin_33749242的博客 355

推荐一个直接用于项目开发的PID库!很好用,很稳定

关注、星标公众号,不错过精彩内容大家好,我是小麦。最近有朋友问到有没有现成的C语言PID库。当然有了!现在我就准备给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的PID示例,或者...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 9025

高性能C++网络转发引擎设计:如何实现微秒级数据包处理?

掌握微秒级数据包处理核心技术,提升数据中心性能。在2025全球C++及系统软件技术大会:数据中心网络C++转发引擎设计中,深入解析高性能C++转发引擎的架构设计、零拷贝与多线程优化方法,适用于高吞吐低延迟场景,显著降低处理延迟,值得收藏。

CodeNexus的博客 783

知识图谱-构建:知识图谱构建流程【本体构建、知识抽取(实体抽取、 关系抽取、属性抽取)、知识表示、知识融合、知识存储】

旅游领域的类是用来描述旅游的抽象化概念术语,是对众多旅游个体共性的概念化描述。术语是划分类的基础,根据构建领域本体的目标和具体需要,可以确定哪些术语能作为领域本体的类。在以上抽取的众多旅游领域术语中,有些是能直接作为类的,如旅游、人物、交通方式、景区等等,而有些则不能作为类,如票价、景区门票、联系方式等等,它们只是属性。“旅游”很明显是最顶层的类,是父类。然后,要确定旅游的子类,根据大众标签里体现的共性和《中国分类主题词表》确定了旅游领域的11个核心概念,即本体层次结构图数据属性(固有属性)...

u013250861的博客 4万+

操作系统 | 知识梳理 | 复习(上)

操作系统复习

知识库搭建ing 3476

Seastar C++20 异步框架实战:基于 DPDK 构建 10Gbps 网络服务,延迟降低 90%

本文详细介绍了如何利用Seastar C++20异步框架和DPDK构建高性能网络服务,实现10Gbps吞吐量并将延迟降低90%。通过环境配置、深度集成、核心架构设计及性能优化等实战步骤,展示了Seastar在多核服务器应用程序中的卓越表现,为开发者提供了完整的高性能网络解决方案。

weixin_33690963的博客 399

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

网讯网卡驱动补丁与DPDK 20.11.10集成:2种编译方案对比与排错

本文详细解析了网讯网卡驱动与DPDK 20.11.10在ARM平台上的两种编译方案,包括传统Make和现代Meson/Ninja构建系统。通过环境准备、补丁集成、编译优化及常见问题排查,为开发者提供全面的实践指南,帮助实现高性能网络数据处理。

weixin_34310369的博客 715

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)

接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数:   intrte_eal_init(int argc, char **argv) 内存池函数:   rte_pktmbuf_pool_create。 它是函数 rte_mempool_create 的一个封装。 struct rte_m...

weixin_30872157的博客 259

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【紧迫预警】再不布局国产C++通信栈,AI算力优化将陷入停滞?

突破AI算力优化瓶颈,需重构底层通信架构。2025全球C++及系统软件技术大会“AI算力与优化”专场:C++通信库的国产化替代案例,揭示高性能计算场景下国产C++通信栈的设计方法与落地实践,显著降低延迟、提升吞吐。自主可控技术路径已验证,值得收藏,点击了解详情。

CompiWander的博客 918

static 的三种用法:C 语言里一个关键字的三张面孔

本文系统讲解 C 语言中 static 关键字的三种用法:修饰局部变量延长生命周期、修饰全局变量与函数限制作用域到本文件。通过一个包含三个文件的完整工程示例对照演示,并从存储期、作用域与链接性三个属性解释其统一原理,最后补充单元测试框架偏爱 static 函数的工程实践。

大模型全栈工程师 · Thanks_ks 325

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 250

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 345

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 393

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 86

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 306
上一篇: 【C/C++】从零配置 DPDK 实验环境:巨页、VMware 网卡、驱动加载与 PCI 绑定
下一篇: 【C/C++】手写 DPDK 协议栈(三):ARP 请求识别、应答与 ARP 表
SilentSlot
博客等级 码龄16年 44粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值