VirtualAlloc/VirtualFree 与堆函数 [关闭]

Posted

技术标签:

【中文标题】VirtualAlloc/VirtualFree 与堆函数 [关闭]【英文标题】:VirtualAlloc/VirtualFree vs Heap Functions [closed] 【发布时间】:2014-01-15 20:20:19 【问题描述】:

好吧,众所周知,GlobalAlloc/GlobalFree/HeapAlloc/HeapFree API 正在管理默认堆或用户定义的堆 (CreateHeap),每个堆都有段,每个段都有多个块。众所周知,Freelist 和后备列表正在管理每个堆中的空闲块。

In 正在反转一个软件,我发现它正在使用 VirtualAlloc 来分配一大块内存。基本上我不能说它是一个堆,因为该块是直接从虚拟地址空间分配的,并且它没有显示出任何堆的迹象。 但是应用程序中的一些例程会设置一个自定义的 Freelist,它本身由应用程序管理,它用于定义和控制使用 VirtualAlloc 分配的大块的空闲部分。

我可以将此块称为 HEAP,因为应用程序已经设置了一个管理它的 Freelist 结构吗?

【问题讨论】:

如果你愿意,你可以称它为香蕉。你真正想知道什么? 我实际上正在破坏该块并覆盖应用程序设置的 flink/blink 指针,我想写一篇关于它的文章,我害怕将分配的块称为一堆!因为它不是,它只是应用程序编辑的 VAS 中的一块内存,因此它可以获得堆的一些特性! 所以你回答了你自己的问题,它不是一个堆。 我只是想确定一下,谢谢! 【参考方案1】:

VirtualAlloc 可以成功地用于实现自定义内存管理器。我想这就是您的代码可能正在做的事情。它可能使用 VirtualAlloc 来保留连续的大地址空间,但它最初并没有提交它,这意味着没有从系统中检索物理内存。空闲列表可能指向此类未提交的地址空间。

VirtualAlloc 在内存管理方面实际上处于最低级别,malloc 库可能实际上是使用它来实现的。

【讨论】:

其实freelist会指向一个commited空间,因为它指向的block是commited然后分配的。释放后,应用程序将通过在该内存部分设置 2 个指针并编辑主 freelist flink 和 blink 将其添加到 freelist。所以这实际上是一个已提交的内存区域,只要分配或释放大块的一部分,就会访问该区域。未提交区域是指当没有可用于分配的已提交部分时将提交的区域,并且这些检查都由应用程序完成。

以上是关于VirtualAlloc/VirtualFree 与堆函数 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章