start of page allocation
This commit is contained in:
parent
a0973fe49d
commit
e64cf1ef72
5 changed files with 52 additions and 1 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
#define UART_ADDRESS 0x10000000
|
#define UART_ADDRESS 0x10000000
|
||||||
void uart_put(size_t base_addr, uint8_t data);
|
void uart_put(size_t base_addr, uint8_t data);
|
||||||
int kputchar(int ch);
|
int kputchar(int ch);
|
||||||
|
void knewline();
|
||||||
void kputs(const char *str);
|
void kputs(const char *str);
|
||||||
void kprint(const char *str);
|
void kprint(const char *str);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -3,8 +3,12 @@
|
||||||
#include <drivers/uart.h>
|
#include <drivers/uart.h>
|
||||||
#include <syscon/syscon.h>
|
#include <syscon/syscon.h>
|
||||||
#include <kernel/panic.h>
|
#include <kernel/panic.h>
|
||||||
|
#include <kernel/memory.h>
|
||||||
|
|
||||||
void kmain() {
|
void kmain() {
|
||||||
kprint("Hello, OS World!\n");
|
kputs("Hello, OS World!");
|
||||||
|
kputs("-------------------");
|
||||||
|
knewline();
|
||||||
|
page_init();
|
||||||
poweroff();
|
poweroff();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
33
src/kernel/memory.c
Normal file
33
src/kernel/memory.c
Normal 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
7
src/kernel/memory.h
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef KMEMORY_H
|
||||||
|
#define KMEMORY_H
|
||||||
|
|
||||||
|
void page_init();
|
||||||
|
void page_free(void *addr);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -4,11 +4,17 @@
|
||||||
#include "drivers/uart.h"
|
#include "drivers/uart.h"
|
||||||
|
|
||||||
void poweroff(void) {
|
void poweroff(void) {
|
||||||
|
knewline();
|
||||||
|
kputs("-------");
|
||||||
|
knewline();
|
||||||
kputs("Poweroff requested");
|
kputs("Poweroff requested");
|
||||||
*(volatile uint32_t *)SYSCON_ADDR = SYSCON_POWEROFF;
|
*(volatile uint32_t *)SYSCON_ADDR = SYSCON_POWEROFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reboot(void) {
|
void reboot(void) {
|
||||||
|
knewline();
|
||||||
|
kputs("-------");
|
||||||
|
knewline();
|
||||||
kputs("Reboot requested");
|
kputs("Reboot requested");
|
||||||
*(volatile uint32_t *)SYSCON_ADDR = SYSCON_REBOOT;
|
*(volatile uint32_t *)SYSCON_ADDR = SYSCON_REBOOT;
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue