是否有一组指导方针或建议用于将 `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
可能会给你一个很好的起点 :)
(因为我自己正在研究类似的主题,所以我会尽量在此处保留一份(我认为有用的)链接列表。)
Tips of malloc & free: Making your own malloc library for troubleshooting:适合初学者的介绍
Inside memory management: The choices, tradeoffs, and implementations of dynamic allocation:实施基于 sbrk()
的 malloc()
并替换标准的分步指南 (LD_PRELOAD
)
A Quick Tutorial on Implementing and Debugging Malloc, Free, Calloc, and Realloc: a walk-through of a publicly-available执行malloc()
几个月前,我不得不将 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 区域的开头才能执行此操作。因此,跟踪您的分配非常重要。
希望这对您有所帮助。
我正在开发一个包含一些自己的内存管理代码的嵌入式系统。此代码在使用 uClibc 编译时有效,但现代 C 库如 musl disable sbrk()
。我需要知道什么才能开始将基于 sbrk()
的 malloc()
实现重写为基于 mmap()
的实现。
我认为代码,尤其是 malloc(), free(), realloc() using brk() and sbrk() 的评论的 点 #7
可能会给你一个很好的起点 :)
(因为我自己正在研究类似的主题,所以我会尽量在此处保留一份(我认为有用的)链接列表。)
Tips of malloc & free: Making your own malloc library for troubleshooting:适合初学者的介绍
Inside memory management: The choices, tradeoffs, and implementations of dynamic allocation:实施基于
sbrk()
的malloc()
并替换标准的分步指南 (LD_PRELOAD
)A Quick Tutorial on Implementing and Debugging Malloc, Free, Calloc, and Realloc: a walk-through of a publicly-available执行
malloc()
几个月前,我不得不将 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 区域的开头才能执行此操作。因此,跟踪您的分配非常重要。
希望这对您有所帮助。