diff options
| author | Franklin Wei <frankhwei536@gmail.com> | 2015-02-28 20:42:57 -0500 |
|---|---|---|
| committer | Franklin Wei <frankhwei536@gmail.com> | 2015-02-28 20:42:57 -0500 |
| commit | 2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a (patch) | |
| tree | 973fa836d725659a6f0a8edfc108dd9e037430d0 /kernel/heap.c | |
| parent | d4a70e316e0991d788fb922e3e4eafae97fe950e (diff) | |
| download | kappa-2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a.zip kappa-2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a.tar.gz kappa-2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a.tar.bz2 kappa-2dc45e8cac33313e847f6097cbe2ba3bb3ceab2a.tar.xz | |
Implement paging
Diffstat (limited to 'kernel/heap.c')
| -rw-r--r-- | kernel/heap.c | 45 |
1 files changed, 45 insertions, 0 deletions
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 <stddef.h> +#include <stdint.h> +#include <stdlib.h> +#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); +} |