![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
При подготовке к работе изучите архитектуру памяти в 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; Прочитано: 187 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!