6、LwIP协议规范翻译——缓冲及内存管理
6、缓冲及内存管理
在一个通信系统中,内存缓冲管理系统必须容纳各种大小的缓冲数据,其范围从包含具有数百个字节的数据的全尺寸TCP段到只有几个字节的短ICMP回复包。此外,为了避免拷贝,应该让数据内容缓冲驻留不被网络子系统管理的内存中。例如应用程序内存或或者ROM。
6.1、包缓冲——pbufs
包缓冲是LWIP一个数据包的内存呈现,专门满足特殊需求而设计的最小的堆栈。pbufs类似于BSD实现中使用的mbufs。pbuf结构体支持内存动态分配和静态内存存放包数据。所有pbufs被一起链接到链表中称为pbuf链,一个数据包可以跨越好几pbufs。(一个数据包存放连续的好几个节点中存储)
pbufs有三种类型,分别是PBUF_RAM, PBUF ROM, and PBUF_POOL.图1显示的是PBUF_RAM类型的pbuf,包数据已经存储pbuf子系统管理的内存中了。如下图1所示:

图1
图2表示一个pbuf链的例子,在链中第一个pbuf的类新是PBUF_RAM。第二个是PBUF_ROM类型。这意味着它具有位于内存中的数据而不被pbuf子系统管理。如下图2所示.

图2
第三种类型是PBUF_POOL,如下图3所示,包含在一个固定大小的缓冲池中分配来的固定大小的pbuf,该pbuf链表包含了多种类型的pbuf。

这三种类型有不同的使用者,
PBUF_POOL主要用于网络设备驱动程序,因为可以快速分配单个pbuf,所以适合在中断程序中使用。
PBUF_ROM用于应用程序发送数据,该数据来源由应用程序管理的内存。这些数据在pbuf移交给TCP/TP后不能被修改,因此这种类主要用于数据存储于ROM中。(因此命名为PBUF_ROM).
在PBUF_ROM附加头的数据被存储在PBUF_RAM中,并被连接到PBUF_ROM 的前面如图2所示。
PBUF_RAM类型的pbuf也用于当应用程序发送动态生成的数据时。在这种情况下,pbuf系统不仅仅为应用程序数据分配内存,也为添=付加到该数据的头分配。如图1所示。pbuf系统无法预先知道在这些数据前面会附加哪样的头,以及假定最坏的情况。这些头的大小在编译的时候都是可以配置的。
本质上,传入进来的pbuf是PBUF_POOL的类型,传出去的pbuf类型是PBUF_ROM或者PBUF_RAM 类型。pbuf的内部结构可以在图1和图3中看到。pbuf结构包含了两个指针,两个长度字段,一个标志字段和一个引用计数。在pbuf链中,next字段是指向下一个pbuf的指针。payload指针指向的是pbuf中数据的起始位置。len字段表示的是在pbuf中数据内容的长度。tot_len字段包含当前pbuf和在pbuf链中所有后续pbuf中len字段总和。换句话说,tot_len字段是len字段和pbuf链中后续pbuf中的len字段值的总和。flags字段表示pbuf的类型,ref字段包含引用计数。 next和payload字段是本机指针,其大小取决于所使用的处理器体系结构。两个length字段是16位无符号整数,flag和ref字段是4位宽。
pbuf模块提供了操作pbuf的功能。pbuf的分配由函数pbuf_alloc()完成,它可以分配上述三种类型中的任何一种的pbuf。函数pbuf_ref()增加引用计数。通过函数pbuf_free()进行解除分配,它首先减少pbuf的引用计数。如果引用计数达到零,则释放pbuf。 函数pbuf_realloc()缩小了pbuf,使其占用足够的内存来覆盖数据的大小。 函数pbuf_header()调整有效负载指针和长度字段,以便可以将标头添加到pbuf中的数据之前。 函数pbuf_chain()和pbuf_dechain()用于链接pbuf。
6.2内存管理
支持pbuf方案的内存管理器是非常简单的,它处理分配和释放连续内存区并能缩减之前所分配的内存块的大小。内存管理器使用系统中总内存的专用部分。这样子可以确保网络系统不会使用所有的可以用的内存,且其他应用程序也不会干扰到网络系统已经使用的内存。
在内存,内存管理器会在每个申请的内存块的顶部放置一个小结构体来跟踪已经分配的内存。这个结构体(图4)保存两个指针next指针和prev,next指向下一个已申请的内存空间,prev指向前一个已申请的内存空间,且使用used标识来指示是否已经分配好了分配块。
内存分配是通过在存储器中搜索足够大以满足所需要分配的未使用的分配块。使用首次适应原则以便足够大的第一个块被使用。当已分配的块被释放时,used标识被置为0。为了防止碎片,应该要检查下一个和上一个分配块的used标识,如果其中任何一个未使用,则将块组合成一个较大的未使用块。

图4
6、LwIP协议规范翻译——缓冲及内存管理的更多相关文章
- 7、LwIP协议规范翻译——网络接口
7.网络接口 在lwIP中,物理网络硬件设备驱动是由类似于BSD网络接口结构表示.网络接口结构如图5所示.网络接口被保存在一个全局的链表中,通过结构体中的next指针来完成链表的链接. 每个网络接口都 ...
- 【翻译】《深入解析windows操作系统第6版下册》第10章:内存管理
[翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第一部分) [翻译]<深入解析windows操作系统第6版下册>第10章:内存管理(第二部分) [翻译] ...
- LWIP内存管理
LWIP是一种TCP/IP协议栈,与嵌入式操作系统一样也提供了内存管理. 内存池里面有多个同样大小的内存,不同类型的内存池其里面的内存大小不一样.
- lwIP内存管理机制
lwip的内存管理机制,我们以enet_lwip这个例程为例. 在使用lwip的时候,我们可以使用两种形式的内存,一种是heap(mem.c文件-mem_malloc()),一种是pool(memp. ...
- [翻译]理解Unity的自动内存管理
当创建对象.字符串或数组时,存储它所需的内存将从称为堆的中央池中分配.当项目不再使用时,它曾经占用的内存可以被回收并用于别的东西.在过去,通常由程序员通过适当的函数调用明确地分配和释放这些堆内存块.如 ...
- java Hotspot 内存管理白皮书(中文翻译)
转自: http://my.oschina.net/u/568779/blog/166891 1引言 一个健壮的 Java™2平台,Standard Edition (J2SE™)拥有一个自动内存管理 ...
- Spark 1.6以后的内存管理机制
Spark 内部管理机制 Spark的内存管理自从1.6开始改变.老的内存管理实现自自staticMemoryManager类,然而现在它被称之为"legacy". " ...
- 内存管理单元(MMU)和协处理器CP15介绍(转)
内存管理单元(MMU)和协处理器CP15介绍内存管理单元(MMU)介绍嵌入式系统中,存储系统差别很大,可包含多种类型的存储器件,如FLASH,SRAM,SDRAM,ROM等,这些不同类型的存储器件速度 ...
- 【转】Android中的内存管理--不错不错,避免使用枚举类型
原文网址:http://android-performance.com/android/2014/02/17/android-manage-memory.html 本文内容翻译自:http://dev ...
随机推荐
- Xilinx的ISE14.7和PlanAhead与win10系统的兼容性问题解决方案
Xilinx的ISE14.7和PlanAhead与win10系统的兼容性问题解决方案 2018年07月03日 18:27:57 feq123 阅读数:4495 今天在新电脑的win10系统上安装I ...
- 物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)
0. 前言 消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper.Zookeeper安装上一篇博客已经介绍过了. 1. Kaf ...
- (转)java术语(PO/POJO/VO/BO/DAO/DTO)
转自:http://blog.csdn.net/gaoyunpeng/article/details/2093211 PO(persistant object) 持久对象在o/r 映射的时候出现的概念 ...
- [转]kindeditor隐藏上传图片框网络图片或本地上传的功能
原文地址:http://www.lingchenliang.com/post/154.html kindeditor富文本编辑器点击上传图片按钮,在弹出的窗口中去掉上传网络图片的功能,只留下本地上传, ...
- hive sql求多个字段的最小值和最大值的办法
1. 准备数据表test2 create table test2( a int, b int, c int, d int, e int); 2. 准备2条数据 ,,,,); ,,,,); 查询显示如下 ...
- 【RPC】手撸一个简单的RPC框架实现
涉及技术 序列化.Socket通信.Java动态代理技术,反射机制 角色 1.服务提供者:运行在服务端,是真实的服务实现类 2.服务发布监听者:运行在RPC服务端,1将服务端提供的 ...
- Logstash安装和使用
Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然后将数据发送到您最喜欢的 “存储库” 中.(我们的存储库当然是 Elasticsearch.) 作用:集中.转 ...
- Jquery实现轮播公告
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 64位 windows10,安装配置MYSQL8.0.13
MySQL的安装配置过程,一查网上一大堆,但是每个人在安装配置的过程中都会碰到一些问题,因为安装的版本不一样,有些命令可能就不适用了.所以安装之前一定先确认好你的版本号. 下面开始安装MYSQL8.0 ...
- python nose测试框架全面介绍十二 ----用例执行顺序打乱
在实际执行自动化测试时,发现我们的用例在使用同一个资源的操作时,用例的执行顺序对测试结果有影响,在手工测试时是完全没法覆盖的. 但每一次都是按用例名字来执行,怎么打乱来执行的. 在网上看到一个有意思的 ...