


获取堆空间的两种方式

- 主线程可以用
brk,也可以用mmap - 子线程只能用
mmap - 主线程如果申请的区域过大的话,会直接用
mmap在mmap段拿到一段大的空间,如果申请的比较小的话,就直接用brk在data段上面扩展一段空间就可以了。
三个关键词
arena
每个线程都会分配一个arena

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

free chunk
#include <stdio.h>
int main(){
int *ptr = malloc(0x40);
free(ptr);
}
指针被free掉之后堆管理器并不会将内存上的数据真的擦除,而只是将此malloc chunk标记为free chunk,这也会造成内存泄露漏洞。
small bin free chunk 和 unsorted bin chunk

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

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

最小的
chunk被free掉之后会优先放到fast bin中。chunk是8B对齐,页是4KB对齐x64下最小的chunk大小是0x20,x86下最小的chunk大小是0x10
top chunk
管理堆管理器分配的剩余空间的大小,即堆管理器向操作系统申请的空间未被使用过的内存,即arena-mallocted chunk - free chunk的内存。
last remainder chunk
一块free chunk被分配后剩余的碎片空间。之后会被放入为unsorted bin中。
bin(垃圾桶/回收站)

unsorted bin
顾名思义,未分类的回收站
- 管理刚刚释放还未分类的
chunk - 可以视为空闲
chunk回归其所属bin之前的缓冲区
small bin
large bin
fast bin


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