CeDOS - Commit b5739afa

Merge branch 'feature/kmalloc' into develop Added malloc to kernel to allow for dynamic memory allocation
Celina Sophie Kalus
Tue, 25 Apr 2023 22:23:56 +0200
6 files changed, 65 insertions(+), 5 deletions(-)
M include/cedos/mm/memory.hinclude/cedos/mm/memory.h

@@ -8,6 +8,10 @@ #include <stdint.h>

typedef uint32_t size_t; +#define NULL (void*)(0) + +int malloc_init(); + /*! * Allocates a block of \p size bytes of memory. (KERNEL MODE) * \param size Size in bytes of the requested block of memory.
M src/kernel/file.csrc/kernel/file.c

@@ -5,6 +5,8 @@

#include "cedos/drivers/tty.h" #include "cedos/core.h" +#include "cedos/mm/memory.h" + #include "cedos/sched/sched.h" #include "cedos/sched/process.h"

@@ -16,12 +18,14 @@ #endif

//const int root_fd = 0x1000; -file_t file_table[256]; +file_t *file_table; int next_free = 0; int stdin, stdout, fat_root, pipe; int file_init() { + file_table = os_kernel_malloc(sizeof(file_t) * 512); + file_table[next_free].fops = &tty_fops; file_table[next_free].stdio_id = 0; file_table[next_free].fat_cluster = 0;
M src/kernel/main.csrc/kernel/main.c

@@ -7,6 +7,7 @@ #include "cedos/sched/sched.h"

#include "cedos/sched/process.h" #include "cedos/mm/paging.h" +#include "cedos/mm/memory.h" #include "cedos/interrupts.h" #include "cedos/syscall.h"

@@ -48,6 +49,10 @@ printk("done.\n");

printk("Setting up paging..."); paging_init(); + printk("done.\n"); + + printk("Initiallizing malloc..."); + malloc_init(); printk("done.\n"); printk("Activating interrupts...");
M src/kernel/mm/memory.csrc/kernel/mm/memory.c

@@ -1,12 +1,58 @@

#include "cedos/mm/memory.h" +#include "assert.h" + +struct memblock { + struct memblock *next; + int size; +}; + +struct memblock *malloc_first, *malloc_last, *malloc_next_free; + +int malloc_init() { + uint32_t mem_start = 0xC0400000u; + uint32_t mem_end = 0xC0800000u; + + malloc_first = (struct memblock*)(mem_start); + malloc_last = (struct memblock*)(mem_end - sizeof(struct memblock)); + malloc_next_free = malloc_first; + + malloc_first->size = 0; + malloc_first->next = malloc_last; + + malloc_last->size = 0; + malloc_last->next = NULL; +} + /*! * Allocates a block of \p size bytes of memory. (KERNEL MODE) * \param size Size in bytes of the requested block of memory. * \return Memory address to the new memory block */ void* os_kernel_malloc(size_t size) { - return (void*)0; + uint32_t addr = (uint32_t)(malloc_next_free); + + // TODO: test if memory block is large enough + assert(malloc_next_free->size == 0); + + addr += sizeof(struct memblock); + addr += size; + + // TODO: in some cases, one might rather link to the + // next block after that instead of creating a new block + + struct memblock *new_block = (struct memblock*)(addr); + + new_block->next = malloc_next_free->next; + new_block->size = 0; + + malloc_next_free->next = new_block; + malloc_next_free->size = size; + + void *pointer = (void*)(&malloc_next_free[1]); + malloc_next_free = new_block; + + return pointer; } /*!
M src/kernel/mm/paging.csrc/kernel/mm/paging.c

@@ -194,6 +194,7 @@ page_dir[0] = PAGE_DIR_MAPPED_ADDR[0];

// map kernel page_dir[PAGE_DIR_INDEX(0xc0000000)] = PAGE_DIR_MAPPED_ADDR[PAGE_DIR_INDEX(0xc0000000)]; + page_dir[PAGE_DIR_INDEX(0xc0400000)] = PAGE_DIR_MAPPED_ADDR[PAGE_DIR_INDEX(0xc0400000)]; return page_dir_phys; }
M src/kernel/sched/sched.csrc/kernel/sched/sched.c

@@ -3,6 +3,7 @@ #include "cedos/sched/process.h"

#include "cedos/sched/sched_strats.h" #include "cedos/mm/paging.h" +#include "cedos/mm/memory.h" #include "cedos/drivers/console.h" #include "cedos/drivers/speaker.h"

@@ -29,9 +30,8 @@ #define PRINT_DBG(...) {}

#endif PROCESS* get_slot(void) { - static PROCESS free_slots[8]; - static uint32_t index = 0; - return &(free_slots[index++]); + PROCESS *new_process = (PROCESS*)os_kernel_malloc(sizeof(PROCESS)); + return new_process; } PROCESS_ID current_pid;