summaryrefslogtreecommitdiff
path: root/kernel/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/mem.c')
-rw-r--r--kernel/mem.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/kernel/mem.c b/kernel/mem.c
index 3a0b19b..840a3b7 100644
--- a/kernel/mem.c
+++ b/kernel/mem.c
@@ -3,10 +3,31 @@
#include <dtb.h>
#include <common.h>
+static struct page *free_list;
+
void* kmalloc(size_t size) {
- return (void*)size;
+ struct page *page = free_list;
+ while (page != NULL && page->size < size && page->status != MEMPAGE_FREE) {
+ page = page->next;
+ }
+ if (page == NULL)
+ return NULL;
+
+ size_t combined_size = size + sizeof(struct page);
+ struct page *next = (struct page *)((void *)page + combined_size);
+ next->next = page->next;
+ next->size = page->size - combined_size;
+ next->status = MEMPAGE_FREE;
+
+ page->status = MEMPAGE_USED;
+ next->size = combined_size;
+ next->next = NULL;
+
+ return (void *)page + sizeof(struct page);
}
+
+
void* memcpy(void *to, const void *from, size_t size) {
char *dest = (char *)to;
const char *src = (const char *)from;
@@ -18,3 +39,11 @@ void* memcpy(void *to, const void *from, size_t size) {
return dest;
}
+void km_init(struct mem_info *info) {
+ struct page *base = (struct page *)info->start;
+ base->next = NULL;
+ base->size = info->size - sizeof(struct page);
+ base->status = MEMPAGE_FREE;
+
+ free_list = base;
+}