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

Экзамен ОС 2018

.pdf
Скачиваний:
117
Добавлен:
29.01.2018
Размер:
4.67 Mб
Скачать

Оглавление

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

Каждому процессу выделяется диапазон виртуальных адресов от 0x00000000 до 0xFFFFFFFF. Эти 4 Гб адресов система делит примерно пополам, и для кода и данных пользовательского режима отводятся 2 Гб в нижней части памяти. Если быть более точным, то речь идет об виртуальных адресах, начиная с 0x00010000 и кончая

07FFEFFFF.

Вначале все виртуальное адресное пространство процесса свободно. Оно начинает заполняться по мере выполнения программы. Чтобы воспользоваться какой-либо частью этого пространства, в нем нужно создать регион, зарезервировав определенный диапазон адресов. Такая схема позволяет поддерживать разреженные адресные пространства.

Совокупность регионов описывается структурой VAD, которая организована в виде двоичного дерева и хранится в PCB (process control block). Первые регионы для кода, стека, стандартной кучи процесса и ряд других создает операционная система в момент загрузки процесса. Последующие регионы приложение создает самостоятельно.

Защита памяти

Целью защиты памяти является ограничение определенных участков памяти используемых одним процессом от другого

Средства защиты памяти обычно выполняют :

Проверку ячейки памяти на корректность

Проверку разрешения доступа программы к адресуемой ячейке памяти

Проверку прав доступа процесса по отношению к определенной ячейке памяти

Основные классические подходы защиты :

Защита отдельных ячеек памяти

Методы граничных регистров

Методы ключей защиты

Защита памяти по привилегиям.

1)Защита отдельных ячеек памяти Установка в каждой ячейки памяти специального разряда, который запрещает

(если 1 ) или разрешает (если 0) запись в эту ячейку. Недостаток : избыточность в кодировании информации из-за излишне мелкого уровня защищаемого объекта

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

Пример системы с таким типом защиты : ATLAS (страничная организация, однобитовый флаг)

2) Методы граничных регистров Метод граничных регистров используют регистры :

Оглавление

Оглавление

Fence (для однозадачных систем)

Этот регистр разделяет память для процесса и память для ОС При попытке доступа программы к определенной ячейке, проверяется

содержимое регистра (если адрес ячейки больше чем адрес, который находится в регистре - то доступ отклонен, генерируется прерывание)

Данный регистр защищает память пользовательских процессов от ОС, но не защищает память друг от друга.

Base/Bound (для многозадачных систем)

Данный вариант устанавливает верхнюю и нижнюю границу памяти, к которой процесс может обратиться (устанавливает эти границы ОС при загрузке программы)

При каждом обращении к памяти, происходит проверка, находится ли адрес ячейки в определенных пределах памяти. Если нет, то генерируется прерывание и управление передается ОС.

Недостаток : данный метод работает только с непрерывными участками памяти

3) Метод ключей защиты Каждому участку памяти, ОС ставит в соотвествии ключ защиты памяти, также

каждому процессу код ключа программы Участок допускает и чтение и запись если ключи совпадают (или один из них

имеет код 0, это специальное значение для ОС и общих участков памяти)! Таким образом, реализуется принцип “Все или ничего” по отношению к

операциям над памятью.

4) Метод матрицы доступа Каждый процесс имел матрицу, определяющую защиту доступа к его сегментам

Элемент a[i][j] определял доступ i-ого процесса к j-ому сегменту.

5) Защита памяти по привилегиям Кольцевая модель, при которой менее привилегированные программы не

имеют доступа к памяти более привилегированных программ.

Оглавление

Оглавление

Архитектура памяти в Win 32 :

Интерфейсы :

Virtual Memory API - набор функций WinAPI, позволяющих работать с ВАП (рассмотрено позже)

Memory Mapped File API - набор функций WinAPI, позволяющих работать с файлами, отображаемыми в память.

Heap Memory API - набор функций, позволяющих работать с кучами.

Local, Global Memory API - набор функций работы с памятью, совместимых с 16-ти разрядной Windows

CRT - Си рантайм библиотека

Windows 2000+ использует страничную организацию памяти

Каждому процессу ставится в соответствии свой каталог страниц, с этой точки зрения процессы хорошо изолированы друг от друга.

Процессоры, начиная с Intel Pentium (IA) позволяют использовать многоуровневые таблицы страниц, также разрешается одновременное использование страниц различного размера.

На х86 и х64 архитектуре малая страница занимает 4кб, большая 2мб На IA64, 8кб малая, 16 мбайт большая.

Средства защиты памяти :

1)Объектно ориентированная защита памяти - каждый раз, когда процесс открывает указатель на блок адрессов, монитор ссылок безопасности проверяет, разрешен ли доступ процесса к данному объекту.

Оглавление

Оглавление

2)Отдельное АП для каждого процесса - аппаратура запрещает процессу доступ к физическим адресам другого процесса

3)Режим ядра и пользовательский режим

4)Страничный механизм защиты

Каждая виртуальная страница имеет набор признаков, который определяет разрешенные типы доступа в пользовательском режиме и режиме ядра

5) Принудительная очистка страниц, освобождаемых процессами.

Организацией свопинга в Windows 2000+ занимается VMM.

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

VMM использует алгоритм LRU - замещение дольше всех неиспользовавашихся страниц

Локальный алгоритм LRU предотвращает трешинг

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

Состояния страниц :

Valid или Active – страница используется процессом. Она реально существует в ОП и помечена в PTE (Page Table Entries) как присутствующая в

рабочем множестве процесса (P(V)=1, D=0,1).

Standby – содержимое страницы не изменялось (D=0). В PTE страница помечена как отсутствующая (P(V)=0) и переходная (T=1).

Modified – содержимое страницы было изменено (D=1). В PTE страница помечена как отсутствующая (P(V)=0) и переходная (T=1). Free – страница, на которую не ссылается ни один PTE. Страница свободна, но подлежит обнулению, прежде чем будет использована. Zeroed – свободная и обнуленная страница, пригодная к непосредственному использованию любым процессом.

Bad – страница, которая вызывает аппаратные ошибки и не может быть использована ни одним процессом.

VMM периодически просматривает список страниц с установленным флагом Present (Valid) и пытается похитить их у процесса (1). Он помечает их как отсутствующие (P=0), но на самом деле оставляет их в оперативной памяти, только переводит в список Modified или Standby в зависимости от значения бита D из PTE.

Если содержимое страницы была изменено в ОП (D=1), то VMM выполнит запись страницы на диск (4).

Если похищенная страница принадлежит рабочему множеству, то к ней в ближайшее время произойдет обращение. Так как страница помечена как отсутствующая, то обращение к ней вызовет страничное прерывание

Оглавление

Оглавление

(«soft» page fault). Но VMM очень быстро сделает эту страницу вновь доступной процессу, поскольку она находится в оперативной памяти (2). Далее если к странице не будет обращений (страница вне рабочего множества), то она со временем перейдет в состояние Free (5) и станет доступна для замещения страниц в рамках данного процесса (6).

Затем системный поток обнуляет страницу – Zeroed (7), и она станет доступна другим процессам системы (8).

11. Организация «статической» виртуальной памяти. Блоки адресов. Состояния блоков адресов. Функции

Win32 API.

Блоки адресов и состояния.

Получение информации о ВАП : функция GetSystemInfo(LPSYSTEM_INFO lpSysInfo).

Из структуры SYSTEM_INFO можно получить - размер страницы, младший и старший адрес ВАП доступного процессу, Гранулярность блоков адрессов. Гранулярность означает что можно выделять только

те блоки размер которых кратен определенному размеру.

Для управления ВАП существуют такие структуры данных как VAD (virtual address descriptor), которые позволяют вести учет зарезервированных блоков (диапазонов) виртуальных адресов.

Для большей эффективности VAD хранятся в виде сбалансированного двоичного дерева.

Оглавление

Оглавление

Резервирование и выделение памяти производится блоками адресов (VAD). Начальный адрес блока должен быть выровнен на значение dwAllocationGranularity (обычно равно 64K), при необходимости адрес округляется «вниз».

Размер блока должен быть кратен размеру страницы dwPageSize, при необходимости округляется «вверх».

Блок адресов в адресном пространстве процесса может находиться в одном из трех состояний :

выделен (committed) – блоку адресов назначена физическая память либо часть файла подкачки;

зарезервирован (reserved) – блок адресов помечен как занятый, но физическая память не распределена;

свободен (free) – блок адресов не выделен и не зарезервирован.

Организация статической виртуальной памяти и функции WinAPI :

VirtualAlloc() для резервирования региона памяти (можно сразу выделять физ. Память, для этого в качестве параметра flAllocationType нужно передать

MEM_COMMITED)

VirtualAllocEx() аналог VirtualAlloc() только с одним дополнительным параметром - дескриптор процесса, в котором происходит резервирование

Параметры - адрес, размер, тип выделения, аттрибуты защиты

Аттрибуты защиты :

PAGE_READONLY – допускается только чтение.

PAGE_READWRITE – допускается чтение и запись.

PAGE_EXECUTE – допускается только выполнение.

PAGE_EXECUTE_READ – допускается исполнение и чтение.

PAGE_EXECUTE_READWRITE – допускается выполнение, чтение и запись.

PAGE_GUARD – дополнительный флаг защиты, который комбинируется с другими флагами. При первом обращении к странице этот флаг

сбрасывается и возникает исключение STATUS_GUARD_PAGE. Этот флаг используется для контроля размеров стека с возможностью его динамического расширения.

PAGE_NOCACHE – запрещает кэширование страниц. Может быть полезен при разработке драйверов устройств (например, данные в видеобуфер должны переписываться сразу, без кэширования).

Спомощью VirtualAlloc можно выделять большие страницы, для этого в типе выделения нужно передать параметр MEM_LARGE_PAGES, но перед этим нужно получить на это привелегии для процесса с помощью AdjustTokenPrivileges() Функция VirtualAlloc возвращает NULL в кач-ве неудачи

VirtualFree() освобождение ранее зарезервируемого региона памяти

Оглавление

Оглавление

Параметры - адрес, размер, тип освобождения (MEM_RELEASE - освобождение, MEM_DECOMMIT - переводит commited состояние страницы в reserved)

VirtualFreeEx() аналог VirtualFree() так же с доп параметром - дескриптором процесса

VirtualFree возвращает TRUE в случае успеха, FALSE иначе.

VirtualAlloc можно использовать как VirtualFree если в кач-ве flAllocationType передать MEM_DECOMMIT

Выделенные страницы можно заблокировать для использования в ОП, т.е. Запретить их участие в свопинге - функции VirtualLock() и VirtualUnlock() для разблокировки соответственно.

Для изменения атрибутов защиты регионов существуют функции VirtualProtect()

и VirtualProtectEx()

С помощью функций VirtualQuery() и VirtualQueryEx() можно получить состояние региона памяти Параметры - адрес, указатель на адрес информационного буффера, структура

MEMORY_BASIC_INFORMATION (куда будет записан результат), длина этого буффера.

Функции настройки рабочего множества процесса :

SetProcessWorkingSetSize()

Параметры - дескриптор процесса, мин. И макс. Размер рабочего множества (если - 1, то функция нормирует до 0)

GetProcessWorkingSetSize() - получение текущих значений минимального и максимального размера рабочего множества

GetProcessMemoryInfo() - получение расширенной статистики по использованию ВП процесса, например :

Количество страничных прерываний

Текущий и пиковый размер рабочего множества процесса

Текущее и пиковое значение файла подкачки

(Структура, где хранится результат - MEMORY_STATUS)

Оглавление

Оглавление

12. Архитектура памяти в MS Windows 2000+.

Организация «динамической» виртуальной памяти. Назначение и преимущества по сравнению с кучами

ANSI C. Функции Win32 API.

Кучи - динамически распределяемые области данных

При порождении процесса ему преодставляется куча размером 1Мбайт по умолчанию. Ее размер может изменятся параметром /HEAP при построении исполняемого модуля Работа с кучами в ANSI C - malloc, realloc, calloc…

Функции WinAPI :

HeapCreate(dwFlags, dwInitialSize, dwMaximumSize) - создание кучи

HeapDestroy(hHeap) - уничтожение кучи.

GetProcessHeap() - возвращает дескриптор кучи по умолчанию

HeapAlloc(hHeap, dwFlags, dwSize) - выделяет участок памяти из кучи и возвращает указатель на начало этого участка.

hHeap - дескриптор кучи

dwFlags - флаги резервирования памяти dwSize - размер области

HeapReAlloc(hHeap, dwFlags, lpOldBlock, dwSize) - для изменения размера ранее выделенной области памяти с возможностью перемещения блока при необходимости

hHeap - дескриптор кучи

dwFlags - возможно новые флаги резервирования LpOldBlock - указатель на область ранее выделенной памяти dwSize - размер области

HeapFree(hHeap, dwFlags, lpBlock) - для освобождения выделенного блока памяти кучи.

DWORD HeapSize(hHeap, dwFlags, lpBlock) - зная адрес блока памяти, можно определить его размер.

Параметр dwFlags :

HEAP_GENERATE_EXCEPTIONS - указывает системе на то, что в случае возникновения ошибки необходимо генерировать исключительную ситуацию. Это будет происходить во всех случаях, когда функция возвратит значение

NULL

HEAP_NO_SERIALIZE - указывает, что пока выполняется текущий вызов HeapAlloc(), к куче не будут происходить обращения от других потоков.

HEAP_ZERO_MEMORY - указывает, что выделяемая память должна заполнятся нулями. В противном случае, необязательно заполняется нулями.

Оглавление

Оглавление

Блокировка совместно используемой кучи :

HeapLock(hHeap) - блокирует кучу, при использовании данной функции только вызывающий поток имеет доступ к данной куче, другие потоки переводятся в состояние ожидания и встают в очередь, пока удерживающий поток не вызовет функцию HeapUnlock()

HeapUnlock(hHeap) - разблокирует кучу.

Создание дополнительных “куч” :

Для повышения эффективности управления памятью Если элементы какой-либо структуры имеют один размер, а элементы другой

структуры - другой размер, то полезно размещать эти структуры в разных кучах из-за фрагментации ВАП в системах со страничной организацией

Для уменьшения рабочего множества процесса Обращение к элементам одной структуры вызывает подкачку всей страницы, а,

значит и элементов другой структуры. Это увеличивает рабочее множество процесса. В кучах же, происходит подкачка лишь элементов структуры.

Для повышения производительности многопоточных приложений Предоставление кучи для каждого потока уменьшает вероятность появления

состоязательных ситуаций, а след-но, может значительно повысить производительность многопоточных программ.

Для устранения дискриминации между потоками Ни один из потоков не может получить больше памяти, чем распределено для

его кучи.

Для быстрого освобождения всей памяти в куче

Достоинства между кучами ANSI C :

HeapAlloc имеет большую гибкость, чем malloc. В частности, он позволяет указать, какую кучу вы хотите выделить. Это обслуживает несколько куч за каждый процесс.

Используя HeapAlloc() с GetProcessHeap() вместо malloc(), включая перегрузку новых и удаленных операторов, чтобы использовать их, вы можете передавать динамически распределенные объекты между модулями (DLL) и не беспокоиться о повреждении памяти, если память распределена в коде один модуль и освобожден в коде другого модуля, когда указатель на блок памяти передан во внешний модуль.

Однако, в последних версиях компиляторов (мы рассматриваем именно MSVC), malloc является лишь оберткой над HeapAlloc, т.к. В исходном коде функции можно увидеть

Оглавление

Оглавление

нечто вроде : return HeapAlloc(_crtheap, 0, size), где _crtheap - глобальная куча,

созданная опять же с помощью HeapCreate()

(Карлин)

13. Архитектура памяти в MS Windows 2000+.

Проецируемые файлы, назначение и использование.

Функции Win32 API.

Проецируемые файлы

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

Данный механизм не может быть использован для работы по сети, т.е. Работает только на локальной машине.

Применение проецируемых файлов : DLL, запуск exe файлов, для работы с файлами и для IPC (межпроцессное взаимодействие).

Использование при запуске нового процесса :

1)Создание ВАП (размером 4гб)

2)Резервирование в ВАП региона размером, достаточным для размещения исполняемого файла. Начальный адрес региона расположен в заголовке EXE-модуля. Обычно он равен 0x0040000.

3)Создание проекции на зарезервированное адресное пространство

4)Аналогичным образом выполняется проецирование на ВАП процесса необходимых ему динамических связываемых библиотек. Информация о необходимых библиотеках находится в заголовке EXE-модуля. Желательное расположение региона адресов описано внутри библиотеке.

Пример использования файла подкачки и DLL lib:

Оглавление