Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


Резервирование региона с одновременной передачей физической памяти


Иногда нужно одновременно зарезервировать регион и передать ему физическую память. В таком случае VirtualAlloc можно вызвать следующим образом

PVOID pvMem = VirtualAlloc(NULL, 99 * 1024, MEM_PESERVE | MFM_COMMIT, PAGE_READWRITE);1}

Этот вызов содержит запрос на выделение региона размером 99 Кб и передачу ему 99 Кб физической памяти. Обрабатывая этот запрос, система сначала просматривает адресное пространство Вашего процесса, пытаясь найти непрерывную незарезерви рованную область размерим не менее 100 Кб (на машинах с 4-килобайювыми стра ницами) или 104 Кб (на машинах с 8-килобайтовыми страницами).

Система просматривает адресное пространство потому, что в pvAddress указан NULL Если бы он содержал конкретный адрес памяти, система проверила бы только его — подходи! ли по размеру расположенное за ним адресное пространство Ока жись он недостаточным, функция VirtualAlloc вернула бы NULL.

Если системе удается зарезервировать подходящий регион, она передает ему фи зическую память. И регион, и переданная память получают один атрибут защиты — в данном случае PAGE_READWRITE.

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

Конечно, при резервировании региона с одновременной передачей ему памяти можно указать в парметре pvAddress конкретный адрес или запросить систему подо брать свободное место в верхней части адресного пространства процесса. Последнее реализуют так- в параметр pvAddress заносят NULL, a значение парамегра fdwAlloca tionType комбинируют с флагом MEM_TOP_DOWN.




Начало  Назад  Вперед