堆基础-glibc_malloc_chunk

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。

Free chunk

  • prev_size: 两个相邻 free chunk 会被合并成一个,因此该字段总是保存前一个 allocated chunk 的用户数据;
  • size: 该字段保存本 free chunk 的大小;
  • fd: Forward pointer —— 本字段指向同一 bin 中的下个 free chunk(free chunk 链表的前驱指针);
  • bk: Backward pointer —— 本字段指向同一 bin 中的上个 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值