首页 理论教育 Contiki物联网操作系统MMEM内存分配器

Contiki物联网操作系统MMEM内存分配器

时间:2023-11-20 理论教育 版权反馈
【摘要】:MMEM 内存分配器提供了与标准C 库函数malloc()相似的一种动态内存分配方法,然而,主要区别在于MMEM 通过使用间接层实现所管理内存区域内的自动碎片整理。图2-1mmemlist链表结构MMEM 内存分配器用struct mmem 类型的对象表示每个管理的内存块,mmem 结构体的定义如下所示。在struct mmem 类型的对象中,指针ptr指向已分配的内存块,这些内存块位于为MMEM 库预留的连续存储器池中,size表示该内存块所能存储的字节数。

Contiki物联网操作系统MMEM内存分配器

MMEM 内存分配器提供了与标准C 库函数malloc()相似的一种动态内存分配方法,然而,主要区别在于MMEM 通过使用间接层实现所管理内存区域内的自动碎片整理。另外,函数mmem_alloc()分配的内存是1-字节对齐的,这也不同于malloc()函数。malloc()函数分配的内存适合各种数据类型对齐,并且返回的void 指针可以被安全地转换为其他任何类型的指针。相反,指向mmem_alloc()函数分配的内存指针不能被安全地转换为除char*、signed char*或unsigned char*类型之外的其他类型指针,这意味着如果分配的内存块被用作存储一个结构体类型的内容,那么必须声明该结构体为packed 或必须使用函数memcpy()。对编译器GCC,使用下面的语法可以指定packed结构体:

许多其他的编译器允许通过特定实现的#pragma 指令来指定packed 结构体。

(www.xing528.com)

图2-1 mmemlist链表结构

MMEM 内存分配器用struct mmem 类型的对象表示每个管理的内存块,mmem 结构体的定义如下所示。MMEM 库把struct mmem 类型的对象组织在名为mmemlist 的链表中,如图2-1所示。在struct mmem 类型的对象中,指针ptr指向已分配的内存块,这些内存块位于为MMEM 库预留的连续存储器池中,size表示该内存块所能存储的字节数。与MEMB类似,MMEM库的声明在头文件mmem.h 中,函数的实现在程序文件meme.c 中,这两个文件保存在文件夹core/lib/中。MMEM管理内存的结构如下:

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈