gpt4 book ai didi

c - 是否有一组指南或建议用于将 `malloc()` 实现从使用 `sbrk()` 切换到 `mmap()` ?

转载 作者:太空宇宙 更新时间:2023-11-04 05:36:42 24 4
gpt4 key购买 nike

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

最佳答案

几个月前,我不得不将 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 编辑的“区域”。一个用于小型分配,一个用于中型分配,一次调用 mmap 进行大型分配. 所有这些都是为了提高效率和优化。

你应该对你的 mmap 进行 munmap

如果您不再使用 mmap 区域,这意味着如果它的所有内存块都没有被使用,您必须使用 munmap() 系统调用将它还给系统。并且要有效地执行此操作,您必须将指针传递到 mmap 区域的开头才能执行此操作。因此,跟踪您的分配非常重要。

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

关于c - 是否有一组指南或建议用于将 `malloc()` 实现从使用 `sbrk()` 切换到 `mmap()` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com