堆分配机制
[TOC] 一篇讲的很好的博客
概念明晰
- bins的链表用的是头插法
fd和bk只在bins才有
在堆中prev chunk就是比它地址低的,next chunk就是比它地址高的
- fd,bk指向的chunk的头而不是mem区域
- fastbinsY和bins要区分开来
- 高版本的glibc,如果某个大小的tcache bin满了后再free这个大小的chunk,那么就会尝试进行unlink,如果没满那么是直接放入相应的tcache bin中的
- malloc_consolidate和unsorted bin大循环不是绑在一起的,而是在malloc的过程中,大部分的malloc_consolidate后也会进行unsorted bin大循环
- unsorted bin里面的chunk大小>想要分配的大小,并且在其他bin中都没有合适大小的chunk,那么一定会从unsorted bin进行切割分配
- malloc的时候,不论malloc的大小,首先会去检查每个bins链是否有与malloc相等大小的freechunk。如果没有就去检查bins链中是否有大的freechunk可以切割(除去fastbins链),如果切割,那么就切割大的freechunk,那么切割之后的chunk成为last remainder,并且last remainder会被放入到unsortedbin中(这里往往可以泄露libcbase)。 这篇博客讲的很清楚