summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-09-14 14:18:41 +0200
committerCarlos Maiolino <[email protected]>2025-09-14 14:18:41 +0200
commitcd2c4e4a25cb41ca6fe622f0ccf1b1a3dd9d5660 (patch)
tree319ff940278d98f0010bdcdfcbc08bf22cb6aec0 /src
parent833f883ab85d57d8f9cfae5a2181b3e097fae8bd (diff)
Add a kernel heap
Use the heap API to implement a 100MiB heap to be used by the kernel code. Add example usage to src/kernel.c Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/include/mm/kernel_heap.h20
-rw-r--r--src/kernel.c15
-rw-r--r--src/mm/kernel_heap.c35
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);
+}