diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/makefile | 2 | ||||
-rw-r--r-- | src/lib/stdlib.C | 35 |
2 files changed, 36 insertions, 1 deletions
diff --git a/src/lib/makefile b/src/lib/makefile index 105f74a05..b4e27e478 100644 --- a/src/lib/makefile +++ b/src/lib/makefile @@ -1,7 +1,7 @@ OBJDIR = ../../obj include ../../config.mk -OBJS = string.o +OBJS = string.o stdlib.o OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS}) all: ${OBJECTS} diff --git a/src/lib/stdlib.C b/src/lib/stdlib.C new file mode 100644 index 000000000..5bf0d87f6 --- /dev/null +++ b/src/lib/stdlib.C @@ -0,0 +1,35 @@ +#include <stdlib.h> +#include <kernel/heapmgr.H> +#include <kernel/pagemgr.H> + +void* malloc(size_t s) +{ + if (s > HeapManager::MAX_ALLOC_SIZE) + { + size_t pages = (s+8) / PageManager::PAGESIZE; + void* v = PageManager::allocatePage(pages); + size_t* len = (size_t*)v; + *len = pages << 8; + len++; + return len; + } + else + return HeapManager::allocate(s); +} + +void free(void* p) +{ + if (NULL == p) return; + + size_t* len = (size_t*)p; + len--; + + if ((*len) > 0xff) + { + PageManager::freePage(len, (*len) >> 8); + } + else + { + HeapManager::free(p); + } +} |