Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




При подготовке к работе изучите архитектуру памяти в 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-03; Просмотров: 225; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.