HeapAlloc内部算法

本文探讨了Windows中HeapAlloc内存分配的内部工作原理,包括数据结构、分配与释放算法,以及内存粘合的过程。通过创建自己的堆并观察内存变化,详细解析了HeapAlloc如何在free list中查找合适大小的chunk进行分配。此外,还提到了免费块的管理以及在释放时如何进行碎片整理。最后指出,虽然存在lookaside表以提高效率,但在某些情况下可能未被使用。
摘要由CSDN通过智能技术生成

大家都知道在VC中使用new操作符时(如果没有重载的话),其内部实际上调用了标准的malloc,而根据工程设置中选择的运行库的不同(是否多线程,是否调试,是否Dll等)调用了不同的malloc版本,多线程版malloc内部使用了Win32的关键区,而调试版会额外多申请一些内存用来保存调试信息,这些直接看VC附带的crt源码就可以看到。所有版本的malloc的共同点是最后都调用了Win32的API函数HeapAlloc。

关于HeapAlloc的算法记得很多年前一个后来去了微软的大牛给我讲过,但当时我还是个菜鸟(现在没那么菜了)没记住,于是决定自己研究一下。方法是用HeapCreate自己建一个堆,用HeapAlloc从里面申请内存,同时用VC的内存查看盯着heap所在内存区看,观察Alloc和Free的时候内存都发生了哪些变化。其间从网上找到这篇文档帮助比较大,节省了不少时间 XPSP2 Heap Exploitation.ppt(用google搜第一条就是)

Heap头的结构基本没搞明白(也不需要太关心),只知道在偏移地址0x28的位置记录的是剩余空间大小(单位是8字节),然后从0x178开始是一个free list 表(数组),一共128个单元,每个单元的数组下标代表这个链上每个节点(free chunk)是多大(包括chunk header所占空间,单位是8字节)。所以记录的是0~1024(128×8)大小的free chunk链,每个单元是一个循环链表,Flink和Plink指针共占用8个字节。第0号单元比较特殊,它维护的是大小>=

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值