Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Обзор темы работы



При подготовке к работе изучите архитектуру памяти в WIN32. Виртуальное адресное пространство составляет 4 ГБ (232). Отдельный процесс имеет свое адресное пространство, недоступное другим процессам.

Таблица 3.1 – Особенности разбиения адресного пространства для Windows NT

Диапазон адресов Размер (байт) Назначение
000000000h-00000FFFFh   Не используется. Для задания недействительных адресов
0000010000h-07FFEFFFFh 2Гб – 2*64 Кбайт Для процессов пользователя
07FFF0000h-07FFFFFFFh 64 Кбайт Не используется. Для задания недействительных указателей
080000000h-0FFFFFFFFh 2 Гб Для ОС. Недоступны пользователю.

Регионы в адресном пространстве

Резервирование памяти начинается с выделения региона памяти – определения требуемого виртуального адресного пространства.

Для этого используется функция VirtualAlloc:

Эта функция может выделить виртуальную и физическую память. Физическая память, выделенная этой функцией, обнуляется.

LPVOID VirtualAlloc(

LPVOID lpAddress,

DWORD dwSize,

DWORD flAllocationType,

DWORD flProtect

);

lpAddress – определяет начальный адрес выделенной области. Адрес виртуальной памяти выравнивается на границу 64-kilobyte. Если память уже связывается (выделяется физическая память), адрес выравнивается на границе страницы. Для определения размера страницы можно использовать функцию GetSystemInfo. Если это параметр = NULL, система определяет возможность выделения региона.

DwSize – Размер региона в байтах. Если lpAddress= NULL, это значение округляется до границы страницы в сторону увеличения.

FlAllocationType – тип операции выделения. Можно задать флаги или их комбинации:

Таблица 3.2 – Флаги, определяющие тип операции и состояние выделенного участка памяти.

Флаг Назначение
MEM_COMMIT Выделяет физическую память или страничный файл на диске. Попытка повторного выделения той же области не приводит к ошибке
MEM_RESERVE Резервирует виртуальное адресное пространство заданного размера. Зарезервированный диапазон не может использоваться другими функциями, например LocalAlloc. Выделенный регион может быть связан в дальнейшем с физической памятью
MEM_TOP_DOWN Выделяется память в верхней области адресного пространства. В Windows 95 не поддерживаются
FlProtect Тип защиты. Для физической памяти могут быть заданы флаги PAGE_GUARD и PAGE_NOCACHE совместно с флагами, определенными ниже
PAGE_READONLY Страница только для чтения. Используется для физической памяти. Если ОС различает вариант для исполнения, исключение для исполнимых файлов
PAGE_READWRITE r/w
PAGE_EXECUTE Выполнимый
PAGE_EXECUTE_READ r/e
PAGE_EXECUTE_READWRITE r/w/e
PAGE_GUARD Охраняемая (защищенная) страница. Любой доступ к странице – ошибка (см. Гл.7)
PAGE_NOACCESS Выключен доступ к странице, отраженной в физической памяти
PAGE_NOCACHE Не кешируется содержимое страницы. Используется в драйверах
PAGE_WRITECOPY Запись в страницу приводит к тому, что процессу предоставляется личная копия этой страницы физической памяти.
PAGE_EXECUTE_WRITECOPY Любые действия, в т.ч. и исполнение приводит к формированию новой копии.

Возвращаемое значение:

Успех – адрес памяти.

Ошибка – NULL. (GetLastError).

Т.о. VirtualAlloc может выполнить функции:

9) Связать регион страниц с физической памятью, выделенный при предыдущем вызове функции VirtualAlloc.

10) Зарезервировать регион из свободных страниц.

11) Зарезервировать и связать.

Можно выделить большой регион, а затем связать с физической памятью только небольшой блок региона. Связь с физической памятью делается только для того участка, для которого необходимо.

Страницы могут быть в одном из 3-х состояний:

Свободная – страница не зарезервирована и не связана. Такие страницы функция VirtualAlloc может зарезервировать или зарезервировать и связать.

Зарезервированная – не может использоваться другими функциями выделения памяти, но не имеет соответствующего физического адреса. Функция VirtualAlloc может ее связать с физической памятью, но не может повторно зарезервировать. Можно освободить зарезервированные страницы функцией VirtualFree.

Связанные – физическая память выделена и установлены атрибуты доступа. Система фактически инициализирует и загружает выделенные страницы при первой попытке доступа к заданной памяти. Когда завершается процесс, ОС освобождает все закрепленные страницы. Функция VirtualAlloc может повторно связать уже связанные страницы. Функция VirtualFree может освободить физическую память, связанную со страницами.

Если lpAddress!=NULL, функция использует параметры lpAddress и dwSize для вычисления количества требуемых страниц. Если заданное число страниц не может быть выделено, функция завершается ошибочно.

Модификатор защиты PAGE_GUARD устанавливает защиту для страниц.

Для определения состояния памяти целесообразно использовать системный вызов GlobalMemoryStatus.

Синтаксис: BOOL WINAPI GlobalMemoryStatus (LPMEMORYSTATUS lpBuffer);

lpBuffer – указатель на структуру MEMORYSTATUS, которая определена следующим образом:

typedef struct _MEMORYSTATUS {

DWORD dwLength; // размер структуры MEMORYSTATUS

DWORD dwMemoryLoad; // процент использования памяти

SIZE_T dwTotalPhys; // всего физической памяти в байтах

SIZE_T dwAvailPhys; // доступно физической памяти в байтах

SIZE_T dwTotalPageFile; // всего виртуальной памяти в байтах

SIZE_T dwAvailPageFile; // доступно виртуальной памяти

SIZE_T dwTotalVirtual;

/* всего виртуального адресного пространства доступного пользовательскому процессу для собственных нужд в байтах. Зависит от процесса и настроек ОС. Обычно около 2Gb или 3Gb. */

SIZE_T dwAvailVirtual;

/* свободное виртуальное адресное пространство доступное пользовательскому процессу для собственных нужд в байтах */

}MEMORYSTATUS, *LPMEMORYSTATUS;

Перед использованием структуры она должна быть распределена и dwLength должно быть заполнено фактическим размером структуры. Обычно dwLength=sizeof(MEMORYSTATUS).





Дата публикования: 2015-01-13; Прочитано: 174 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...