diff --git a/include/mem.h b/include/mem.h index b6443a3..767f62c 100644 --- a/include/mem.h +++ b/include/mem.h @@ -16,9 +16,15 @@ #define BLOCK_SIZE 4096 #define HHDM_OFFSET (hhdm_request.response->offset) +// Вывод данных о каждом выделенном блоке памяти void mem_dump_memory( ); + +// Вывод размеров занятой и освобожденной памяти void mem_get_stat( ); + +// Инициализация менеджера памяти void mem_init( ); + void *mem_alloc(size_t size); void mem_add_block(void *addr, size_t size); void mem_free(void *addr); @@ -28,4 +34,4 @@ void mem_frame_free(void *ptr, uint64_t frames); void *mem_frame_calloc(uint64_t frames); void mem_merge_all_blocks( ); -#endif // mem.h \ No newline at end of file +#endif // mem.h diff --git a/kernel/mem.c b/kernel/mem.c index 02d7b84..0d3aeee 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -14,18 +14,29 @@ #include #include +// Запрос к загрузчику Limine о состоянии памяти static volatile struct limine_memmap_request memmap_request = { .id = LIMINE_MEMMAP_REQUEST, .revision = 0, .response = (struct limine_memmap_response *)0 }; + +// Запрос к загрузчику Limine о виртуальном адресе Higher Half static volatile struct limine_hhdm_request hhdm_request = { .id = LIMINE_HHDM_REQUEST, .revision = 0, .response = (struct limine_hhdm_response *)0 }; +// Менеджер памяти выделяет память отдельными участками (блоками). Информация обо +// всех выделенных блоках хранится в виде односвязного списка структур mem_entry_t. +// Каждая mem_entry_t содержит информацию об отдельном выделенном блоке памяти struct mem_entry { + // Ссылка на следующий элемент списка struct mem_entry *next; + // Флаг, помечающий память как освобожденную bool free; + // Поток, владеющий памятью uint64_t task_id; + // Размер блока uint64_t size; + // Адрес блока uint8_t data[0]; }; @@ -55,13 +66,16 @@ static const char memory_types[8][82] = { "Доступно", "Зарезе "ACPI NVS", "Плохая память", "Загрузчик, можно освободить", "Ядро и модули", "Буфер кадра" }; +// Ответ от загрузчика Limine о состоянии памяти static struct limine_memmap_response *memmap_response; +// Описание перого выделенного блока памяти - начало списка с данными о памяти static mem_entry_t *first_node; void mem_dump_memory( ) { mem_entry_t *curr = first_node; + // Проход по всему списку записей о выделенных блоках памяти while (curr) { if (curr->next) { LOG("->0x%x | %u килобайт | %s | 0x%x | поток %u\n", &curr->data, (curr->size) / 1024, @@ -355,4 +369,4 @@ void mem_init( ) { LOG("%u / %u блоков доступно\n", bitmap_available, bitmap_limit); #endif -} \ No newline at end of file +}