diff options
Diffstat (limited to 'src/kernel/proc.c')
-rw-r--r-- | src/kernel/proc.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/kernel/proc.c b/src/kernel/proc.c index 4a931a5..6b80254 100644 --- a/src/kernel/proc.c +++ b/src/kernel/proc.c @@ -1,19 +1,30 @@ #include <kernel/arch/generic.h> #include <kernel/mem.h> #include <kernel/proc.h> +#include <stdint.h> struct process *process_current; -struct process *process_new(void *eip) { - struct process *proc; - proc = page_alloc(1); // TODO kmalloc - proc->stack_top = proc->esp = page_alloc(1) + 1 * PAGE_SIZE; - proc->eip = eip; +struct process *process_new() { + struct process *proc = page_alloc(1); // TODO kmalloc + proc->pages = pagedir_new(); + // map the stack to the last page in memory + pagedir_map(proc->pages, (void*)~PAGE_MASK, page_alloc(1), true, true); + proc->stack_top = proc->esp = (void*) ~0; + + // map the kernel + // yup, .text is writeable too. the plan is to not map the kernel + // into user memory at all, but i'll implement that later. TODO + for (size_t p = 0x100000; p < &_bss_end; p += PAGE_SIZE) + pagedir_map(proc->pages, (void*)p, (void*)p, false, true); + + // the kernel still has to load the executable code and set EIP return proc; } void process_switch(struct process *proc) { process_current = proc; + pagedir_switch(proc->pages); sysexit(proc->eip, proc->esp); } |