ptmalloc实现的代码描述

时间:2012-07-11 17:43:30

标签: c malloc heap 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实现。我想制作一些关于一切的整体结构的图表,所以我需要理解这些东西!

谢谢。

2 个答案:

答案 0 :(得分:9)

好的,我已经完成了一些研究,我对其中许多问题都有答案。

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

  • 我不知道为什么只有 prev 指针。我所知道的是,通常情况下,所有动态数据都存储在 main_arena 中,它是为该进程创建的竞技场。我不知道在哪种情况下不使用 main_arena ,我知道如果内存块中的 size 字段具有 NON_MAIN_ARENA < / strong>位置位,然后不使用 main_arena ,算法通过 heap_for_ptr()<清除该内存块指针的20个较低有效位获取新的竞技场地址/ strong>宏。总而言之,在正常情况下,将始终使用 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

答案 1 :(得分:2)

堆基本上被划分为许多小区域,这些小区域独立地迎合一个或多个分配的对象。一个这样的区域可能被称为竞技场或区域。堆主要是竞技场餐饮对象的集合,要求一个竞技场可以在一次操作中解除分配。为了实现这一点,一个完整的竞技场被分配为一个连续的内存地址范围。

竞技场或区域之间的区别是什么灰色。我不确定Linux,但一个例子是Cavium网络称为Octeon的真实世界多核网络处理器系列。将分配的内存视为竞技场或区域,区别在于区域可以分配固定大小相等的对象,而竞技场可以拥有不同大小的对象。在竞技场的情况下,这自然会导致碎片化。但我无法确认Linux是否也是如此。

Region based memory management