summaryrefslogtreecommitdiff
path: root/src/kernel/memorymanagement.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/memorymanagement.c')
-rw-r--r--src/kernel/memorymanagement.c40
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;
+}
+
+