
- •Введение
- •Эволюция ос.
- •Классификация ос.
- •Краткий обзор архитектуры Windows.
- •Основные системные файлы Windows 95, nt, 2000.
- •Средства аппаратной поддержки управления памятью.
- •Сегментная организация памяти.
- •Страничная или сегментно-страничная организация памяти.
- •Механизмы управления памятью Windows.
- •Раздел 4. В него загружаются ядро Windows nt и драйверы устройств. Этот раздел полностью защищен и по чтению, и по записи. Регионы в адресном пространстве.
- •Системные переменные и операционные системы.
- •Передача физической памяти региону.
- •Механизм выделения страниц физической памяти.
- •Выделение физической памяти под программный код.
- •Атрибуты защиты страниц.
- •Стек потока.
- •Стек потока под Windows 95, 98.
- •Функции компилятора для контроля стека.
- •Кучи (Heaps).
- •Особенности кучи в Windows 95, Windows nt.
- •Структура арены.
- •Рассмотрим функции работы с кучей.
- •Удаление кучи.
- •Выделение блока памяти в определённой куче.
- •Освобождение блока кучи.
- •Дополнительные кучи Win32 процесса.
- •Создание дополнительных куч для эффективного управления памятью.
- •Локальный доступ. Создание дополнительных куч для локализации доступа.
- •Файлы проецируемые в память (фпвп).
- •Проецирование в память exe и dll файлов.
- •Совместное использование статических данных несколькими экземплярами exe и dll модулей.
- •Иерархия функций работы с памятью.
- •Объекты kernel32.Dll.
- •Процессы.
- •Структуры данных процесса.
- •Структура блока pdb.
- •Блок kprocess.
- •Блок переменных окружения (peb).
- •Переменная ядра, связанная с процессами.
- •Последовательность действий, выполняемых функцией CreateProcess.
- •Потоки.
- •Основные функции для работы с потоками.
- •Управляющие структуры ос для работы с потоками.
- •Описание структур управления потоками.
- •Управление потоками.
- •Лекция № 11
- •Функции Win32 связанные с планированием.
- •Учёт квантов времени.
- •Сценарий планирования.
- •Поток простоя.
- •Динамическое повышение приоритета потока.
- •Планирование потоков в системах с симметричной мультипроцессорной системой (smp).
- •Синхронизация.
- •Синхронизация потоков без использования объектов синхронизации.
- •Синхронизация потоков.
- •Критические секции.
- •Работа потока с несколькими критическими секциями.
- •Синхронизация объектов.
- •События со сбросом вручную.
- •События с автоматическим сбросом.
- •Модули.
- •Структура imte.
- •Структура modref.
- •Файлы. Формат pe файла.
- •Особенности ре формата:
- •Заголовок ре файла.
- •Основные секции исполняемого файла.
- •.Idata bfc0847d .Text jmp dword ptr [00040042 … call 00014408 (Вызов GetMessage) Прикладная программа
- •Импортирование ре файлов.
- •Эскпорт ре файлов.
- •Лекция № 15
- •Ресурсы ре файла.
- •Базовые поправки ре файла.
- •Файловые системы.
- •Загрузочный сектор.
- •Особенности ntfs.
- •Новые возможности ntfs.
- •Структура ntfs на диске.
- •Кластеры.
- •Главная таблица файлов.
- •Структура файловых ссылок.
- •Записи о файлах.
- •Индексация имён файлов.
- •Битовая карта.
- •Восстанавливаемость ntfs.
- •Журнал транзакций.
- •Записи контрольной точки.
- •Восстановление данных в ntfs.
- •Проход повтора.
- •Проход отмены.
- •Отказоустойчивость ntfs.
- •Словарь терминов.
Освобождение блока кучи.
HeapFree(…).
проверка параметров.
захват CriticalSection.
если перед освобождаемым блоком уже есть свободный блок, то они сливаются в один.
фактическое освобождение блока, возврат его в кучу.
освобождение CriticalSection.
арена
свободный
блок
арена
освобождаемый блок
Перед HeapFree(…) стоит задача нахождения свободного блока. При освобождении блока в старших 4-х байтах свободного блока всегда записан адрес арены этого блока. Надо опуститься вниз на 4 байта и извлечь начало предыдущего блока.
Дополнительные кучи Win32 процесса.
Создаются по следующим причинам:
для защиты компонентов кучи.
для более эффективного управления памятью.
для локализации доступа.
Рассмотрим вариант 1. Пусть есть 2 потока:
A3 …
B1
A2
B2
B3
A1
Thread1 – Func1 – A
Thread2 – Func2 – B
куча
Имеется ошибка в программном коде Func1, которая приводит к тому, что после заполнения А1 записывается несколько дополнительных байт. Будут запорчены данные В3.
Программист сделает предположение, что ошибка в коде функции Func2. А если бы исполь-зовались 2 разные кучи, то локализовать ошибку легче.
Лекция № 7
Создание дополнительных куч для эффективного управления памятью.
А3 |
А5 |
А4 х |
А6 |
В5 |
В1 |
А2 х |
В2 |
В3 |
А1 |
Имеем полностью заполненную кучу, причём каждая структура А – 24 байта, а В – 32 байта. Затем в куче освобождаются элементы А4 и А2. Общая свободная память в куче равна 48 байт. Если требуется теперь элемент списка В, то эта операция закончится неудачно из-за фрагментации памяти. Если бы в куче располагались элементы одного раздела, то удаление первого элемента позволило бы разместить элемент второго.
Локальный доступ. Создание дополнительных куч для локализации доступа.
Перекачка страниц из памяти в страничный файл требует дополнительного времени. Доступ к ресурсам осуществлялся бы быстрее, если они расположены плотнее друг к другу, желательно на одной странице. У нас имеется два списка А и В. Причём в результате заполнения списков сложилась ситуация, что на каждой странице расположен элемент списка А и элемент списка В. В этом случае при работе со списком А требуется дополнительное время на подкачку страниц, то есть скорость выполнения процесса уменьшается.
В этом случае, если было бы несколько куч, то доступ к элементам списка А был бы локализован, то есть элементы списка А размещались бы на нескольких смежных страницах. Куча, предоставляемая процессу по умолчанию не может быть уничтожена. Допустим, когда процесс закрывается, используемые процессом кучи не надо уничтожать. Это делается ОС автоматически, когда закрывается ВАП процесса.
Файлы проецируемые в память (фпвп).
Как и виртуальная память проецирование файлов в память позволяет резервировать регион адресного пространства и передавать ему физическую память, но физическая память берётся не из страничного файла, а из файла, уже находящегося на диске или из вновь создаваемого файла.
Когда файл спроецирован в память к нему можно обращаться как к ячейкам памяти, не ипользуя операции файлового ввода/вывода. Этот механизм применяется для:
Загрузки и исполнения ехе и dll файлов. Это позволяет экономить на размере страничного файла и на времени, необходимом ОС для подготовки приложения к исполнению.
Для доступа к файлу данных, размещённых на диске. Это позволяет обойтись без операций файлового ввода вывода и без предварительной буферизации его содержимого.
Для совместного доступа к данным, принадлежащим нескольким процессам.
Рассмотрим механизм проецирования файлов.
Создать или открыть объект ядра файл, идентифицирующий файл на диске. Этот файл будет использоваться для проецирования в память. ОС должна хранить данные о рабочих ресурсах. Kernel32 создаёт системную кучу. В этой куче создаются структуры, описывающие все ресурсы системы.
//////////// PDB
CreateFile(…). Используется как для создания новых, так и для открытия существующих файлов. Результатом работы является дескриптор файла.
таблица дескрипторов база данных файла
0
Виртуальный
адрес объекта
.
.
.
5
указатель на объект ядра
Например, 5.
Чтобы получить реальный адрес, надо побитно обработать виртуальный адрес с помощью оператора XOR.
В результате выполнения первого пункта мы будем знать куда обращаться.
Создание объекта ядра проецируемый файл, чтобы сообщить системе размер файла и способ доступа к нему.
C
reateFile(…)
CreateFileMapping(…) – создания объекта ядра проецируемый файл. Результатом выполнения является дескриптор объекта ядра проецируемый файл.
Выделение региона адресного пространства процесса и проецирование на этот регион файла. Другими словами выделение физической памяти региону.
MapViewOfFile(…). Входными данными для этой функции является дескриптор объекта ядра проецируемый файл, полученный в пункте 2. Результатом выполнения этой функции является витуальный адрес региона.
p^[0]:=’a’;
Работа с проецируемым файлом. Когда работа с ним закончена, то необходимо выполнить следующие действия.
Сообщить системе об отмене проецирования на адресное пространство процесса объекта ядра проецируемый файл. Выполняется это с помощью функции UnMapViewOfFile(…). Результатом является адрес региона адресного пространства, на который спроецирован файл, то есть адрес, полученный в пункте 3.
Закрыть объект ядра файл проецируемый в память.
CloseHandle(…). Параметром является дескриптор в пункте 2.
Закрыть объект ядра файл.
CloseHandle(…).
В случае, если не выпонены 6 и 7 в системной куче kernel32 будет содержаться информация о несуществующих объектах.