Вот пример, демонстрирующий использование
Вот пример, демонстрирующий использование
Создание эффективных Win32-приложений - ДЖ. Рихтер
Через одно адресное окно единовременно доступен лишь один блок памяти. Это, конечно, усложняет программирование, так как при обращении к другому блоку приходится явно вызывать функции, которые как бы переключают адресное окно на очередной блок.
Вот пример, демонстрирующий использование AWE:
// сначала резервируем для адресного окна регион размером 1 Мб ULONG_PTR ulRAMBytes = 1024 * 1024
PVOID pvWindow = VirtualAlloc(NULL, ulRAMBytes, MEM_RESERVE | MEM_PHYSICAL, PAGE_READWRITE); // получаем размер страниц на данной процессорной платформе SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
// вычисляем, сколько страниц памяти нужно для нашего количества байтов ULONG_PTR ulRAMPages = (ulRAMBytes + sinf.dwPageSize - 1) / sinf.dwPageSize;
// создаем соответствующий массив для номеров фреймов страниц ULONG_PTR aRAMPages[ulRAMPages];
// выделяем страницы оперативной памяти (в полномочиях пользователя // должна быть разрешена блокировка страниц в памяти)
AllocateUserPhysicalPages(
GetCurrentProcess(), // выделяем память для нашего процесса &ulRAMPages, //на входе: количество запрошенных страниц RAM,
// на выходе: количество выделенных страниц RAM
аПДМРадез); // на выходе: специфический массив,
// идентифицирующий выделенные страницы
// назначаем страницы оперативной памяти нашему окну МаризегРЬузТсаТРадеэ^уМТпс^, // адрес адресного окна
и^АМРадеэ, // число элементов в массиве
аПДМРадез); // массив страниц ПАМ
// обращаемся к этим страницам через виртуальный адрес руИ1пСош
// освобождаем блок страниц оперативной памяти FreeUserPhysicalPages(
GetCurrentProcess(), // освобождаем RAM, выделенную нашему процессу &ulRAMPages, //на входе: количество страниц RAM,
//на выходе: количество освобожденных страниц RAM aRAMPages); //на входе: массив, идентифицирующий освобождаемые