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的用户用的。