From 7e8a831e1fa1fb98d2486f0c262c2609c176abab Mon Sep 17 00:00:00 2001 From: dzwdz Date: Fri, 25 Jun 2021 21:57:30 +0200 Subject: malloc stub + processes well, there's only one process, but shh --- kernel/main.c | 11 +++++++---- kernel/mem.c | 19 +++++++++++++++++++ kernel/mem.h | 7 +++++++ kernel/proc.c | 21 +++++++++++++++++++++ kernel/proc.h | 13 +++++++++++++ 5 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 kernel/mem.c create mode 100644 kernel/mem.h create mode 100644 kernel/proc.c create mode 100644 kernel/proc.h (limited to 'kernel') diff --git a/kernel/main.c b/kernel/main.c index 458558a..5c2c5e8 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -1,9 +1,9 @@ #include +#include +#include #include #include -extern void stack_top; - void r3_test(); void kmain() @@ -11,9 +11,12 @@ void kmain() tty_clear(); gdt_init(); sysenter_setup(); + mem_init(); - tty_const("jumping to ring3..."); - sysexit(r3_test, &stack_top); + tty_const("creating process..."); + struct process *proc = process_new(r3_test); + tty_const("switching..."); + process_switch(proc); } void r3_test() { diff --git a/kernel/mem.c b/kernel/mem.c new file mode 100644 index 0000000..8fcaf26 --- /dev/null +++ b/kernel/mem.c @@ -0,0 +1,19 @@ +#include + +extern void *_kernel_end; +static void *highest; + +void mem_init() { + highest = &_kernel_end; +} + +// should always succeed, there are no error checks anywhere +void *malloc(size_t size) { + void *block = highest; + highest += size; + return block; +} + +void free(void *ptr) { + // not implemented +} diff --git a/kernel/mem.h b/kernel/mem.h new file mode 100644 index 0000000..f779997 --- /dev/null +++ b/kernel/mem.h @@ -0,0 +1,7 @@ +#pragma once +#include + +void mem_init(); + +void *malloc(size_t size); +void free(void *ptr); diff --git a/kernel/proc.c b/kernel/proc.c new file mode 100644 index 0000000..1178952 --- /dev/null +++ b/kernel/proc.c @@ -0,0 +1,21 @@ +#include +#include +#include + +struct process *process_current; + +struct process *process_new(void *eip) { + struct process *proc; + proc = malloc(sizeof(struct process)); + + // should allocate an actual page. TODO + proc->stack_top = proc->esp = malloc(4096); + proc->eip = eip; + + return proc; +} + +void process_switch(struct process *proc) { + process_current = proc; + sysexit(proc->eip, proc->esp); +} diff --git a/kernel/proc.h b/kernel/proc.h new file mode 100644 index 0000000..976b275 --- /dev/null +++ b/kernel/proc.h @@ -0,0 +1,13 @@ +#pragma once + +struct process { + void *stack_top; + void *esp; + + void *eip; +}; + +extern struct process *process_current; + +struct process *process_new(void *eip); +void process_switch(struct process *proc); -- cgit v1.2.3