VC6内存管理malloc(2)

heap_init调用后,调用_ioinit,第一次进行内存调用malloc,申请256字节,在debug模式,使用malloc_dbg函数。之后调用_nh_malloc_dbg,nh_malloc_dbg调用_heap_alloc_dbg。

VC6内存管理malloc(2)

对256字节的内存申请,还需要加上额外的管理信息,附加到真正的内存申请,附加后的内存大小是真正申请内存的大小。第3个指针指向调用的文件名,第4个变量,表示调用的位置行,第5个变量,真正的内存大小0x100,第7个变量,流水号码,现在是第一次内存申请1。gap被填上4个fd,前后两个gap,像栏杆一样,保护真正的内存。

VC6内存管理malloc(2)

用于管理pHead指向的内存,加入pFirstBlock,pLastBlock管理内存链表中,和进行一些初始化工作。

VC6内存管理malloc(2)

调用_heap_alloc_base函数,实际申请内存大小和sbh_threadhold进行比对,来决定调用那个内存申请函数。还有前后两个cookie大小8个字节申请,所以和1016字节进行比较。

VC6内存管理malloc(2)

调整后block的大小是0x130,包括真正的内存,header,gap,cookie,调整大小(16字节边界),cookie中保存00000131,最后一个bit置1表示是否使用。

VC6内存管理malloc(2)

前面都是计算大小,没有实际申请内存。sbh_alloc_new_region,BITVEC为unsigned int,bitvGroupHi,bitvGroupLo组成为32组,每组64bit,表示内存是否使用。每个header有真正的内存1M,为了管理1M内存使用32个group。每个group有64个listHead,每个listHead有2个指针。为了管理1M内存,使用16k内存的成本。

VC6内存管理malloc(2)

sbh_alloc_new_group内存切的动作。每个group管理32k内存,共8页page。第一个group内存分配使用完,才开始使用第二个group。每个header,不是实际分配1M,是虚拟的概念。每个group使用时,才实际分配page。

VC6内存管理malloc(2)

0xffffffff为-1,作用是进行合并时使用。4080是两个黄色之间的内存大小。去掉边界gap8个字节后,剩余4088字节,为调整到16字节的整数倍,就是4080字节,保留8个字节,未使用。实际申请内存前的准备工作完成。listHead1-63负责16字节,32字节,...,1 008字节,listHead 64负责大于1k内存的管理。

                   VC6内存管理malloc(2)