From 2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Sat, 28 Feb 2015 20:42:57 -0500 Subject: Implement paging --- kernel/heap.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 kernel/heap.c (limited to 'kernel/heap.c') diff --git a/kernel/heap.c b/kernel/heap.c new file mode 100644 index 0000000..d1f1021 --- /dev/null +++ b/kernel/heap.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include "paging.h" + +/* a simple pointer-arithmetic-based malloc */ + +/* a symbol put there by the linker */ +extern uint32_t link_mem_end; +uint32_t kmalloc_addr = &link_mem_end; + +static void *kmalloc_int(size_t sz, int align, void **phys) +{ + if(align) + { + kmalloc_addr += (PAGE_SIZE - 1); + kmalloc_addr &= PAGE_MASK; + } + if(phys) + *phys = (void*)kmalloc_addr; + void *ret = (void*)kmalloc_addr; + kmalloc_addr += sz; + assert(((uint32_t)ret & 0xFFF) == 0); + return ret; +} + +void *kmalloc(size_t sz) +{ + return kmalloc_int(sz, 0, NULL); +} + +void *kmalloc_a(size_t sz) +{ + return kmalloc_int(sz, 1, NULL); +} + +void *kmalloc_p(size_t sz, void **phys) +{ + return kmalloc_int(sz, 0, phys); +} + +void *kmalloc_ap(size_t sz, void **phys) +{ + return kmalloc_int(sz, 1, phys); +} -- cgit v1.1