Zephyr的net_buf机制

Zephyr 作为Linux基金会推的物联网操作系统,里面有很多linux的影子,在github上有10K的star量,跟rt-thread差不多,值得深究一把。
按照Zephyr官网的步骤一步一步的把Zephyr的SDK build过,这期间为了解决各种问题,顺带买了阿里云的无影云电脑,完美解决了我手头这台9年老mac系统旧、速度慢的问题,有云电脑的加持感觉这台mac再战10年也没啥问题。

Zephyr的memory机制里有一个net_buf, 专门用在协议栈里各个层级来打包传输数据。net_buf 管理的buffer总共有三个来源:

  • 一块固定的buffer
  • 几个固定长度的buffer组成的数组
  • 来自Heap的memory

其中第二项在bluetooth subsys里用的最多,有个专门的名字叫做 net buffer pool,这个pool管理了两个重要数组:

  • 一个用来存放所有的net_buf,
  • 一个是存放net_buf管理的buffer的来源

数据结构如下图所示:

  • Pool的 _bufs 指针指向net_buf数组,数组里的net_buf在用过被free掉后,回挂到free list里。
  • Pool 的alloc指针来指向 buffer的来源,来源是由Allocator函数来定义好的
  • net_buf 里的 __buf 指针指向分配来的数据块的地址,这块buffer是真正给net_buf的用户用的。

图片