堆管理器原理


image-20240809192157483

image-20240913134039908

image-20240809194720572

获取堆空间的两种方式

image-20240809192654350

  1. 主线程可以用brk,也可以用mmap
  2. 子线程只能用mmap
  3. 主线程如果申请的区域过大的话,会直接用mmapmmap段拿到一段大的空间,如果申请的比较小的话,就直接用brkdata段上面扩展一段空间就可以了。

三个关键词

arena

每个线程都会分配一个arena

image-20240809201019193

chunk

用户申请内存的单位,也是堆管理器管理内存的基本单位,malloc()返回的指针指向一个chunk的数据区域。

malloc申请的一片内存区域就称为chunk

malloc chunk

image-20240810101450041

free chunk

#include <stdio.h>
int main(){
    int *ptr = malloc(0x40);
    free(ptr);
}

指针被free掉之后堆管理器并不会将内存上的数据真的擦除,而只是将此malloc chunk标记为free chunk,这也会造成内存泄露漏洞。

small bin free chunkunsorted bin chunk

image-20240810162328903

large binfree chunk

P标志位:0为free chunk,1为malloc chunk

image-20240810110549820

fast bin free chunk的P信息位会一直为1,是为了避免被其他的free chunk合并

image-20240810110514105

  • 最小的chunkfree掉之后会优先放到fast bin中。

  • chunk8B对齐,页是4KB对齐

  • x64下最小的chunk大小是0x20x86下最小的chunk大小是0x10

top chunk

管理堆管理器分配的剩余空间的大小,即堆管理器向操作系统申请的空间未被使用过的内存,即arena-mallocted chunk - free chunk的内存。

last remainder chunk

一块free chunk被分配后剩余的碎片空间。之后会被放入为unsorted bin中。

bin(垃圾桶/回收站)

image-20240810151036332

unsorted bin

顾名思义,未分类的回收站

  • 管理刚刚释放还未分类的chunk
  • 可以视为空闲chunk回归其所属bin之前的缓冲区

small bin

large bin

fast bin

image-20240810160309301

image-20240810172140667

tcache bin

super fast bin:它比fast bin还要快。


文章作者: 0x00dream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0x00dream !
  目录