(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);
}
void page_free(void *addr)
{
void page_free(void *addr){
if (addr == NULL)
return;
if (!is_aligned_to((size_t)addr, PAGE_SIZE))
@ -65,7 +64,7 @@ void page_free(void *addr)
free_list = p;
}
void *page_alloc()
HeapHeader *page_alloc()
{
if (free_list == NULL)
{
@ -77,7 +76,14 @@ void *page_alloc()
// zero out the page
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)
@ -90,12 +96,7 @@ void *kmalloc(size_t size)
if (heap_free_list == NULL)
{
HeapHeader *header = (HeapHeader *)page_alloc();
header->size = PAGE_SIZE - sizeof(HeapHeader);
header->is_free = 1;
header->next = NULL;
header->prev = NULL;
heap_free_list = header;
kheap_insert_sorted(header);
}
HeapHeader *current = heap_free_list;
@ -112,8 +113,6 @@ void *kmalloc(size_t size)
if (current == NULL)
{
HeapHeader *header = (HeapHeader *)page_alloc();
header->size = PAGE_SIZE - sizeof(HeapHeader);
header->is_free = 1;
kheap_insert_sorted(header);
current = header;
}
@ -171,6 +170,14 @@ void kfree(void *ptr)
{
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);
void page_init();
void page_free(void *addr);
void *page_alloc();
HeapHeader *page_alloc();
void *kmalloc(size_t size);
void kheap_split(HeapHeader *header, size_t size);
void kheap_insert_sorted(HeapHeader *new_block);