Zephyr内存管理之Heap(转自Half Coder)

本作品采用知识共享署名(https://lgl88911.gitee.io,转载过程中并未修改原文)

本文介绍Zephyr Heap内存管理的实现。

Heap分配器是一个Zephyr内核对象,Heap管理的是一片固定大小的连续内存区域,用户可以在Heap管理的内存区域中动态分配任意长度的内存。在Zephyr中lib/os/heap.c提供了底层的Heap内存管理算法,称作为sys_heap,该层级的API无法支持多线程。kernel/kheap.c建立在sys_heap之上实现了k_heapk_heap提供多线程和同步等待内存管理功能,当线程在heap内存不足时申请heap内存,可以等待其它线程释放内存。

sys_heap

作为最基础的内存分配管理算法,sys_heap并不是只能提供给Zephyr Kernel使用,因此sys_heap的源代码并没有放置在kernel/下,而是放在下列几个位置:

  • include/sys/sys_heap.h : sys_heap对外数据结构和API
  • lib/os/heap.h :sys_heap内部数据结构和chuck管理函数
  • lib/os/heap.c :sys_heap实现代码
  • lib/os/heap-validate.c :sys_heap验证代码

chuck

sys_heap将内存以chuck的形式进行管理,chuck的基本单位在代码内的定义是CHUNK_UNIT大小为8字节。一个chuck由一个以上的CHUNK_UNIT组成。注意,当Heap小于256K时,CHUNK_UNIT为4,但实际上很上出现hea小于256K的情况,因此本文均已CHUNK_UNIT=8进行说明分析
chunk在heap内的位置以Chunk ID标识,Chunk ID以CHUNK_UNIT为单位进行计算: