diff options
Diffstat (limited to 'kernel/mem.c')
| -rw-r--r-- | kernel/mem.c | 31 |
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; +} |
