(memory): initialise HeapHeader when allocating page + other fixes

This commit is contained in:
Liam Kerr 2026-02-12 02:31:20 +00:00
parent b48da838ec
commit c875a2c35c
2 changed files with 20 additions and 13 deletions

View file

@ -53,8 +53,7 @@ size_t align_down(size_t value, size_t size)
return value & ~(size - 1); return value & ~(size - 1);
} }
void page_free(void *addr) void page_free(void *addr){
{
if (addr == NULL) if (addr == NULL)
return; return;
if (!is_aligned_to((size_t)addr, PAGE_SIZE)) if (!is_aligned_to((size_t)addr, PAGE_SIZE))
@ -65,7 +64,7 @@ void page_free(void *addr)
free_list = p; free_list = p;
} }
void *page_alloc() HeapHeader *page_alloc()
{ {
if (free_list == NULL) if (free_list == NULL)
{ {
@ -77,7 +76,14 @@ void *page_alloc()
// zero out the page // zero out the page
memset(p, 0, PAGE_SIZE); memset(p, 0, PAGE_SIZE);
return (void *)p; HeapHeader *header = (HeapHeader *)p;
header->size = PAGE_SIZE - sizeof(HeapHeader);
header->is_free = 1;
header->next = NULL;
header->prev = NULL;
return header;
} }
void *kmalloc(size_t size) void *kmalloc(size_t size)
@ -90,12 +96,7 @@ void *kmalloc(size_t size)
if (heap_free_list == NULL) if (heap_free_list == NULL)
{ {
HeapHeader *header = (HeapHeader *)page_alloc(); HeapHeader *header = (HeapHeader *)page_alloc();
header->size = PAGE_SIZE - sizeof(HeapHeader); kheap_insert_sorted(header);
header->is_free = 1;
header->next = NULL;
header->prev = NULL;
heap_free_list = header;
} }
HeapHeader *current = heap_free_list; HeapHeader *current = heap_free_list;
@ -112,8 +113,6 @@ void *kmalloc(size_t size)
if (current == NULL) if (current == NULL)
{ {
HeapHeader *header = (HeapHeader *)page_alloc(); HeapHeader *header = (HeapHeader *)page_alloc();
header->size = PAGE_SIZE - sizeof(HeapHeader);
header->is_free = 1;
kheap_insert_sorted(header); kheap_insert_sorted(header);
current = header; current = header;
} }
@ -171,6 +170,14 @@ void kfree(void *ptr)
{ {
page_free((void *)addr); page_free((void *)addr);
} }
}
else
{
if (final_block->prev == NULL && final_block->next == NULL && final_block != heap_free_list)
{
kheap_insert_sorted(final_block);
}
} }
} }

View file

@ -23,7 +23,7 @@ size_t align_up(size_t value, size_t size);
size_t align_down(size_t value, size_t size); size_t align_down(size_t value, size_t size);
void page_init(); void page_init();
void page_free(void *addr); void page_free(void *addr);
void *page_alloc(); HeapHeader *page_alloc();
void *kmalloc(size_t size); void *kmalloc(size_t size);
void kheap_split(HeapHeader *header, size_t size); void kheap_split(HeapHeader *header, size_t size);
void kheap_insert_sorted(HeapHeader *new_block); void kheap_insert_sorted(HeapHeader *new_block);