堆相关数据结构

本文详细介绍了Linux中ptmalloc的堆相关数据结构,包括malloc_chunk、bin(fast bin, small bin, large bin, unsorted bin)、top chunk和last remainder的概念与管理方式。通过分析malloc和free的流程,揭示了内存分配和回收的细节,以及malloc_consolidate的作用。同时,讨论了arena、heap_info和malloc_state在宏观层面的角色。" 45500697,432374,Swift语言中的元组使用详解,"['swift', '编程语言', '元组']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆相关数据结构

参考:

https://zhuanlan.zhihu.com/p/77320388

https://ctf-wiki.org/pwn/linux/user-mode/heap/ptmalloc2/heap-structure/

1.微观结构

1.1 malloc_chunk

在程序的执行过程中,我们称由 malloc 申请的内存为 chunk 。这块内存在 ptmalloc 内部用 malloc_chunk 结构体来表示。当程序申请的 chunk 被 free 后,会被加入到相应的空闲管理列表中。

1.1.1 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;
};

每个字段的具体的解释如下

  • prev_size, 如果该 chunk 的**物理相邻的前一地址 chunk(两个指针的地址差值为前一 chunk 大小)**是空闲的话,那该字段记录的是前一个 chunk 的大小 (包括 chunk 头)。否则,当前chunk的prev_size字段被前一个chunk使用,这就是chunk的空间复用。这里的前一 chunk 指的是较低地址的 chunk

    如下所示:

    chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Size of previous chunk, if unallocated (P clear)  |
            +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
            |             Size of chunk, in bytes                     |A|M|P|
      mem-> +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值