diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/include/mm/kernel_heap.h | 20 | ||||
| -rw-r--r-- | src/kernel.c | 15 | ||||
| -rw-r--r-- | src/mm/kernel_heap.c | 35 |
3 files changed, 70 insertions, 0 deletions
diff --git a/src/include/mm/kernel_heap.h b/src/include/mm/kernel_heap.h new file mode 100644 index 0000000..4527a11 --- /dev/null +++ b/src/include/mm/kernel_heap.h @@ -0,0 +1,20 @@ +#ifndef KERNEL_HEAP_H +#define KERNEL_HEAP_H + +#include <mm/heap.h> + +#define KERNEL_HEAP_SIZE_BYTES (1024 * 1024 * 100) /* 100 MiB */ +#define KERNEL_HEAP_ENTRIES (KERNEL_HEAP_SIZE_BYTES / PAGE_SIZE) + +/* Addresses taken from OSDev x86 memory map */ +#define KERNEL_HEAP_ADDR (0x01000000) + +/* This should give us 480.5 kiB, enough for the current table size */ +#define KERNEL_HEAP_TBL_ADDR (0x00007E00) + + +void kernel_heap_init(); +void * kmalloc(size_t size); +void kfree(void *ptr); + +#endif /* KERNEL_HEAP_H */ diff --git a/src/kernel.c b/src/kernel.c index 8a8bd61..cd9f9d7 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -5,6 +5,7 @@ #include <toxic/kernel.h> #include <toxic/idt.h> #include <toxic/io.h> +#include <mm/kernel_heap.h> void start_kernel() { @@ -12,6 +13,20 @@ void start_kernel() vprintl("Hello World!!!\n"); vprintl("Testing it!!!\n"); + kernel_heap_init(); interrupts_init(); + + void *ptr = kmalloc(50); + void *ptr2 = kmalloc(5000); + void *ptr3 = kmalloc(5600); + + *((int *)ptr) = 11; + kfree(ptr); + void *ptr4 = kmalloc(50); + + *((int *)ptr2) = 22; + *((int *)ptr3) = 33; + *((int *)ptr4) = 44; + if (ptr || ptr2 || ptr3 || ptr4) {} } diff --git a/src/mm/kernel_heap.c b/src/mm/kernel_heap.c new file mode 100644 index 0000000..e53057c --- /dev/null +++ b/src/mm/kernel_heap.c @@ -0,0 +1,35 @@ +#include <mm/kernel_heap.h> +#include <mm/heap.h> +#include <toxic/config.h> +#include <toxic/vga.h> + +struct heap kernel_heap; + +struct heap_table kernel_heap_table; + +void +kernel_heap_init() +{ + int ret; + void *end = (void *)(KERNEL_HEAP_ADDR + KERNEL_HEAP_SIZE_BYTES); + + kernel_heap_table.entries = (unsigned char *)KERNEL_HEAP_TBL_ADDR; + kernel_heap_table.count = KERNEL_HEAP_ENTRIES; + + ret = heap_create(&kernel_heap, + (void *)KERNEL_HEAP_ADDR, + end, + &kernel_heap_table); + + if (ret < 0) + vprintl("Failed to create kernel's heap\n"); +} + +void * kmalloc(size_t size) +{ + return heap_malloc(&kernel_heap, size); +} + +void kfree(void *ptr) { + heap_free(&kernel_heap, ptr); +} |
