Windows для профессионалов

       

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


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

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

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

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

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).



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