sk_buff内存管理困惑及相关技术问题咨询
内核网络数据包内存管理与sk_buff相关疑问
背景
- 本人20年前曾熟悉部分内核知识,如今重新学习内核,正尝试理解网络数据包的内存管理机制。
- 当前驱动在被轮询时会调用以下函数之一:
netif_receive_skb、napi_gro_receive。 - 对零拷贝机制的理解:小包会由驱动分配缓冲区并复制数据包后挂载到
sk_buff;大包则会将设备DMA写入的缓冲区从环形缓冲区移除并交给sk_buff,同时给环形缓冲区补充新缓冲区。
具体疑问
1. sk_buff的页抽象
作为用户态程序员,习惯使用char*这类缓冲区指针,但sk_buff采用页抽象:
- 数据包负载是否未关联页表?
- 为何要采用页抽象?
2. PFMEMALLOC skbs相关
__netif_receive_skb()中提到的PFMEMALLOC skbs是什么?何时、为何、由谁创建?
资料与驱动示例需求
- 求介绍较新版本
sk_buff的资料:2010年前的Linux书籍已完全过时,当前sk_buff结构体与旧版差异极大。 - 求易于理解的简单NIC驱动:需要其将网络数据包转为
sk_buff的代码易于跟进,高性能设备的驱动过于复杂。
题外话:Git提交筛选
无法找到仅列出内核源码中修改sk_buff结构体的Git提交的方法,阅读近十年的相关提交或许能理清其演化过程,请问该如何操作?
内容的提问来源于stack exchange,提问作者eof
相关产品推荐
相关产品推荐

