glibc_malloc_chunk
chunk
在程序执行中,我们称malloc申请的内存为chunk,用malloc_chunk来表示,当程序申请的chunk被free后,会被加入到对应的空闲管理队列。无论chunk的大小、状态如何,他们都是使用同一数据结构——malloc_chunk,只不过是表现形式有所不同。
/*
This struct declaration is misleading (but accurate and necessary).
It declares a "view" into memory allowing access to necessary
fields at known offsets from a given base. See explanation below.
*/
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links -- used only if free. */
struct malloc_chunk* bk_nextsize;
};
根据不同的chunk类型,malloc_chunk会有部分内容选择性“表示”。
堆段中存在的chunk类型如下:
- allocated chunk
- free chunk
- top chunk
- last remainder chunk
allocated chunk
也即分配给用户的chunk。其图示:
图中左方三个箭头依次表示:
- chunk:该Allocated chunk的起始地址;
- mem:该Allocated chunk中用户可用区域的起始地址
- next_chunk:下一个 chunck(无论类型)的起始地址。
- prev_size:若上一个 chunk 可用,则此字段赋值为上一个 chunk 的大小;否则,此字段被用来存储上一个 chunk 的用户数据;
- size:此字段赋值本 chunk 的大小,其最后三位包含标志信息:
- PREV_INUSE § – 置「1」表示上个 chunk 被分配;
- IS_MMAPPED (M) – 置「1」表示这个 chunk 是通过
mmap
申请的(较大的内存);- NON_MAIN_ARENA (N) – 置「1」表示这个 chunk 属于一个 thread arena。
malloc_chunk 中的其余结构成员,如 fd、 bk,没有使用的必要而拿来存储用户数据;
用户请求的大小被转换为内部实际大小,因为需要额外空间存储 malloc_chunk,此外还需要考虑对齐。
free chunk
free chunk就是用户free后释放的chunk。
参考链接
https://sploitfun.wordpress.com/2015/02/10/understanding-glibc-malloc/comment-page-1/
https://blog.csdn.net/maokelong95/article/details/51989081