mbuf

第二章:mubf

 

 

 

一:为何要建立这样的一个数据结构缓存?

   1,能在缓存头部和尾部添加数据(如底层封装来自高层的数据,譬如组帧),能从缓存中移除数据(如当数据分组向上经过协议栈时要去掉首部)

2,尽量少的为这些操作所做的数据复制。

 

二: mbuf的主要用途就是保存在进程和网络接口间的相互传递的用户数据。但mbuf也用于保存其他各种数据:源与目标地址,插口选项等。(视其m_type字段的不同)。

 

 

三,四种不同类型的mbuf

   无分组首部,mbuf本身带有108字节的可用空间

有分组首部,mbuf本身带有100字节的可用空间。

无分组首部,数据在外部缓存中

有分组首部,数据在外部缓存中。

 

四:两个操作mbuf的函数;

   1m_devget,很多网络设备(接口层)调用它来存放一个收到的帧,即创建mbuf

   2m_pullup, 所有输入程序调用它把协议首部提取出来放在一个新的mbuf中,然后以这个mbuf作为链首。

 

 

 

 

### DPDK中mbuf的使用方法 #### 1. mbuf 的定义与作用 `rte_mbuf` 是 DPDK 中的核心数据结构之一,用于描述网络数据包及其元信息。该结构体存储在网络内存池 `mempool` 中,并通过其字段来管理数据包的内容和属性[^2]。 以下是 `struct rte_mbuf` 的部分重要字段解释: - **`void *buf_addr;`**: 表示分配给当前 mbuf 缓冲区的虚拟地址。 - **`uint16_t data_off;`**: 数据相对于缓冲区起始位置的偏移量。 - **`uint32_t pkt_len;`**: 整个数据包长度(包括所有片段)。 - **`uint16_t data_len;`**: 当前段缓存中的实际数据大小。 - **`uint16_t buf_len;`**: 单个缓冲区的最大容量。 这些字段共同决定了如何操作和处理数据包内容以及其关联的信息。 #### 2. 直接与间接缓冲区的区别 直接缓冲区是指完全独立且自包含的缓冲区,而间接缓冲区则引用其他直接缓冲区中的数据。这种设计允许在多份副本间共享同一份底层数据,从而减少不必要的拷贝开销,在分片或重组场景下尤为有用[^3]。 #### 3. 常见 API 及其实现逻辑 为了方便开发者高效地操作 `rte_mbuf`,DPDK 提供了一系列实用宏函数: ##### (1)`rte_pktmbuf_mtod` 此宏用来提取指定类型的数据指针以便于后续访问具体负载区域内的有效载荷。例如: ```c char *payload = rte_pktmbuf_mtod(mbuf, char *); ``` 上述代码会将 `mbuf->buf_addr + mbuf->data_off` 转换成字符型指针并赋值给变量 `payload`,进而可以轻松读写其中所含有的原始二进制流[^4]。 ##### (2)`rte_cpu_to_be_16` 当涉及到跨平台通信或者协议栈交互时,字节顺序可能成为潜在障碍。为此引入了此类工具帮助完成必要的转换工作。比如下面的例子展示了怎样把短整形数值调整为标准的大端格式发送出去之前的形式: ```c uint16_t host_order_value = htons(0xABCD); uint16_t network_order_value = rte_cpu_to_be_16(host_order_value); ``` 这里先调用了系统的通用版本 `htons()` 函数然后再利用特定实现进一步封装确保兼容性良好。 #### 4. NUMA 支持下的优化考量 考虑到现代服务器通常采用非一致内存访问架构 (NUMA),即不同节点上的 CPU 对各自本地 RAM 访问速度远高于远程情况的事实,合理规划资源分布显得尤为重要。因此建议尽可能让同一线程始终绑定到固定物理核上运行的同时也要注意选取靠近对应计算单元所在的那块动态分配出来的连续空间作为基础载体承载临时产生的各类中间产物等等[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值