malloc & new & VirtualAlloc

在windows系统中, 用户层, 分配内存系统最终会去调用VirtualAlloc.

但是malloc, free却不是直接调用他。
malloc, free是调用 API: HeapCreate, HeapAlloc, HeapFree
这3个api又会去调用 VirtualAlloc, VirtualFree, VirtualProtect.

一般流程是这样,
一个pe被加载的时候, 他一定有一个已经create的heap, 这属于pe结构的一部分。
系统加载的时候一定会创建一个在pe结构中描述的heap大小。 这个heap是
系统的第一个heap, 
可有2个api GetProcessHeap GetProcessHeaps 来完成这个功能(得到heap 的handle)

当你调用malloc的时候, 会转换成调用api heapalloc
heapalloc的工作原理:
就是在自己已经分配好的内存上修改自己的属性(调用virtualprotect,把原来
no access的属性改成可读写)

如果heapalloc失败了, 那么malloc会去调用heapcreate, 重新建立一个堆,
heapcreate工作原理:
分配一个内存(调用virtualalloc),返回一个handle,并且可通过这个hanle来管理这个内存


现在heapcreate分配了一个比较大的内存(这个大小是malloc函数管理的, 比如
你malloc(100),  那么heapcreate最少会分出4096字节出来, 因为386内存的页
的大小就是这么大), 并且把这4096字节都设置成不可访问。

heapcreate后, malloc又去调用一次heapalloc, 也就是把这4096的大小, 
搞出100字节可访问 (其实也是4096可访问, 还是因为内存页是4k对齐问题)


大概流程就这样, 但其中很多小细节, 包括内部用连表的形式表示了那heapcreate出来的
(virtualalloc)出来的一个 内存 (heap )(可通过heap 的handle 来访问), 
具体哪快是有效, 调用过(heapalloc)(malloc), 哪快已经释放了,
目前的heap的大小是否不够当前malloc的值, 是否需要重新建立堆等。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值