diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index b38509db..51293e89 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -8,6 +8,7 @@ #include #include #include +#include static cpu_t bsp_cpu; @@ -22,5 +23,6 @@ void kernel_entry() { logging_sethook(term_putchar); arch_mmu_init(); vmm_init(); + alloc_init(); __assert(!"kernel entry end"); } diff --git a/kernel-src/include/kernel/alloc.h b/kernel-src/include/kernel/alloc.h new file mode 100644 index 00000000..604125a4 --- /dev/null +++ b/kernel-src/include/kernel/alloc.h @@ -0,0 +1,10 @@ +#ifndef _ALLOC_H +#define _ALLOC_H + +#include + +void alloc_init(); +void *alloc(size_t s); +void free(void *addr); + +#endif diff --git a/kernel-src/mm/alloc.c b/kernel-src/mm/alloc.c new file mode 100644 index 00000000..eea7d059 --- /dev/null +++ b/kernel-src/mm/alloc.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include + +#define CACHE_COUNT 12 + +static size_t allocsizes[CACHE_COUNT] = {32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536}; +static scache_t *caches[CACHE_COUNT]; + +static void initarea(scache_t *cache, void *obj) { + printf("slab ctor called\n"); + size_t *ptr = obj; + *ptr = cache->size - sizeof(size_t); + memset(ptr + 1, 0, *ptr); +} + +static scache_t *getcachefromsize(size_t size) { + // XXX find a faster way to check this + scache_t *cache = NULL; + for (int i = 0; i < CACHE_COUNT; ++i) { + if (size <= allocsizes[i]) { + cache = caches[i]; + break; + } + } + __assert(cache); + return cache; +} + +void *alloc(size_t size) { + scache_t *cache = getcachefromsize(size); + size_t *ret = slab_allocate(cache); + if (ret == NULL) + return NULL; + return ret + 1; +} + +void free(void *ptr) { + size_t *start = ptr; + size_t size = *start; + start += 1; + scache_t *cache = getcachefromsize(size); + slab_free(cache, ptr); +} + + + +void alloc_init() { + for (int i = 0; i < CACHE_COUNT; ++i) { + caches[i] = slab_newcache(allocsizes[i] + sizeof(size_t), 0, initarea, initarea); + __assert(caches[i]); + } +}