Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ОС рулез.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
630.27 Кб
Скачать

Структура арены.

Арена в занятых блоках. Начинается с поля длины блока. Затем в некоторых версиях Windows кроме длины блока могут указываться значения счётчика команд перед обращением к куче.

Арена в свободных блоках.

SIZE – размер

PREV – указатель на пустой свободный блок.

NEXT – указатель на следующий свободный блок, то есть свободные блоки связаны в цепочки.

Поле SIZE используется и в занятых и в свободных блоках. минимальный блок памяти, который можно выделить в куче – 4 байт, следовательно 2 младших бита в поле размер используются для служебных целей.

0100

признак свободен блок или нет

признак свободен ли предыдущий блок (0 – свободен, 1 – занят)

Это нужно чтобы уменьшить фрагментацию. Когда выделенный блок памяти в куче, то выде-ляется ещё около 10h байт, необходимый для создания арены.

Рассмотрим функции работы с кучей.

GetProcessHeap(…) – получить дескриптор кучи, предоставляемый процессу по умолчанию. Эта функция находит PDB и извлекает из базы данных дескриптор кучи.

HeapCreate(…) – создание кучи. Вызывают не только приложения пользователя, но и kernel32.dll и user32.dll вызывает для создания системных структур данных, например PDB или базы данных потока (TDB).

Процесс создания кучи проходит в 2 этапа:

  1. резервирование памяти для кучи и связывание кучи в списке куч процесса.

  2. инициализация всех полей заголовка кучи.

Функция HeapCreate(…) проверяет корректность параметров. Округляет границу кучи до ближайшего целого числа кратного 4 Кб.

kernel32.dll

3 кольцо

0 кольцо

ntoskrnl.exe – Windows NT,2000

vmm.vxd – Windows 95, 98

В кольце 0 выполняется реальная работа с памятью. Если куча принадлежит kernel32.dll, то есть является системной, то в заголовке инициализируется ряд дополнительных полей. Например, чтобы сделать кучу невыгружаемой, если в ней находятся важные для ОС поля.

Удаление кучи.

HeapDestroy(…). Проблема состоит в том, что

  1. куча должна быть свободной, то есть CriticalSection=0.

  2. куча может иметь подкучи.

3

2

1

Необходимо удалить весь список связанных подкуч. Windows поддерживает связанный список кучи, то есть HeapDestroy(…) должна выполнять действия по корректировке списка.

Выделение блока памяти в определённой куче.

HeapAlloc(…). Этот процесс состоит из следующих этапов.

  1. проверки параметров функции HeapAlloc(…).

  2. захват CriticalSection заголовка кучи.

  3. выравнивание размера запрошенного блока к ближайшему числу кратному 4 и добавление размера арены. К каждому из 4-х списков относится запрошенный блок. 84 байта, 20h, 80h, 200h.

  4. нахождение первого свободного блока в списке. Если блок найден, то функция проверяет насколько этот блок велик, нельзя ли его поделить на 2. Если можно, то создаются 2 блока, настраиваются их арены. Первый блок занят функцией HeapAlloc(…), другой поступает в список свободных блоков.

  5. освобождение критической секции. Указатель кучи устанавливается на первый байт следующего за ареной блока. Если функция не найдёт в списке подходящего свободного блока, то kernel32 создаёт подкучу, настраивает её заголовок, вставляет подкучу в список подкуч, а затем функция HeapAlloc(…) возвращается к поиску свободных блоков.