ptmalloc实现的代码描述

new*_*log 16 c heap malloc dynamic-memory-allocation

我期待了解GNU/Linux系统中动态内存管理如何在低级别工作(也就是说,ptmalloc如何工作).

当然,我已经阅读了代码,但我有很多疑问.我或多或少地了解数据结构,但我有很多信息泄漏!

我的问题是,如果有人知道任何资源详细解释实施.例如,我读过诸如"通过打破它来理解堆"或"Malloc Malleficarum"系列和后期系列等论文.他们做得很好,但是,当然,他们更专注于利用,而不是解释许多实施细节.

如果你不知道任何资源,这里有一些我的问题.

  • 什么是竞技场?在来自heap_info结构的变量ar_ptr的代码中,有一条评论说"这个堆的竞技场",所以一个竞技场不能是一个堆(就像所说的那样).

  • 为什么在heap_info结构中没有下一个指针并且有一个prev指针?是因为main_arena?什么是main_arena

  • 每个heap_info结构都可以有多个竞技场(指向不同的malloc_state结构)?

  • 什么时候创建新闻竞技场和什么代码处理它?我已经读过,当请求存储数据的竞技场被锁定时(因为进程或进程线程正在使用它),我创建了新的竞技场,并且我还读到每个进程线程都有不同的竞技场.这里重要的是你知道什么代码处理这些情况.

  • 我也不明白人们什么时候说所有的记忆操作都来自顶级大块或者大块头.你知道我在哪里可以找到这段代码吗?

顺便说一下,我不想深入了解互斥锁细节.

我正在审查glibc 2.12.1中的ptmalloc实现.我想做一些关于一切的整体结构的图表,所以我需要了解这些事情!

谢谢.

new*_*log 9

好的,我已经完成了一些研究,我得到了许多问题的答案.

  • 竞技场是存储过程的所有动态数据的存储区域.简而言之,竞技场是过去称为堆的内存结构.鉴于现在(使用多线程的东西)你想要每个进程有多个堆,你可以通过创建一个名为arena的东西来处理它,但这个竞技场只不过是一个堆.该heap_info结构只管理一个进程的多个领域存在的.

  • 我不知道为什么有只上一个指针.我所知道的是,通常情况下,所有动态数据都存储在main_arena中,它是为该进程创建的竞技场.我不知道在哪种情况下不使用main_arena,我所知道的是,如果内存块中的size字段设置了NON_MAIN_ARENA位,则不使用main_arena,算法从清除中获取新的竞技场地址通过heap_for_ptr()宏输出该内存块指针的20个不太重要的位.总而言之,在正常情况下,将始终使用main_arena.

  • 是的,正如我所说,每个heap_info结构都可以有多个竞技场.这是因为锁争用.如果你有足够的空闲时间,可以在[1]中阅读.

  • 我不记得这个.但事实是,如果竞技场正在使用,锁定,则会创建一个新的竞技场.搜索任何类似于new_arena()或new_heap()的函数的调用.我记得函数名称与此类似.

  • 我认为这只意味着在开始时堆的所有内存空间都是顶部块(或荒野块),所以当从进程中请求新的内存请求时,这个顶部块被分割并分段.所以一切都从顶部块开始.

我想,在三个月之后,我的回答是更适合我的问题,所以我会把它作为正确的答案.另一方面,感谢所有其他答案.他们真的很有帮助.

顺便说一下,我把所有这些研究都放在一篇论文中,但鉴于它是西班牙语,我不认为它会在这里使用,我不知道它是否会被认为是垃圾邮件.[2]

[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.4439

[2]这里有你的论文:http://overflowedminds.net/papers/newlog/linux_heap_exploiting_revisited.pdf