2014-01-15 50 views
-2

好吧,衆所周知GlobalAlloc/GlobalFree/HeapAlloc/HeapFree API正在管理默認堆或用戶定義堆(CreateHeap),每個堆有一些段,每個段都有多個塊。它被稱爲The Freelist而後備列表正在管理每個堆中的空閒塊。VirtualAlloc/VirtualFree vs Heap函數

在扭轉一塊軟件,我發現使用VirtualAlloc分配一大塊內存。基本上我不能說它是一個堆,因爲這個塊是直接從虛擬地址空間分配的,並沒有顯示任何堆的跡象。 但是應用程序中的一些例程將設置自定義Freelist,該應用程序本身由應用程序管理,並用於定義和控制使用VirtualAlloc分配的大塊的空閒部分。

作爲應用程序設置了一個Freelist結構來管理它,我可以稱這個塊爲HEAP嗎?

+3

如果你願意,你可以稱它爲香蕉。你真的想知道什麼? –

+0

我實際上正在破壞該塊並覆蓋應用程序設置的flink/blink指針,我想寫一篇關於它的文章,並且我很害怕將這個分配的塊稱爲堆而被誤認爲是!因爲它不是,它只是應用程序編輯的VAS中的一大塊內存,所以它只能獲得堆的小特性! – JohnnyCat

+0

所以你回答了你自己的問題,這不是一堆。 – Damon

回答

1

VirtualAlloc可成功使用來實現自定義內存管理器。我想這是你的代碼可能做的。它可能使用VirtualAlloc來保留連續的大地址空間,但它最初不會提交它,這意味着沒有從系統中檢索物理內存。空閒列表可能指向這些未提交的地址空間。

VirtualAlloc實際上處於內存管理的最低級別,malloc庫可能實際上是用它來實現的。

+0

實際上,freelist將指向已提交的空間,因爲它指向的塊已被提交然後分配。釋放後,應用程序將通過在該內存部分內設置2個指針並編輯主freelist flink並閃爍來將其添加到freelist。所以這實際上是一個承諾的內存區域,只要大塊的一部分被分配或釋放,就會被訪問。未提交區域是那些在沒有提交的部分可用於分配時將被提交的區域,並且這些檢查全部由應用程序完成。 – JohnnyCat