Основы программирования в Win32API. Марапулец Ю.В. - 46 стр.

UptoLike

Составители: 

адрес блока должен быть выровнен на границу 64 K (округляется вниз), а раз-
мер кратен размеру страницы (округляется вверх). При выделении память
обнуляется.
Для резервирования региона памяти в адресном пространстве процесса
или выделения ее используется функция VirtualAlloc(), а для освобождения
функция VirtualFree().
Функция VirtualAlloc() является базовой при выполнении операций управ-
ления виртуальным адресным пространством. Параметры этой функции опреде-
ляют, какой объем памяти необходимо выделить, в каком месте адресного про-
странства должен располагаться выделенный фрагмент, закреплять ли за ним
физическую память и какой вид защиты следует установить. Функция возвраща-
ет адрес выделенного региона или NULL в случае неудачи:
LPVOID VirtualAlloc
(LPVOID lpvAddress, // адрес для размещения нового блока
DWORD dwSize, // размер нового блока
DWORD fdwAllocationType, // зарезервировать адреса или закрепить
// физическую память
DWORD fdwProtect, // нет доступа, только чтение
// или чтение/запись);…
Функция VirtualAlloc() сначала пробует найти область свободных адресов
размером dwSize байтов, которая начинается с адреса lpvAddress. Для этого
она просматривает дерево VAD. Если необходимая область памяти свободна,
функция возвращает значение lpvAddress. В противном случае она просматри-
вает все адресное пространство и ищет свободный блок памяти достаточного
размера. При обнаружении такого блока функция возвращает его начальный
адрес, иначезначение NULL.
Аргумент fdwAllocationType может принимать значение
MEM_RESERVE,
или MEM_COMMIT, или оба значения одновременно. Для
резервирования определенного интервала адресов функция VirtualAlloc()
создает новый VAD, который отмечает используемую область. Однако эта
функция не выделяет физическую память, из-за чего невозможно использо-
вать зарезервированные адреса. При попытке чтения или записи в зарезер-
вированные страницы возникает ошибка доступа к памяти. С другой сторо-
ны, никакая другая команда выделения памяти не может использовать ранее
зарезервированные адреса. Например, функции GlobalAlloc() и malloc() не
могут разместить новые объекты в области, которая пересекается с зарезер-
вированным адресным пространством. Попытка заставить функцию Virtua-
lAlloc() зарезервировать все доступное адресное пространство (1 Гб) приве-
дет к конфликту: последующие операции выделения памяти не будут
выполняться, даже если указанная функция не задействовала никакой физи-
ческой памяти.
Память не может быть закреплена, если она не зарезервирована. Комбина-
ция флагов MEM_RESERVE
и MEM_COMMIT позволяет одновременно заре-
46
адрес блока должен быть выровнен на границу 64 K (округляется вниз), а раз-
мер кратен размеру страницы (округляется вверх). При выделении память
обнуляется.
     Для резервирования региона памяти в адресном пространстве процесса
или выделения ее используется функция VirtualAlloc(), а для освобождения –
функция VirtualFree().
     Функция VirtualAlloc() является базовой при выполнении операций управ-
ления виртуальным адресным пространством. Параметры этой функции опреде-
ляют, какой объем памяти необходимо выделить, в каком месте адресного про-
странства должен располагаться выделенный фрагмент, закреплять ли за ним
физическую память и какой вид защиты следует установить. Функция возвраща-
ет адрес выделенного региона или NULL в случае неудачи:
LPVOID VirtualAlloc
   (LPVOID lpvAddress,           // адрес для размещения нового блока
   DWORD dwSize,                 // размер нового блока
   DWORD fdwAllocationType, // зарезервировать адреса или закрепить
                                     // физическую память
   DWORD fdwProtect,       // нет доступа, только чтение
                                     // или чтение/запись);…
     Функция VirtualAlloc() сначала пробует найти область свободных адресов
размером dwSize байтов, которая начинается с адреса lpvAddress. Для этого
она просматривает дерево VAD. Если необходимая область памяти свободна,
функция возвращает значение lpvAddress. В противном случае она просматри-
вает все адресное пространство и ищет свободный блок памяти достаточного
размера. При обнаружении такого блока функция возвращает его начальный
адрес, иначе – значение NULL.
     Аргумент      fdwAllocationType     может      принимать      значение
MEM_RESERVE, или MEM_COMMIT, или оба значения одновременно. Для
резервирования определенного интервала адресов функция VirtualAlloc()
создает новый VAD, который отмечает используемую область. Однако эта
функция не выделяет физическую память, из-за чего невозможно использо-
вать зарезервированные адреса. При попытке чтения или записи в зарезер-
вированные страницы возникает ошибка доступа к памяти. С другой сторо-
ны, никакая другая команда выделения памяти не может использовать ранее
зарезервированные адреса. Например, функции GlobalAlloc() и malloc() не
могут разместить новые объекты в области, которая пересекается с зарезер-
вированным адресным пространством. Попытка заставить функцию Virtua-
lAlloc() зарезервировать все доступное адресное пространство (1 Гб) приве-
дет к конфликту: последующие операции выделения памяти не будут
выполняться, даже если указанная функция не задействовала никакой физи-
ческой памяти.
     Память не может быть закреплена, если она не зарезервирована. Комбина-
ция флагов MEM_RESERVE и MEM_COMMIT позволяет одновременно заре-

                                    46