我正在开发一个嵌入式系统,它包含一些自己的内存管理代码。这段代码在使用uClibc编译时工作,但是像musl这样的现代C库禁用sbrk()。我需要知道什么才能开始将基于sbrk()的malloc()实现重写为基于mmap()的实现。
发布于 2015-10-22 13:02:16
几个月前,我不得不将malloc实现编码为赋值。不幸的是,我遵循了这个很好的教程,使用brk和sbrk来编写简单的malloc、free和realloc函数,而我不得不使用mmap来编写malloc、free和realloc。如果我记得清楚的话,这就是我在mmap和sbrk之间注意到的:
你应该跟踪你的拨款
使用0值调用sbrk将给出程序中断的当前位置。mmap不是那样工作的。与malloc一样,mmap调用返回指向新分配区域的指针。你必须在某个地方储存那个指针。如果您分配了几个区域,您将必须跟踪所有这些区域,并使用上面的教程中描述的“手工”链接列表。
你应该明智地使用mmap
mmap是一个系统调用,也是一个相当慢的调用。它分配巨大的内存页(系统默认页面大小的倍数,可能是4096字节)。为了避免对mmap的太多调用,您将不得不分配一大块内存,并将其划分为用于程序分配的小块。同样,请阅读上面的教程。对于我的任务,诀窍是创建三个mmap‘ed“区域。一个用于微小的分配,一个用于中等规模的分配,大的分配是通过调用mmap进行的。所有这些都是为了效率和优化。
你要把你的mmap的
如果不再使用mmap‘’ed区域,这意味着如果不使用其所有内存块,则必须使用munmap()系统调用将其返回给系统。要有效地执行此操作,必须传递指向mmap‘’ed区域开头的指针。因此,跟踪您的分配是非常重要的。
希望这能帮到你。
https://stackoverflow.com/questions/33083123
复制相似问题