Состояния виртуальной памяти процесса

Линейный адрес процесса в 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.

Наши рекомендации