Обычно адресное окно гораздо больше.
Обычно адресное окно гораздо больше.
Создание эффективных Win32-приложений - ДЖ. Рихтер
// страницы RAM
// уничтожаем адресное окно VirtualFree(pvWindow, 0, MEM_RELEASE);
Как видите, пользоваться AWE несложно. А теперь хочу обратить Ваше внимание на несколько интересных моментов, связанных с этим фрагментом кода.
Вызов VirtualAlloc резервирует адресное окно размером 1 Мб. Обычно адресное окно гораздо больше. Вы должны выбрать его размер в соответствии с объемом блоков оперативной памяти, необходимых Вашему приложению. Но, конечно, размер такого окна ограничен размером самого крупного свободного (и непрерывного!) блока в адресном пространстве процесса. Флаг MEM_RESERVE указывает, что я просто резервирую диапазон адресов, а флаг MEM_PHYSICAL — что в конечном счете этот диапазон адресов будет связан с физической (оперативной) памятью. Механизм AWE требует, чтобы вся память, связываемая с адресным окном, была доступна для чтения и записи; поэтому в данном случае функции VirtualAlloc можно передать только один атрибут защиты — PAGE_READWRITE. Кроме того, нельзя пользоваться функцией VirtualProtect и пытаться изменять тип защиты этого блока памяти.
Для выделения блока в физической памяти надо вызвать функцию AllocateUser- PhysicalPages:
BOOL AllocateUserPhysicalPages(
HANDLE hProcess,
PULONG_PTR pulRAMPages,
PULONG_PTR aRAMPages);
Она выделяет количество страниц оперативной памяти, заданное в значении, на которое указывает параметр pulRAMPages, и закрепляет эти страницы за процессом, определяемым параметром hProcess.
Операционная система назначает каждой странице оперативной памяти номер фрейма страницы (page frame number). По мере того как система отбирает страницы памяти, выделяемые приложению, она вносит соответствующие данные (номер фрейма страницы для каждой страницы оперативной памяти) в массив, на который указывает параметр aRAMPages. Сами по себе эти номера для приложения совершенно бесполезны; Вам не следует просматривать содержимое этого массива и тем более что-либо менять в нем. Вы не узнаете, какие страницы оперативной памяти будут выделены под запрошенный блок, да это и не нужно. Когда эти страницы связываются с адресным окном, они появляются в виде непрерывного блока памяти. А что там система делает для этого, Вас не должно интересовать.