start of page allocation

This commit is contained in:
Liam Kerr 2026-02-08 23:51:37 +00:00
parent a0973fe49d
commit e64cf1ef72
5 changed files with 52 additions and 1 deletions

View file

@ -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

View file

@ -3,8 +3,12 @@
#include <drivers/uart.h>
#include <syscon/syscon.h>
#include <kernel/panic.h>
#include <kernel/memory.h>
void kmain() {
kprint("Hello, OS World!\n");
kputs("Hello, OS World!");
kputs("-------------------");
knewline();
page_init();
poweroff();
}

33
src/kernel/memory.c Normal file
View file

@ -0,0 +1,33 @@
#include <stdint.h>
#include <stddef.h>
#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;
}

7
src/kernel/memory.h Normal file
View file

@ -0,0 +1,7 @@
#ifndef KMEMORY_H
#define KMEMORY_H
void page_init();
void page_free(void *addr);
#endif

View file

@ -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;
}