Состояния виртуальной памяти процесса
Линейный адрес процесса в Windows состоит из 32 бит и изменяется в пределах от 0хоооооооо до 0xffffffff. Это теоретически позволяет процессу обращаться к 4 Гбайт логической памяти. В операционных системах семейства Windows NT процессу доступны два младших гигабайта этой памяти с диапазоном адресов от 0хоооооооо до 0x7fffffff, а ее старшие два гигабайта с диапазоном адресов от 0xsooooooo до 0xffffffff используются системой. В операционной системе Windows 98 из 2 Гбайт памяти доступной процессу, операционная система использует еще 64 Кбайт памяти с диапазоном адресов от 0хоооооооо до 0x0000ffff для проверки присваивания значений через указатели, значения которых инициализированы в null, и для поддержки совместимости со старыми операционными системами MS-DOS и Windows 3.1.
В операционных Windows виртуальный адрес процесса отличается от линейного адреса этого же процесса только интерпретацией бит линейного адреса. Поэтому, можно сказать, что каждому процессу в Windows также доступно два гигабайта виртуальной памяти. Это не значит, что процесс может использовать всю эту память одновременно. Количество виртуальной памяти, доступной процессу, зависит от емкости физической памяти и дисков. Чтобы ограничить процесс в использовании виртуальной памяти, некоторые страницы в таблице страниц могут быть помечены как недоступные.
После этих замечаний перейдем к описанию состояния виртуальной памяти процесса. С точки зрения процесса, страницы его виртуальной памяти могут находиться в одном из трех состояний:
□ свободны для использования (free);
□ распределены процессу для использования (committed);
□ зарезервированы, но не используются процессом (reserved).
Резервирование, распределение и освобождение виртуальной памяти
Для резервирования или распределения области виртуальной памяти процесс должен вызвать функцию virtuaiAiioc, которая имеет следующий прототип:
LPVOID VirtuaiAiioc(
LPVOID IpAddress, // область для распределения или резервирования
SIZE_T dwSize, // размер области
DWORD flAllocationType, // тип распределения
DWORD flProtect // тип защиты доступа
);
В случае успешного завершения эта функция возвращает адрес виртуальной памяти, распределенной или зарезервированной процессом, а в случае неудачи — null. При этом отметим такую деталь, если распределение виртуальной памяти функцией virtuaiAiioc завершается успешно, то выделенная память автоматически инициализируется нулями.
Инициализация и копирование блоков виртуальной памяти
Чтобы заполнить блок памяти определенным значением, используется функция FiliMemory, которая имеет следующий прототип:
VOID FiliMemory (
PVOID Destination, // адрес блока памяти
SIZE_T Length, // длина блока
BYTE Fill // символ-заполнитель
);
Эта функция заполняет блок памяти, длина в байтах и базовый адрес которого задаются соответственно параметрами Length и Destination, символом, заданным в параметре Fill.
Если блок памяти необходимо заполнить нулями, то для этого можно использовать функцию zeroMemory, которая имеет следующий прототип:
VOID ZeroMemory (
PVOID Destination, // адрес блока памяти
SIZE_T Length, // длина блока
);
Параметры этой функции имеют то же назначение, что и параметры функции FiliMemory , исключая символ-заполнитель. Для копирования блока виртуальной памяти используется функция CopyMemory, которая имеет следующий прототип:
VOID CopyMemory (
PVOID Destination, // адрес области назначения
CONST VOID *Source, // адрес исходной области
SIZE_T Length // длина блока памяти
Эта функция копирует блок памяти, длина в байтах и базовый адрес которого задаются соответственно параметрами Length и source в область памяти по адресу Destination. Отметим, что результат выполнения функции CopyMemory непредсказуем, если исходный и результирующий блоки памяти перекрываются.
Для копирования перекрывающихся блоков памяти используется функция MoveMemory, которая имеет следующий прототип:
VOID MoveMemory (
PVOID Destination, // адрес области назначения
CONST VOID *Source, // адрес исходной области
SIZE_T Length // длина блока памяти
);
Параметры этой функции полностью совпадают с параметрами функции CopyMemory.