malloc & new & VirtualAlloc

来源:互联网 发布:同花顺编程公式 编辑:程序博客网 时间:2024/06/03 15:49

在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的值, 是否需要重新建立堆等。。

原创粉丝点击