|
Kintsugi OS 0.5.0
x86 Monolithic OS
|
Порядок загрузки: 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-битными.
0xc0000000, начальный commit 64 КиБ, максимум 64 МиБ. Рост получает физические страницы через PMM; при неудаче новые выделения откатываются. free объединяет блоки для повторного использования, но пока не возвращает страницы кучи в PMM.vmm_unmap_page не освобождает страницу данных: это обязанность вызывающего. Пустые динамические таблицы страниц освобождаются автоматически.Подключайте 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.