我正在开发一个包含一些自己的内存管理代码的嵌入式系统。使用uClibc编译时,此代码可以正常工作,但是像musl禁用sbrk()
这样的现代C库。开始将基于sbrk()
的{{1}}实施重写为基于malloc()
的实现时,我需要了解什么。
答案 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
可能会为您提供一个很好的起点:)
(因为我自己正在研究一个类似的话题,我会尝试在这里保留一份(我认为是)有用链接的列表。)
Tips of malloc & free: Making your own malloc library for troubleshooting:适合初学者的演示文稿
Inside memory management: The choices, tradeoffs, and implementations of dynamic allocation:实施基于sbrk()
的{{1}}并替换标准版malloc()
A Quick Tutorial on Implementing and Debugging Malloc, Free, Calloc, and Realloc:LD_PRELOAD
实施malloc()