diff options
Diffstat (limited to 'src/kernel/memorymanagement.c')
-rw-r--r-- | src/kernel/memorymanagement.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/kernel/memorymanagement.c b/src/kernel/memorymanagement.c new file mode 100644 index 0000000..dc2d160 --- /dev/null +++ b/src/kernel/memorymanagement.c @@ -0,0 +1,40 @@ +#include "memorymanagement.h" + +#include "string.h" + +#include "kernel.h" + +void memory_manager_init( memory_manager_t *memory_manager, size_t offset, size_t size ) +{ + memset( memory_manager, 0, sizeof( memory_manager_t ) ); + + memory_manager->offset = offset; + memory_manager->size = size; + memory_manager->free_ptr = offset; +} + +void *memory_manager_allocate( memory_manager_t *memory_manager, size_t size ) +{ + void *p = NULL; + + if( memory_manager->free_ptr - memory_manager->offset + size > memory_manager->size ) { + kernel_panic( "Heap allocation out of memory (requested %d bytes, available %d)", + size, size - ( memory_manager->free_ptr - memory_manager->offset ) - 1 ); + } + + p = (void *)memory_manager->free_ptr; + memory_manager->free_ptr += size; + + return p; +} + +void memory_manager_deallocate( memory_manager_t *memory_manager, void **p ) +{ + if( *p == NULL ) { + kernel_panic( "Double free of pointer 0x%X in heap", *p ); + } + + *p = NULL; +} + + |