heap - 1 - arena

堆的 管理者

1. 什么是 arena

堆,是内存分配所用的内存,在计算机世界中是一种比较复杂的部件,里面有大量的信息需要被管理
arena,就是管理堆的一个结构

2. arena 的特点

一个线程只有一个arena,这些arena是互不相同的。
主线程的arena称为main_arena,子线程的arena称为thread_arena

3. arena 的数量限制

并不是每个线程都有一个arena,其个数是有限制的。

由于笔者在写这篇文章时,所涉猎的堆漏洞类型暂时没有涉及arena的其他知识,故此处留坑。

4. arena 的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
----------- Internal state representation and initialization -----------
*/

struct malloc_state
{
/* Serialize access. */
mutex_t mutex;

/* Flags (formerly in max_fast). */
int flags;

/* Fastbins */
mfastbinptr fastbinsY[NFASTBINS];

/* Base of the topmost chunk -- not otherwise kept in a bin */
mchunkptr top;

/* The remainder from the most recent split of a small request */
mchunkptr last_remainder;

/* Normal bins packed as described above */
mchunkptr bins[NBINS * 2 - 2];

/* Bitmap of bins */
unsigned int binmap[BINMAPSIZE];

/* Linked list */
struct malloc_state *next;

/* Linked list for free arenas. Access to this field is serialized
by free_list_lock in arena.c. */
struct malloc_state *next_free;

/* Number of threads attached to this arena. 0 if the arena is on
the free list. Access to this field is serialized by
free_list_lock in arena.c. */
INTERNAL_SIZE_T attached_threads;

/* Memory allocated from the system in this arena. */
INTERNAL_SIZE_T system_mem;
INTERNAL_SIZE_T max_system_mem;
};
  • glibc中的arena使用的就是此结构体。
  • 该结构体包含了各种信息,例如bin链的头地址、topchunk的地址以及last remainder地址等等
  • 成员binmap用于记录bin的相关信息,例如某个bin是否为空
    • 当需要遍历bin时,可以转而遍历binmap,以减小直接遍历bin时的 内存页载入、搜索、切换到下一个内存页等等 所带来的时间消耗
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2020-2024 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~