wip: separate allocators into a kernel one and a user one
This commit is contained in:
70
src/memory/kern/allocator.c
Normal file
70
src/memory/kern/allocator.c
Normal file
@ -0,0 +1,70 @@
|
||||
#include "alloc.h"
|
||||
#include "assert.h"
|
||||
#include "kprintf.h"
|
||||
#include "memory.h"
|
||||
#include "string.h"
|
||||
|
||||
Zone *kzones[3];
|
||||
|
||||
static void add_zone(Zone *zone, block_type_t type)
|
||||
{
|
||||
// We put the zone at the beginning of the list
|
||||
if (kzones[type]) {
|
||||
assert(kzones[type] != zone);
|
||||
zone->next = kzones[type];
|
||||
kzones[type]->prev = zone;
|
||||
}
|
||||
kzones[type] = zone;
|
||||
}
|
||||
|
||||
static void new_block(Zone *zone, uint32_t zone_size)
|
||||
{
|
||||
Block *new_block = (Block *)align_mem((uint32_t)zone + sizeof(Zone));
|
||||
|
||||
// Metadata
|
||||
new_block->in_use = false;
|
||||
new_block->size = zone_size - sizeof(Zone) - sizeof(Block);
|
||||
new_block->sub_size = new_block->size;
|
||||
new_block->ptr = (Block *)((uint32_t)new_block + sizeof(Block));
|
||||
new_block->zone = zone;
|
||||
|
||||
// Init future linked lists
|
||||
new_block->prev = NULL;
|
||||
new_block->prev_free = NULL;
|
||||
new_block->prev_used = NULL;
|
||||
new_block->next = NULL;
|
||||
new_block->next_free = NULL;
|
||||
new_block->next_used = NULL;
|
||||
|
||||
if (zone->free) {
|
||||
zone->free->prev = new_block;
|
||||
zone->free->prev_free = new_block;
|
||||
new_block->next = zone->free;
|
||||
new_block->next_free = zone->free;
|
||||
}
|
||||
zone->free = new_block;
|
||||
assert(zone->free == new_block);
|
||||
}
|
||||
|
||||
int new_kzone(block_type_t type, uint32_t size)
|
||||
{
|
||||
// assert(current_task->pid);
|
||||
void *heap = kalloc_pages(size, NULL);
|
||||
if (heap == NULL) {
|
||||
kprintf(KERN_ERR "error: alloc_frame failed\n");
|
||||
return (-1);
|
||||
}
|
||||
memset(heap, 0, size);
|
||||
|
||||
Zone *zone = (Zone *)heap;
|
||||
zone->type = type;
|
||||
zone->size = size;
|
||||
zone->used = NULL;
|
||||
zone->next = NULL;
|
||||
zone->prev = NULL;
|
||||
|
||||
new_block(zone, size);
|
||||
add_zone(heap, type);
|
||||
|
||||
return (0);
|
||||
}
|
||||
Reference in New Issue
Block a user