Составители:
Рубрика:
Если аргумент lpvAddress имеет значение NULL,
функция VirtualAlloc() ок-
ругляет значение аргумента dwsize до ближайшей границы между страница-
ми. Если значение аргумента lpvAddress не равно NULL,
она закрепляет все
страницы, содержащие хотя бы один байт информации в диапазоне адресов
от lpvAddress до lpvAddress + dwSize. Если, например, при выделении двух
байтов памяти заданный адрес пересекает границу двух страниц, то закреп-
ляются две целые страницы. В большинстве систем Windows 98 размер стра-
ницы составляет 4 Кб, но если вы хотите проверить это значение, вызовите
функцию GetSystemInfo().
По завершении процесса система автоматически освобождает использо-
вавшуюся им память. Освободить память, не дожидаясь окончания процесса,
позволяет функция VirtualFree():
BOOL VirtualFree
(LPVOID lpvAddress, // адрес освобождаемого блока
DWORD dwSize, // размер освобождаемого блока
DWORD fdwFreeType // перевести в резерв или освободить);…
Функция VirtualFree() отменяет закрепление набора страниц, оставляя их
адреса зарезервированными, или полностью освобождает память, занимаемую
этими страницами. Закрепление можно отменять маленькими блоками, содер-
жащими как зарезервированные, так и закрепленные страницы.
При освобождении зарезервированных адресов необходимо очищать весь
выделенный блок, причем все страницы этого блока должны находиться в одина-
ковом состоянии – либо в закрепленном, либо в зарезервированном. Аргумент
lpvAddress должен содержать базовый адрес, возвращенный функцией
VirtualAlloc(). Значение аргумента dwSize игнорируется, поскольку сразу освобо-
ждается весь выделенный диапазон. Аргумент dwSize учитывается лишь при от-
мене закрепления отдельных фрагментов. Аргумент fdwFreeType может прини-
мать следующие значения:
– MEM_RELEASE
– освободить зарезервированный регион; при ис-
пользовании этого флага параметр dwSize должен быть равен нулю;
– MEM_DECOMMIT
– освободить выделенную память.
В программах, где используются команды для работы с виртуальной памя-
тью, должен быть предусмотрен механизм «сбора мусора», обеспечивающий ос-
вобождение страниц, которые становятся пустыми. В качестве такого механизма
может применяться низкоприоритетный поток, который время от времени про-
сматривает выделенную область и ищет пустые страницы.
Для изменения атрибутов защиты регионов используются функции
VirtualProtect() и VirtualProtectEx(). Причем первая позволяет изменять атрибуты
защиты в адресном пространстве текущего процесса, а вторая – произвольного.
Рассмотрим подробнее функцию VirtualProtect():
BOOL VirtualProtect
(LPVOID lpvAddress, // адрес защищаемого блока
DWORD dwSize, // размер защищаемого блока
48
Если аргумент lpvAddress имеет значение NULL, функция VirtualAlloc() ок-
ругляет значение аргумента dwsize до ближайшей границы между страница-
ми. Если значение аргумента lpvAddress не равно NULL, она закрепляет все
страницы, содержащие хотя бы один байт информации в диапазоне адресов
от lpvAddress до lpvAddress + dwSize. Если, например, при выделении двух
байтов памяти заданный адрес пересекает границу двух страниц, то закреп-
ляются две целые страницы. В большинстве систем Windows 98 размер стра-
ницы составляет 4 Кб, но если вы хотите проверить это значение, вызовите
функцию GetSystemInfo().
По завершении процесса система автоматически освобождает использо-
вавшуюся им память. Освободить память, не дожидаясь окончания процесса,
позволяет функция VirtualFree():
BOOL VirtualFree
(LPVOID lpvAddress, // адрес освобождаемого блока
DWORD dwSize, // размер освобождаемого блока
DWORD fdwFreeType // перевести в резерв или освободить);…
Функция VirtualFree() отменяет закрепление набора страниц, оставляя их
адреса зарезервированными, или полностью освобождает память, занимаемую
этими страницами. Закрепление можно отменять маленькими блоками, содер-
жащими как зарезервированные, так и закрепленные страницы.
При освобождении зарезервированных адресов необходимо очищать весь
выделенный блок, причем все страницы этого блока должны находиться в одина-
ковом состоянии – либо в закрепленном, либо в зарезервированном. Аргумент
lpvAddress должен содержать базовый адрес, возвращенный функцией
VirtualAlloc(). Значение аргумента dwSize игнорируется, поскольку сразу освобо-
ждается весь выделенный диапазон. Аргумент dwSize учитывается лишь при от-
мене закрепления отдельных фрагментов. Аргумент fdwFreeType может прини-
мать следующие значения:
– MEM_RELEASE – освободить зарезервированный регион; при ис-
пользовании этого флага параметр dwSize должен быть равен нулю;
– MEM_DECOMMIT – освободить выделенную память.
В программах, где используются команды для работы с виртуальной памя-
тью, должен быть предусмотрен механизм «сбора мусора», обеспечивающий ос-
вобождение страниц, которые становятся пустыми. В качестве такого механизма
может применяться низкоприоритетный поток, который время от времени про-
сматривает выделенную область и ищет пустые страницы.
Для изменения атрибутов защиты регионов используются функции
VirtualProtect() и VirtualProtectEx(). Причем первая позволяет изменять атрибуты
защиты в адресном пространстве текущего процесса, а вторая – произвольного.
Рассмотрим подробнее функцию VirtualProtect():
BOOL VirtualProtect
(LPVOID lpvAddress, // адрес защищаемого блока
DWORD dwSize, // размер защищаемого блока
48
Страницы
- « первая
- ‹ предыдущая
- …
- 46
- 47
- 48
- 49
- 50
- …
- следующая ›
- последняя »
