
- •Введение
- •Эволюция ос.
- •Классификация ос.
- •Краткий обзор архитектуры 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.
- •Словарь терминов.
Функции компилятора для контроля стека.
В случае DOS при компиляции программ нужно было включать дополнительный программный код для конроля размера стека. В Windows 95, 98, NT этой проблемы нет, но возникает проблема контроля за выделением страниц физической памяти. Например,
VOID SomeFunc(…)
{
int Values[4000];
Values[0]=0;
}
Физическая память
Физическая
память
Зарезервированная
страница
Зарезервированная
страница
переменная
локальная
четыре страницы
При создании стека резервируется 16000 байт. Физическая память выделена только двум страницам, поэтому при компиляции программы вставляется дополнительный код. Этот дополнительный код работает по следующему алгоритму:
Определение
размера страницы
Определение
положения указателя стека
Указатель стека
смещается на страницу вниз
Запись на страницу
ОС выделяет
физическую память
nByteNeeded
= nByteNeeded – размер страницы
Ф.С.
Ф.С.
Ф.С.
Кучи (Heaps).
Мы рассматривали функции для работы с виртуальной памятью. Для работы с небольшими областями памяти используются кучи.
В DOS кучей являлась вся свободная память.
куча
программа
Int 21h
48h, 49h, 4Ah
0
Каждая программа имеет следующую структуру.
главная куча
стек
локальная
куча
переменные
код
ехе файла
свободная
память
данные
При работе с кучей используются следующие функции.
HeapCreate(…) – создание кучи.
///////////////
куча
HeapDestroy(…) – уничтожение кучи.
HeapAlloc(…) – выделение блока в куче.
HeapFree(…) – освобождение блока в куче.
GetProcessHeap(…) – определение идентификатора кучи, предоставляемой процессу по умолчанию.
Особенности кучи в Windows 95, Windows nt.
В Windows максимальный размер кучи может быть практически равен размеру свободного адресного пространства. По умолчанию выделяется 1 Мб и передаются 2 страницы физической памяти.
В Windows поддерживается несколько куч.
Кучи Win32 могут расти за пределы первоначально отведенного для них размера. В этом случае kernel32 выделяет дополнительный блок линейного адресного пространства и связывает с ним кучу, то есть образует подкучу.
Каждая куча Win32 поддерживает 4 отдельных списка свободных блоков, чтобы избежать чрезмерной фрагментации.
При создании любого процесса ОС автоматически создаёт кучу, которая называется куча, предоставляемая процессу по умолчанию. Куча нужна самой ОС для выполнения функций Win32.
Пример. UNICODE 2-х байтная
ANSI привычная
Windows NT, 2000 работают только с UNICODE, поэтому когда вызывается ANSI вариант, то для выполнения этой функции необходимо организовать буфер для перевода ANSI в UNICODE.
HeapCreate
куча
3
HeapCreate
куча
2
GetProcessHeap
куча
1
Process Data Base
подкучи
подкучи
У нас куча 1 создана по умолчанию, а 2 и 3 – это дополнительные кучи, создаваемые процессом. PDB – эта таблица содержит указатели на кучи. ToolHelp – специальный набор функций.
Для чего нужны кучи?
По умолчанию каждой подкуче выделяется ХЗ Мб.
Лекция № 6
Заголовок и арена кучи Win32.
…
2
блок
2
арена
1
блок
1
арена
…
критическая
секция
массив
из 4-х заголовков
размер
заголовок кучи
Каждый блок имеет свой заголовок – арену. Заголовок кучи имеет следующую структуру. Заголовок состоит из полей.
общий размер памяти, зарезервированной для кучи.
указатель на следующую кучу, если она есть.
указатель на начало списка дополнительных подкуч данной кучи.
списки свободных блоков.
Для снижения фрагментации памяти и ускорения поиска свободных блоков заголовок каждой кучи содержит 4 списка свободных блоков:
1-ый список состоит из блоков, размер которых меньше 20h байт.
2-ой список состоит из блоков, размер которых меньше 80h байт.
3-ий список состоит из блоков, размер которых меньше 200h байт.
4-ый список состоит из блоков, размер которых меньше FFFFFFFFh байт.
Kernel32 ищет свободный блок в наиболее подходящем блоке.
куча
заголовок
////////////////////////////
Каждая структура списка свободных блоков имеет следующий формат.
максимальный размер блока (это число 20h, 80h, 200h и FFFFFFFFh).
структура, представляющая собой арену, то есть заголовок.
Длина блока в арене 0, а указатель типа next указывает на первый свободный блок данного размера в куче, то есть указывает на первый свободный блок.
Р-Р
Арена 0
next
первый свободный блок в куче
В заголовке кучи кроме того находится указатель на следующую кучу, созданную функцией HeapCreate(…). Если следующей кучи нет, то 0.
В заголовке содержится критическая секция CriticalSection. Это структура, которая организует последовательный доступ к куче различных потоков процесса.
Несколько потоков обращаются к куче для того, чтобы выделить блок памяти в куче. Процесс выделения памяти в куче состоит из следующих этапов.
Поиск свободного блока.
Выделение физической памяти для этого блока.
Запись информации в выделенный блок.
Первый поток выполнил два этапа, его квант времени истёк. Начинается выполнение программного кода второго потока. Второй поток выполняет три этапа и находит тот же блок. Когда управление вернётся к первому потоку, то он запишет информацию в тот же блок, то есть информация второго потока будет испорчена.
Чтобы этого избежать существует критическая секция. Это признак. Как только какой-либо поток начинает работу с кучей устанавливается признак в CriticalSection.
Недостатком кучи является снижение производительности из-за последовательного доступа.
В заголовке кучи имеется поле флагов.
Heap_No_Serialsize – куча допускает одновременный доступ к куче со стороны нескольких потоков. Его рекомендуется не использовать, а если использовать, то только в том случае, если процесс имеет один поток.
В заголовке кучи обычно указывается сигнатура “HI” – признак того, что это заголовок кучи. Рассмотрим структуру отдельных блоков кучи. Каждый блок начинается с заголовка, то есть с арены.