首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有一套将“`malloc()”实现从使用“`sbrk()”改为“`mmap()”的指南或建议?

是否有一套将“`malloc()”实现从使用“`sbrk()”改为“`mmap()”的指南或建议?
EN

Stack Overflow用户
提问于 2015-10-12 14:00:30
回答 2查看 240关注 0票数 0

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

EN

Stack Overflow用户

回答已采纳

发布于 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区域开头的指针。因此,跟踪您的分配是非常重要的。

希望这能帮到你。

票数 5
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33083123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档