diff options
author | Alex Auvolat <alex.auvolat@ens.fr> | 2014-12-07 11:49:52 +0100 |
---|---|---|
committer | Alex Auvolat <alex.auvolat@ens.fr> | 2014-12-07 11:49:52 +0100 |
commit | d7aaba8c85cc71f3184cddcf20b740c5157c864d (patch) | |
tree | d99c9d6765eb433c73498c5e99ebcdb088c0e7e6 /kernel/l0/kmalloc.c | |
parent | 26b68c108664cb54089613bdbc54624ed66f7fda (diff) | |
download | macroscope-d7aaba8c85cc71f3184cddcf20b740c5157c864d.tar.gz macroscope-d7aaba8c85cc71f3184cddcf20b740c5157c864d.zip |
Refactor kmalloc & tests in kmain.
Diffstat (limited to 'kernel/l0/kmalloc.c')
-rw-r--r-- | kernel/l0/kmalloc.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/kernel/l0/kmalloc.c b/kernel/l0/kmalloc.c new file mode 100644 index 0000000..a4ef8fe --- /dev/null +++ b/kernel/l0/kmalloc.c @@ -0,0 +1,52 @@ +#include <kmalloc.h> + +#include <slab_alloc.h> +#include <mutex.h> + +#include <frame.h> +#include <paging.h> +#include <region.h> + +static void* page_alloc_fun_for_kmalloc(size_t bytes) { + void* addr = region_alloc(bytes, REGION_T_CORE_HEAP, default_allocator_pf_handler); + return addr; +} + +static slab_type_t slab_sizes[] = { + { "8B kmalloc objects", 8, 2 }, + { "16B kmalloc objects", 16, 2 }, + { "32B kmalloc objects", 32, 2 }, + { "64B kmalloc objects", 64, 4 }, + { "128B kmalloc objects", 128, 4 }, + { "256B kmalloc objects", 256, 4 }, + { "512B kmalloc objects", 512, 8 }, + { "1KB kmalloc objects", 1024, 8 }, + { "2KB kmalloc objects", 2048, 16 }, + { "4KB kmalloc objects", 4096, 16 }, + { 0, 0, 0 } +}; + +static mem_allocator_t *kernel_allocator = 0; +STATIC_MUTEX(kmalloc_mutex); + +void kmalloc_setup() { + kernel_allocator = + create_slab_allocator(slab_sizes, page_alloc_fun_for_kmalloc, + region_free_unmap_free); +} + +void* kmalloc(size_t sz) { + void* res = 0; + + mutex_lock(&kmalloc_mutex); + res = slab_alloc(kernel_allocator, sz); + mutex_unlock(&kmalloc_mutex); + + return res; +} + +void kfree(void* ptr) { + mutex_lock(&kmalloc_mutex); + slab_free(kernel_allocator, ptr); + mutex_unlock(&kmalloc_mutex); +} |