是否有一套指导或建议用于将`malloc()`实现从使用`sbrk()`转换为`mmap()`?

时间:2015-10-12 14:00:31

标签: c malloc

我正在开发一个包含一些自己的内存管理代码的嵌入式系统。使用uClibc编译时,此代码可以正常工作,但是像musl禁用sbrk()这样的现代C库。开始将基于sbrk()的{​​{1}}实施重写为基于malloc()的实现时,我需要了解什么。

2 个答案:

答案 0 :(得分:5)

几个月前,我不得不将malloc实现编码为一个赋值。我跟着this very good tutorial,不幸的是,使用brk和sbrk来编写简单的malloc,free和realloc函数,而我必须使用mmap来编写我的malloc,free和realloc。如果我记得很清楚,那些是我在mmap和sbrk之间注意到的事情:

您应该跟踪您的分配

使用0值调用sbrk可以获得程序中断的当前位置。 mmap并不像那样工作。与malloc一样,mmap调用返回指向新分配区域的指针。你必须把指针存在某个地方。如果您分配了多个区域,则必须跟踪所有区域,并使用"手工制作"链接列表,如上面的教程中所述。

你应该明智地使用mmap

mmap是一个系统调用,而且速度很慢。它分配了大量的内存页(系统默认页面大小的倍数)(可能是4096字节)。为了避免过多调用mmap,你必须分配一大块内存,并将其分成很小的块。对于你的程序分配。再次阅读上面的教程。对于我的任务,诀窍是创建三个mmap" ed" zone"。一个用于小分配,一个用于中等分配,大分配这是为了提高效率和优化所有这一切。

你要映射你的mmap

如果您不再使用mmap' ed区域,这意味着如果不使用其所有内存块,则必须使用munmap()系统调用将其返回给系统。要有效地执行此操作,您必须将指针传递到mmap的ed区域的开头才能执行此操作。因此,跟踪您的分配的重要性。

希望这能以某种方式帮助你。

答案 1 :(得分:1)

我认为malloc(), free(), realloc() using brk() and sbrk()的评论中的代码,特别是#7 可能会为您提供一个很好的起点:)

(因为我自己正在研究一个类似的话题,我会尝试在这里保留一份(我认为是)有用链接的列表。)