diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-06-24 12:55:38 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-06-24 12:55:38 -0500 |
| commit | 95e5618b0e4cf354c80d75b00b60539b5ed47150 (patch) | |
| tree | b12a95e830d6c8475c377a7901cf8c69caa5d2b6 | |
| parent | 5c15e93fa87800b1f8fae7ef688a9d41221526f1 (diff) | |
create kmalloc and km_init
| -rw-r--r-- | include/mem.h | 27 | ||||
| -rw-r--r-- | kernel/kernel.c | 9 | ||||
| -rw-r--r-- | kernel/mem.c | 31 |
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; +} |
