Получение самого низкого адреса свободной виртуальной памяти в Windows

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

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

2 ответа

Решение

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

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

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

Другие вопросы по тегам