卷2 第2章 mbuf:存储器缓存
2.1 引言
mbuf(memory buffer)是内核中的存储器缓存,用于:
- 保存用户数据
- 保存源/目标地址
- 保存插口选项
- 保存协议控制块
2.2 代码介绍
sys/mbuf.h:mbuf结构和宏定义kern/uipc_mbuf.c:mbuf函数
统计量
netstat -m2.3 mbuf的定义
常量 常量 值 说明 MSIZE 128 mbuf大小 MLEN 108 普通mbuf数据量 MHLEN 100 分组首部mbuf数据量 MINCLSIZE 208 簇最小数据量 MCLBYTES 2048 簇大小
2.4 mbuf结构
四种mbuf类型 无标志:108字节数据
M_PKTHDR:100字节数据 + 分组首部
M_EXT:簇(外部缓存)
M_PKTHDR + M_EXT:分组首部 + 簇
成员 成员 说明 m_next 链中下一个mbuf m_nextpkt 队列中下一个记录 m_len 数据长度 m_data 数据指针 m_type 数据类型 m_flags 标志 标志 标志 说明 M_BCAST 链路层广播 M_MCAST 链路层多播 M_EXT 有簇 M_PKTHDR 分组首部
2.5 简单的mbuf宏和函数
m_get函数 分配一个mbuf。
MGET宏 调用MALLOC分配内存
更新统计
初始化指针
m_retry函数 内存不足时调用
调用m_reclaim释放内存
2.6 m_devget和m_pullup函数
m_devget 设备驱动程序创建mbuf链
根据数据长度选择不同格式
m_pullup 保证前N字节连续
用于协议首部处理
用于IP分片重装
2.7 mbuf宏和函数的小结
常用宏 宏 说明 MGET 分配mbuf MGETHDR 分配分组首部mbuf M_PREPEND 在前面添加数据 dtom 数据指针→mbuf指针 mtd mbuf数据→类型指针 常用函数 函数 说明 m_adj 删除数据 m_cat 连接mbuf链 m_copy 复制mbuf链 m_copydata 复制数据 m_pullup 保证连续
2.8 Net/3联网数据结构小结
mbuf链:通过m_next链接
有头指针的链表:通过m_nextpkt链接记录
有头/尾指针的链表
双向循环链表
2.9 m_copy和簇引用计数
簇可被多个mbuf共享
引用计数管理
避免数据复制
2.10 其他选择
mbuf复杂性是历史产物
现代系统可能使用更简单的缓存机制
2.11 小结
mbuf是Net/3网络代码的基础数据结构,支持可变长度数据和高效操作。