summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mem.h27
-rw-r--r--kernel/kernel.c9
-rw-r--r--kernel/mem.c31
3 files changed, 49 insertions, 18 deletions
diff --git a/include/mem.h b/include/mem.h
index 6135786..6c87b59 100644
--- a/include/mem.h
+++ b/include/mem.h
@@ -1,25 +1,26 @@
#pragma once
#include <types.h>
-typedef enum {
- PAGE_FREE,
- PAGE_ALLOCATED
-} MemoryPageAvailability;
+struct mem_info {
+ void* start;
+ size_t size;
+};
-struct page {
- void* locator;
- MemoryPageAvailability availability;
- struct page* next;
+enum PageStatus {
+ MEMPAGE_FREE, MEMPAGE_USED
};
-struct mem_info {
- void* start;
+struct page {
+ struct page* next;
size_t size;
+ enum PageStatus status;
};
void* kmalloc(size_t size);
-void* memcpy(void* to, const void* from,size_t size);
+void* kzmalloc(size_t size);
+void kfree(void* ptr);
+
+void* memcpy(void* to, const void* from, size_t size);
-void* kemalloc(size_t size);
+void km_init(struct mem_info *info);
-extern struct page root;
diff --git a/kernel/kernel.c b/kernel/kernel.c
index 568d8a3..3952f8f 100644
--- a/kernel/kernel.c
+++ b/kernel/kernel.c
@@ -20,11 +20,12 @@ void kernel_main(size_t hart, void *fdt) {
struct dt_node *head = dt_parse(fdt);
struct mem_info *info = km_find_memory(head);
- if (info) {
- print_string("found memory!\n");
- } else {
- print_string("could not find memory!\n");
+ if (!info) {
+ print_string("failed to get memory!\n");
+ while (1);
}
+ km_init(info);
+
while(1);
}
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;
+}