Программное обеспечение САПР. Операционные системы. Майстренко Н.В - 17 стр.

UptoLike

LPVOID VirtualAlloc(
LPVOID IpAddress, // Адрес резервируемой или
// выделяемой области.
DWORD dwSise, // Объем области.
DWORD flAllocationType, // Тип распределения.
DWORD flProtect // Тип защиты от доступа.
);
Параметр flAllocationType может принимать значения следующих констант (помимо других):
1) MEM_RESERVE – параметр, резервирующий область виртуального адресного пространства процесса без выделения
физической памяти. Тем не менее, память может быть выделена при следующем вызове этой же функции;
2) МЕМ_СОММIТпараметр, выделяющий физическую память в оперативной памяти или в файле подкачки на диске
для заданного зарезервированного набора страниц.
Эти две константы могут объединяться для того, чтобы зарезервировать и выделить память одной операцией.
Разделение процедур резервирования и передачи памяти имеет некоторые преимущества. Например, резервирование
памяти является очень полезной процедурой с точки зрения практичности. Если приложению требуется большой объем па-
мяти, можно зарезервировать всю память, а выделить только ту часть, которая нужна в данный момент, раздвигая, таким
образом, временные рамки более трудоемкой операции выделения физической памяти.
Windows тоже использует этот подход, когда выделяет память под стек каждого вновь создаваемого потока. Система
резервирует 1 Мб виртуальной памяти под стек каждого потока, но выделяет первоначально только две страницы (8 Кб).
Защита памяти
Параметр flProtect функции virtualAlloc используется для задания типа защиты от доступа, соответствующего вновь вы-
деленной виртуальной памяти (это не относится к резервируемой памяти). Существуют следующие методы защиты:
1) PAGE_READONLY присваивает доступ "только для чтения" выделенной виртуальной памяти;
2) PAGE_READWRITE назначает доступ "чтение-запись" выделенной виртуальной памяти;
3) PAGE_WRITECOPY устанавливает доступ "запись копированием" (сору-оnwrite) выделенной виртуальной памяти.
4) PAGE_EXECUTE разрешает доступ "выполнение" выделенной виртуальной памяти. Тем не менее, любая попытка
чтениязаписи этой памяти приведет к нарушению доступа;
5) PAGE_EXECUTE_READ назначает доступ "выполнение" и "чтение";
6) PAGE_EXECUTE_READWRITE разрешает доступ "выполнение", "чтение" и "запись";
7) PAGE_EXECUTE_WRITECOPY присваивает доступ "выполнение", "чтение" и "запись копированием";
8) PAGE_NOACCESS запрещает все виды доступа к выделенной виртуальной памяти.
Любые из этих значений, за исключением PAGE_NOACCESS, могут комбинироваться при помощи логического опера-
тора OR со следующими двумя флагами:
1) PAGE_GUARD определяет помеченные страницы как защищенные (guard page). При любой попытке обращения к
защищенной странице система возбуждает исключительную ситуацию STATUS_GUARD_PAGE и снимает с данной страни-
цы статус защищенной. Таким образом, защищенные страницы предупреждают только о первом обращении к ним;
2) PAGE_NOCACHES запрещает кэширование выделенной памяти.
Следует знать, что такое доступ "запись копированием". Допустим, некоторая страница физической памяти совместно
используется двумя процессами. Если она помечена как "только для чтения", то два процесса без проблем могут совместно
пользоваться этой страницей. Однако возможны ситуации, когда каждому процессу требуется разрешить запись в эту па-
мять, но без воздействия на другой процесс. После установки защиты "запись копированием" при попытке записи в совмест-
но используемую страницу система создаст ее копию специально для процесса, которому нужно осуществить запись. Таким
образом, данная страница перестает быть совместно используемой, а представление ее данных в других процессах остается
неизменным.
Необходимо отметить, что атрибуты защиты страницы могут быть изменены с помощью API-функции Virtual Protect.
Пример использования функции GlobalMemoryStatus
API-функция GlobalMemoryStatus, записывающаяся таким образом:
procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); stdcall;
procedure GlobalMemoryStatus; external kernel32 name 'GlobalMemory-Status';
выводит множество данных, имеющих отношение к памяти, в составе следующей структуры:
struct _MEMORYSTATUS { // Размер структуры
DWORD dwLength; // MEMORYSTATUS.
DWORD dwMernoryLoad; // Процент используемой памяти.
DWORD dwTotalPhys; // Количество байтов физической
// памяти.
DWORD dwАvailPhys; // Количество свободных байтов
// физической памяти.
DWORD dwTotalPageFile; // Размер в байтах файла
// подкачки.
DWORD dwAvailPageFile; // Количество свободных байтов
// файла подкачки.
DWORD dwTotalVirtual; // Количество байтов адресного
// пространства,