Kintsugi OS 0.5.0
x86 Monolithic OS
Loading...
Searching...
No Matches
Подсистема памяти

Порядок загрузки: BIOS E820 → PMM → paging/VMM → виртуальная куча.

Модули

  • src/kernel/mm/memory.c: копия карты E820, bitmap физических страниц, таблицы страниц x86, отображение/снятие отображений и статистика.
  • src/kernel/mm/heap.c: best-fit аллокатор, разделение и слияние блоков, realloc, выровненные выделения и проверка метаданных.
  • src/kernel/kklibc/mem.c: операции над байтами, без выделения памяти.

BIOS передаёт до 64 записей по 24 байта через область 0x5000. Без E820 ядро останавливается, а не предполагает наличие RAM. PMM выделяет только целые usable-страницы, исключает пересекающиеся зарезервированные диапазоны и весь первый МиБ (ядро, BSS, стек, BIOS, VGA). Адреса и длины E820 сохраняются 64-битными.

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

  • Страницы: 4 КиБ, обычный 32-битный paging без PAE.
  • Первые 256 МиБ имеют supervisor identity mapping для доступа к физическим страницам. Страница 0 отсутствует. Наличие отображения не означает наличие RAM: право выделения определяется картой PMM.
  • PMM пока управляет RAM только ниже 256 МиБ; полная карта E820 доступна отдельно.
  • Куча: 0xc0000000, начальный commit 64 КиБ, максимум 64 МиБ. Рост получает физические страницы через PMM; при неудаче новые выделения откатываются. free объединяет блоки для повторного использования, но пока не возвращает страницы кучи в PMM.
  • vmm_unmap_page не освобождает страницу данных: это обязанность вызывающего. Пустые динамические таблицы страниц освобождаются автоматически.

API и ограничения

Подключайте mm/heap.h для kmalloc/kfree/krealloc, mm/memory.h для PMM/VMM. Совместимый общий kklibc.h пока также включает heap API. kmalloc_aligned освобождается только через kfree_aligned. realloc при неудаче сохраняет исходный блок. Неверный free отклоняется, повреждение цепочки заголовков вызывает panic.

Аллокаторы рассчитаны на однопроцессорное ядро, не вызываются из IRQ и не предназначены для конкурентного использования будущими потоками без блокировок. Пока нет отдельных адресных пространств, swap, demand paging, user mappings, read-only секций ядра и защитных страниц стеков. Включён CR0.WP, но identity mapping остаётся writable. PMM освобождает только собственные выделенные страницы; перед освобождением вызывающий должен снять их динамические отображения.

Диагностика

  • info: CPU, RAM, paging и heap.
  • meminfo: E820 usable RAM, лимит PMM, свободные/выделенные/недоступные страницы, динамические отображения, commit и занятость кучи.
  • memmap: исходные записи BIOS (base/size как старшее:младшее 32-битное слово).
  • memdump: блоки кучи, служебные расходы, крупнейший свободный блок, live allocations.
  • memtest: PMM allocate/free, защита от повторного освобождения, VMM alias/unmap, возврат таблицы страниц, рост/realloc кучи с проверкой данных и alignment.

unavailable/reserved включает и отсутствующую RAM внутри окна PMM, поэтому не является объёмом занятой оперативной памяти. Live allocations — не доказанные утечки. python3 tools/smoke_test.py --memory=16 позволяет проверить другой объём RAM.