Арена в занятых блоках. Начинается с поля длины блока. Затем в некоторых версиях 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 Кб.
3 кольцо
0 кольцо
ntoskrnl.exe – Windows NT,2000
vmm.vxd – Windows 95, 98
В кольце 0 выполняется реальная работа с памятью. Если куча принадлежит kernel32.dll, то есть является системной, то в заголовке инициализируется ряд дополнительных полей. Например, чтобы сделать кучу невыгружаемой, если в ней находятся важные для ОС поля.
HeapDestroy(…). Проблема состоит в том, что
1. куча должна быть свободной, то есть CriticalSection=0.
2. куча может иметь подкучи.
Необходимо удалить весь список связанных подкуч. Windows поддерживает связанный список кучи, то есть HeapDestroy(…) должна выполнять действия по корректировке списка.