From e64cf1ef722b2226519e5af363de370b5d2a97e1 Mon Sep 17 00:00:00 2001 From: Liam Kerr Date: Sun, 8 Feb 2026 23:51:37 +0000 Subject: [PATCH] start of page allocation --- src/drivers/uart.h | 1 + src/kernel/kernel.c | 6 +++++- src/kernel/memory.c | 33 +++++++++++++++++++++++++++++++++ src/kernel/memory.h | 7 +++++++ src/syscon/syscon.c | 6 ++++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/kernel/memory.c create mode 100644 src/kernel/memory.h diff --git a/src/drivers/uart.h b/src/drivers/uart.h index 51e2587..19e527c 100644 --- a/src/drivers/uart.h +++ b/src/drivers/uart.h @@ -4,6 +4,7 @@ #define UART_ADDRESS 0x10000000 void uart_put(size_t base_addr, uint8_t data); int kputchar(int ch); +void knewline(); void kputs(const char *str); void kprint(const char *str); #endif \ No newline at end of file diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 99b8569..f9b4f56 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -3,8 +3,12 @@ #include #include #include +#include void kmain() { - kprint("Hello, OS World!\n"); + kputs("Hello, OS World!"); + kputs("-------------------"); + knewline(); + page_init(); poweroff(); } diff --git a/src/kernel/memory.c b/src/kernel/memory.c new file mode 100644 index 0000000..e28f57b --- /dev/null +++ b/src/kernel/memory.c @@ -0,0 +1,33 @@ +#include +#include +#include "drivers/uart.h" +#include "memory.h" + +#define PAGE_SIZE 4096 + +struct Page { + struct Page *next; +}; + +static struct Page *free_list; + +extern uint8_t _bss_end[]; // named in the linker script + +void page_init() { + kprint("Initialising page allocator.\n"); + uintptr_t start = ((uintptr_t)_bss_end + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); + uintptr_t end = 0x88000000; // Default QEMU RAM limit + + for (uintptr_t addr = start; addr + PAGE_SIZE <= end; addr += PAGE_SIZE) { + page_free((void *)addr); + } +} + +void page_free(void *addr) { + if (addr == NULL) return; + + struct Page *p = (struct Page *)addr; + + p->next = free_list; + free_list = p; +} \ No newline at end of file diff --git a/src/kernel/memory.h b/src/kernel/memory.h new file mode 100644 index 0000000..943bbe9 --- /dev/null +++ b/src/kernel/memory.h @@ -0,0 +1,7 @@ +#ifndef KMEMORY_H +#define KMEMORY_H + +void page_init(); +void page_free(void *addr); + +#endif diff --git a/src/syscon/syscon.c b/src/syscon/syscon.c index db9120e..bd8cb4a 100644 --- a/src/syscon/syscon.c +++ b/src/syscon/syscon.c @@ -4,11 +4,17 @@ #include "drivers/uart.h" void poweroff(void) { + knewline(); + kputs("-------"); + knewline(); kputs("Poweroff requested"); *(volatile uint32_t *)SYSCON_ADDR = SYSCON_POWEROFF; } void reboot(void) { + knewline(); + kputs("-------"); + knewline(); kputs("Reboot requested"); *(volatile uint32_t *)SYSCON_ADDR = SYSCON_REBOOT; } \ No newline at end of file