summaryrefslogtreecommitdiff
path: root/kernel/kmalloc.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2015-05-15 02:06:48 +0200
committerMichal Idziorek <m.i@gmx.at>2015-05-15 02:06:48 +0200
commit0365bbb5c58912fd24b3d33b90477d3de5d46d96 (patch)
tree0e171394f0e9f508b6ff1a7971ce61ddf8b2f989 /kernel/kmalloc.c
parentfb8a5f18835e8811dd1a98b8eb5352151fc2df31 (diff)
fixes and imporvements
Diffstat (limited to 'kernel/kmalloc.c')
-rw-r--r--kernel/kmalloc.c48
1 files changed, 45 insertions, 3 deletions
diff --git a/kernel/kmalloc.c b/kernel/kmalloc.c
index 4939e05..a3b4ab6 100644
--- a/kernel/kmalloc.c
+++ b/kernel/kmalloc.c
@@ -1,9 +1,51 @@
+#define FOOLOS_MODULE_NAME "kmalloc"
#include "kmalloc.h"
#include <stddef.h>
+#include "lib/logger/log.h"
-static uint8_t data[1024*1024*8]; //8MB kernel memory managed by kmalloc
+#define MEM_SIZE 1024*1024*8
-uint32_t kmalloc(uint32_t size)
+static uint8_t data[MEM_SIZE]; //8MB kernel memory managed by kmalloc
+static uint32_t next;
+static uint32_t first;
+static uint8_t init=0;
+
+void kmallocinit()
+{
+ next=&(data[0]);
+ first=next;
+
+ if(next%4096) //align (TODO: check how to tell gcc to do that)
+ {
+ next+=4096;
+ next/=4096;
+ next*=4096;
+ }
+
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"kmalloc_init: 0x%08X",next);
+ init=1;
+}
+
+// kernel block memory allocation
+uint32_t kballoc(uint32_t size)
{
- return NULL;
+ size*=4096;
+ if(!init)kmallocinit();
+ uint32_t old=next;
+ next+=size;
+
+ if(next>=first+MEM_SIZE)
+ {
+ panic(FOOLOS_MODULE_NAME,"kballoc ran out of memory! maybe increase MEM_SIZE in kmalloc.c?");
+ }
+ log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"(%d) : 0x%08X (~%dKB left)",size,old,(MEM_SIZE-next+first)/1024);
+
+ return old;
+}
+
+//TODO!
+uint32_t kbfree(uint32_t pos)
+{
+
}
+