是否有一组指导方针或建议用于将 `malloc()` 实现从使用 `sbrk()` 切换到 `mmap()`?

Is there a set of guidelines or advices for switching a `malloc()` implementation from using `sbrk()` to `mmap()`?

我正在开发一个包含一些自己的内存管理代码的嵌入式系统。此代码在使用 uClibc 编译时有效,但现代 C 库如 musl disable sbrk()。我需要知道什么才能开始将基于 sbrk()malloc() 实现重写为基于 mmap() 的实现。

我认为代码,尤其是 malloc(), free(), realloc() using brk() and sbrk() 的评论的 #7 可能会给你一个很好的起点 :)

(因为我自己正在研究类似的主题,所以我会尽量在此处保留一份(我认为有用的)链接列表。)

几个月前,我不得不将 malloc 实现编码为一项任务。不幸的是,我遵循 this very good tutorial,使用 brk 和 sbrk 来编写简单的 malloc、free 和 realloc 函数,而我不得不使用 mmap 来编写我的 malloc、free 和 realloc。如果我没记错的话,这些是我在 mmap 和 sbrk 之间注意到的事情:

你应该跟踪你的分配

使用 0 值调用 sbrk 会为您提供程序中断的当前位置。 mmap 不是那样工作的。与 malloc 一样,mmap 调用 returns 指向新分配区域的指针。而且您将不得不将该指针存放在某个地方。如果您分配了多个区域,则必须使用上述教程中所述的 "handmade" 链表来跟踪所有区域。

你应该明智地使用mmap

mmap 是一个系统调用,而且速度很慢。它分配巨大的内存页面(系统默认页面大小的倍数,(可能是 4096 字节)。为了避免对 mmap 调用太多,您将不得不分配一大块内存,并将其分成小块为您的程序分配。再一次,阅读上面的教程。对于我的任务,诀窍是创建三个 mmap'ed "zones"。一个用于小型分配,一个用于中型分配,一次调用进行大型分配到 mmap。所有这些都是为了提高效率和优化。

你应该 munmap 你的 mmap 的

如果您不再使用 mmap 区域,这意味着如果它的所有内存块都没有被使用,您必须使用 munmap() 系统调用将它还给系统。并且要有效地执行此操作,您必须将指针传递到 mmap 区域的开头才能执行此操作。因此,跟踪您的分配非常重要。

希望这对您有所帮助。