软件调试笔记38 - 堆和堆检查 : 堆的创建和销毁
2017-12-06 12:49
656 查看
进程的默认堆:
WINDOWS在创建进程的时候,在加载函数执行进程的用户态初始化阶段,会调用RtlCreateHeap函数创建第一个堆,称为默认堆或进程堆。创建好的堆句柄保存在PET的ProcessHeap字段。
创建私有堆:
应用程序也可以通过API HeapCreate创建其他堆,只能被进程自己访问,所以称为私有堆。
HeapCreate主要调用RtlCreateHeap函数,因此私有堆跟默认堆并没有本质的差异,只是用途不同。RtlCreateHeap调用ZwAllocateVirtualMemory从内存管理器申请内存空间,初始化用于维护堆的数据结构,最后将堆句柄记录到PEB中。
堆列表:
销毁堆:
应用程序可以调用HeapDestroy销毁私有堆。它主要是调用NTDLL中的RtlDestroyHeap函数。后者从PEB堆列表中将要销毁的堆句柄移除,然后调用NtFreeVirtualMemory向内存管理器归还内存。
WINDOWS在创建进程的时候,在加载函数执行进程的用户态初始化阶段,会调用RtlCreateHeap函数创建第一个堆,称为默认堆或进程堆。创建好的堆句柄保存在PET的ProcessHeap字段。
创建私有堆:
应用程序也可以通过API HeapCreate创建其他堆,只能被进程自己访问,所以称为私有堆。
HeapCreate主要调用RtlCreateHeap函数,因此私有堆跟默认堆并没有本质的差异,只是用途不同。RtlCreateHeap调用ZwAllocateVirtualMemory从内存管理器申请内存空间,初始化用于维护堆的数据结构,最后将堆句柄记录到PEB中。
堆列表:
销毁堆:
应用程序可以调用HeapDestroy销毁私有堆。它主要是调用NTDLL中的RtlDestroyHeap函数。后者从PEB堆列表中将要销毁的堆句柄移除,然后调用NtFreeVirtualMemory向内存管理器归还内存。
相关文章推荐
- 软件调试笔记40 - 堆和堆检查 : 堆的内部结构
- 软件调试笔记44 - 堆和堆检查 : 堆缓冲区溢出
- 软件调试笔记31 - 栈和函数调用:栈的创建
- 软件调试笔记39 - 堆和堆检查 : 堆的分配和释放
- 软件调试笔记41 - 堆和堆检查 : 低碎片堆
- 软件调试笔记27 - 编译器的调试支持 :编译期检查
- 软件调试笔记45 - 堆和堆检查 :页堆,准页堆
- 软件调试笔记47 - 堆和堆检查 :泄漏转储
- 软件调试笔记36 - 栈和函数调用: 变量检查和Cookie
- 软件调试笔记48 - 堆和堆检查 :堆常用调试功能
- 软件调试笔记43 - 堆和堆检查 : 堆回溯数据库
- 软件调试笔记37 - 堆和堆检查 : 堆概览
- 软件调试笔记42 - 堆和堆检查 : 堆的调试支持
- 软件调试笔记46 - 堆和堆检查 :CRT堆
- Object-C 对象 (创建/销毁 对象)-- 笔记
- 软件调试笔记35 - 栈和函数调用: 栈空间的增长和溢出
- 软件调试笔记4 - 中断和异常
- Effective Java - Ch 02 创建和销毁对象笔记
- XMind思维导图软件中如何创建、切换印象笔记账号?
- java教学笔记之对象的创建与销毁