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

Передача памяти зарезервированному региону


Зарезервировав регион, Вы должны, прежде чем обращаться по содержащимся в нем адресам, передать ему физическую память Система выделяет региону физическую память из страничного файла на жестком диске При этом она, разумеется, учитывает свойственный данному процессору размер страниц и передает ресурсы постранично

Для передачи физической памяти вызовите VirtualAlloc еще раз, указав в парамет pe fdwAllocationtype не MEM_RESERVE, a MEM_COMMIT. Обычно указывают тот же ат рибут защиты, что и при резервировании региона, хотя можно задать и другой

Затем сообщите функции VirtuaMlloc, по какому адресу и сколько физической па мяти следует передать. Для этого в параметр pvAddress запишите желательный адрес, а в параметр dwSize — размер физической памяти в байтах Передавать физическую память сразу всему региону необязательно.

Посмотрим, как это делается на практике. Допустим, программа работает на про цессоре x86 и резервирует регион размером 512 Кб, начиная с адреса 5 242 880. За тем Вы передаете физическую память блоку размером 6 Кб, отстоящему от начала зарезервированного региона на 2 Кб. Тогда вызовите VirtualAlloc с флагом MEM_COM MIT так

VirtualAlloc((PVOID) (5242880 + (2 * 1024)), 6 * 1024, MEM_COMMIT, PAGE_READWRITE);

В этом случае система передаст 8 Кб физической памяти в диапазоне адресов от 5 242 880 до 5 251 071 (т. e. 5 242 880 + 8 Кб - 1 байт), и обе переданные страницы получат атрибут защиты PAGE_READWRITE. Страница является минимальной едини цей памяти, которой можно присвоить собственные атрибуты защиты. Следователь но, в регионе могут быть страницы с разными атрибутами защиты (скажем, одна - с атрибутом PAGE_READWRITE, другая — с атрибутом PAGE_READONLY).



Содержание раздела