ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
PBUF\_RAM类型的pbuf空间是通过内存堆分配而来的,这种类型的pbuf在协议栈中使用得最多,一般协议栈中要发送的数据都是采用这种形式,在申请这种pbuf内存块的时候,协议栈会在管理的内存堆中根据需要的大小进行分配对应的内存空间,这种pbuf内存块包含数据空间以及pbuf数据结构区域,在连续的RAM内存空间中。很多人又会有疑问了,不是说各个协议层都有首部吗,这些内存空间在哪呢?能想到这一层的读者是非常聪明的,我很欣慰,你们有认真看前面的章节,内核申请这类型的pbuf时,也算上了协议首部的空间,当然是根据协议栈不同层次需要的首部进行申请,LwIP也使用一个枚举类型对不同的协议栈分层需要的首部大小进行定义,关于各层间的首部区域我们在后续讲解,此处只需知道即可。那么申请这种pbuf是怎么样申请的呢?具体见: **申请PBUF_RAM类型的pbuf(伪代码)** ``` 1 /* 函数原型 */ 2 struct pbuf * 3 pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type); 4 5 //例子 6 struct pbuf *p; 7 8 p = pbuf_alloc(PBUF_RAW, (u16_t)(req_len + 1), PBUF_RAM); 9 10 p = pbuf_alloc(PBUF_TRANSPORT, 1472, PBUF_RAM); ``` PBUF\_RAM类型的pbuf示意图具体见图 6‑1,图中可以看出整个pbuf就是一个连续的内存区域,layer(offset)就是各层协议的首部,如TCP报文首部、IP首部、以太网帧首部等,预留出来的这些空间是为了在各个协议层中灵活地处理这些数据,当然layer的大小也可以是0,具体是多少就与数据包的申请方式有关,具体在后面的章节中讲解。 ![](https://box.kancloud.cn/2435d96df05d54e773473da0803cd07f_311x598.png) 图 6‑1PBUF\_RAM类型的pbuf