Получение самого низкого адреса свободной виртуальной памяти в Windows - PullRequest
0 голосов
/ 08 июля 2010

Название говорит об этом почти все: есть ли способ получить самый низкий адрес свободной виртуальной памяти под Windows? Я должен добавить, что меня интересует эта информация в начале программы (до того, как будет выполнено динамическое выделение памяти).

Зачем мне это нужно: пытаться построить malloc реализацию под Windows. Если это невозможно, мне действительно нужно, чтобы VirtualAlloc() возвращалось, когда в качестве первого параметра задано NULL. В то время как вы ожидаете, что он сделает что-то разумное, например, выделение памяти в нижней части того, что доступно, никаких гарантий нет.

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

Это можно реализовать самостоятельно, используя VirtualQuery для поиска страниц, помеченных как свободные. Это было бы относительно медленно, хотя. (Вам также необходимо учитывать гранулярность выделения, которая отличается от размера страницы.)

Я скажу, что если вам не нужны смежные блоки памяти, пытаться держать все близко друг к другу в основном бессмысленно, поскольку, если две страницы виртуальной памяти могут находиться рядом в адресном пространстве, нет никаких оснований предполагать, что близко друг к другу в физической памяти. На самом деле, даже если они в какой-то момент времени находятся близко друг к другу, если эти страницы перемещаются в резервное хранилище и затем возвращаются обратно в память, страница не будет возвращаться к той же странице физического адреса.

0 голосов
/ 08 июля 2010

ОС использует более сложные метрики, чем просто самый низкий доступный адрес памяти. В частности, VirtualAlloc выделяет страницы памяти, поэтому в зависимости от того, сколько вы запрашиваете, по крайней мере одна страница неиспользуемого адресного пространства должна быть доступна по начальному адресу. Поэтому, даже если вы считаете, что есть «более низкий» адрес, который он должен был использовать, этот адрес мог быть несовместим с запрашиваемой вами операцией.

...