天天看点

Zephyr内核——内存管理——内存板内存板概念内部操作实现

内存板

内存板是一个内核对象,它允许从指定的内存区域动态地分配内存块。内存板中的所有内存块都有一个固定的大小,允许有效地分配和释放它们,避免内存碎片的问题。

概念

可以定义任意数量的内存板(仅受可用RAM的限制)。每个内存板都由其内存地址引用。

内存板具有以下关键属性:

  • 每个块的块大小,以字节为单位测量。它必须至少有4N个字节长,其中N大于0。
  • 可供分配的块数。它必须大于零。
  • 为内存板的块提供内存的缓冲区。它必须至少是“块大小”乘以“块数”的字节长。

内存板的缓冲区必须与N字节边界对齐,其中N的幂次大于2(即4、8、16、…)。为了确保缓冲区中的所有内存块都与此边界对齐,块大小也必须是N的倍数。

内存板必须初始化才能使用。这将它的所有块标记为未使用的。

需要使用内存块的线程只需从内存板中分配它。当线程完成一个内存块时,它必须将块释放回内存板,以便块可以被重用。

如果所有块当前都在使用,线程可以选择等待一个可用。任意数量的线程都可以同时在一个空的内存板上等待;当内存块可用时,它将被授予等待时间最长的最高优先级的线程。

与堆不同,如果需要,可以定义多个内存板。这允许使用具有较小块的内存板和其他具有较大尺寸块的内存板。或者,也可以使用内存池对象。

内部操作

内存板的缓冲区是一个固定大小的块数组,块之间没有浪费的空间。

内存板使用链接列表跟踪未分配的块;每个未使用块的前4个字节提供了必要的链接。

实现

定义

继续阅读