(memory): initialise HeapHeader when allocating page + other fixes
This commit is contained in:
parent
b48da838ec
commit
c875a2c35c
2 changed files with 20 additions and 13 deletions
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue