VC6内存管理malloc(2)

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

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

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

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

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

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

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

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

                   

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值