Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
17.04.2013
Размер:
374.27 Кб
Скачать

Адресное пространство процесса

Виртуальное адресное пространство процесса (4GB) делится на две части: в младших адресах размещаются программа и данные процесса, а в верхних – системные программы и данные общие для всех процессов.

Отображение для старших адресов осуществляется через глобальные таблицы страниц, на которые имеются ссылки из каталогов страниц каждого процесса. В битах защиты имеется специальный бит доступа, который определяет в каком режиме (пользовательском или ядра) возможно обращение к странице. Попытка обратиться ко второй половине адресов в пользовательском режиме приведет к прерыванию по защите памяти.

Начиная с SP3 NT 4.0 позволяет изменять границу между пользовательской и системной частями адресного пространства процесса (для всех процессов!). В файле boot.ini можно установить ключ /3GB, по которому пользовательская часть составит 3GB, а системная -1GB.

Резервирование памятивыполняется в NT в два этапа: резервирование диапазона адресов в виртуальном адресном пространстве и предоставление диапазона адресов. При резервировании память не выделяется ни в физической памяти ни в страничном файле. Если процесс хочет использовать память, он должен затребовать ее предоставление из ранее зарезервированного диапазона.

// Резервирование 10МВ

lpBase = VirtualAlloc(NULL, 10485760, MEM_RESERVE, PAGE_NOACCESS);

Значение NULL первого параметра говорит, что положение в памяти безразлично (можно указать желаемый виртуальный адрес начала региона). Возвращаемое значение – адрес зарезервированного региона. Второй параметр определяет размер региона (минимальный размер – 64К, максимальный 2GB). Третий параметр определяет тип запроса:MEM_RESERVEилиMEM_COMMIT(их можно объединять). Четвертый параметр задает атрибуты защиты:PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE.

При предоставлении памяти Memory Manager проверяет наличие затребованного объема в физической памяти и в страничных файлах.

Раздельное резервирование и предоставление памяти имеет смысл. Например, Memory Manager резервирует 1MB для стека процесса, но предоставляет только одну страницу памяти (4К). Если стек заполняет страницу, то предоставляется дополнительная страница из зарезервированного диапазона.

NT отслеживает зарезервированные и предоставленные диапазоны адресов в древовидной структуре, состоящей из Virtual Address Descriptors (VADs). Указатель корня дерева хранится в блоке управления процессом. Каждый узел дерева описывает диапазон страниц с идентичными характеристиками по защите и предоставлению.

Освобождение и отказ от предоставленной памяти осуществляется вызовом функции VirtualFree. При отказе от предоставленной памяти требуется указывать размер памяти такой же, как при ее предоставлении. Нельзя освободить два ранее предоставленных блока в одном вызове, даже если они расположены рядом.

// Освобождение 3-й страницы

VirtualFree(lpBase + 2*4096, 4096, MEM_DECOMMIT, PAGE_NOACCESS);

// Освобождение всей предоставленной и зарезервированной памяти

VirtualFree(lpBase, 10485760, MEM_RELEASE, PAGE_NOACCESS);

Соседние файлы в папке вар1