ptmalloc实现的代码描述

16

我希望了解在GNU/Linux系统中低级别下动态内存管理是如何工作的(也就是说,ptmalloc的工作原理)。

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

我的问题是,是否有人了解任何详细解释实现的资源。例如,我已经阅读了诸如“通过打破它来理解堆”或“Malloc Malleficarum”系列和后续文章等论文。它们做得很好,但当然它们更侧重于利用而不是解释许多实现细节。

如果您不知道任何资源,请参考以下一些问题。

  • 什么是“arena”?在“heap_info”结构体的“ar_ptr”变量的代码中,有一个注释说“arena for this heap”,所以“arena”不能是堆(因为它被说得到处都是)。

  • 为什么在“heap_info”结构中没有next指针而有一个“prev”指针?是因为“main_arena”吗?“main_arena”是什么?

  • 每个“heap_info”结构可以有多个arena(指向不同的“malloc_state”结构)吗?

  • 何时创建新的arena,以及处理它的代码是什么?我已经读到,当请求用于存储数据的arena被锁定(因为进程或进程线程正在使用它)时,将创建新的arena,我也读到每个进程线程有一个不同的arena。重要的是你是否知道“处理这些情况的代码”。

  • 我也不明白人们何时说所有内存操作都来自顶部块或最广泛的块。您知道我可以在哪里找到这个代码吗?

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

我正在审查glibc 2.12.1中的ptmalloc实现。 我想制作一些关于所有内容的总体结构的图表,因此我需要了解这些内容!

谢谢。


3
这本书:http://www.amazon.co.uk/Understanding-Virtual-Memory-Manager-Perens/dp/0131453483/,可以在互联网上作为PDF文档免费获取(合法)。 - Oliver Charlesworth
谢谢Oli! 这是一个很好的资源,但它专注于内核方面。 它很有用,但不解释任何关于用户空间分配器的内容。 顺便说一下,再次感谢! - newlog
2
请查看以下链接:http://6dev.net/mirror/doc.bughunter.net/buffer-overflow/advanced-malloc-exploits.html,http://eohnik.wordpress.com/2010/11/13/malloc156the-house-of-mind/,http://gee.cs.oswego.edu/dl/html/malloc.html,http://www.codeweblog.com/stag/ptmalloc2-memory-waste/。 - TOC
2个回答

9

好的,我做了一些研究并为许多问题找到了答案。

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

  • 我不知道为什么只有一个 prev 指针。 我知道通常所有动态数据都存储在 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


1
作为纯粹的定义补充:我会使用“arena”来表示原始内存,“heap”包括在其上构建的数据结构。 - peterchen
你应该发布论文!很多用户可能是以英语为母语的,但这只会帮助到某些人,绝对不会是垃圾邮件。 - Achal Dave
1
@AchalDave 我已经添加了这篇论文 :) - newlog

2
一个堆基本上被分成许多小区域,每个区域独立地提供一个或多个已分配的对象。这样的区域可能被称为arena或zone。主要堆是一个包含对象的区域集合,要求一个arena可以在单个操作中被释放。为了使这成为可能,整个arena被分配为一段连续的内存地址范围。
arena或zone之间的区别有点模糊。我不确定Linux是否也是如此,但一个例子是由Cavium网络开发的真实世界多核网络处理器系列Octeon。它将分配的内存视为具有区别的arena或zone,其中区域可以分配具有相同固定大小的对象,而arena可以具有不同大小的对象。这自然会导致arena的碎片化。但我不能确认Linux是否也是这种情况。 基于区域的内存管理

感谢您对整个情况的全面了解。我想我想要更具体的东西,但是搞清楚概念总是有用的。 - newlog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接