From acc4b7ccc133b64312e7ab1da3225b7945b1e13d Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Tue, 2 Mar 2021 19:04:53 +0100 Subject: very good this is --- kernel/features/proc.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'kernel/features/proc.c') diff --git a/kernel/features/proc.c b/kernel/features/proc.c index cdbe8b1..bbe675e 100644 --- a/kernel/features/proc.c +++ b/kernel/features/proc.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -57,6 +58,7 @@ void scheduler(struct regs *regs) } memcpy(regs, &((struct proc *)current->data)->regs, sizeof(struct regs)); + memory_dir_switch(((struct proc *)current->data)->page_dir); if (regs->cs != GDT_USER_CODE_OFFSET) { regs->gs = GDT_USER_DATA_OFFSET; @@ -103,7 +105,7 @@ u8 proc_super(void) { struct proc *proc = proc_current(); if (proc) - return proc->super; + return proc->priv == PROC_PRIV_ROOT || proc->priv == PROC_PRIV_KERNEL; else if (current_pid == 0) return 1; // Kernel has super permissions else @@ -237,14 +239,19 @@ end: p->state = PROC_SLEEPING; } -struct proc *proc_make(void) +struct proc *proc_make(enum proc_priv priv) { struct proc *proc = zalloc(sizeof(*proc)); proc->pid = current_pid++; - proc->super = 0; + proc->priv = priv; proc->messages = stack_new(); proc->state = PROC_RUNNING; + if (priv == PROC_PRIV_KERNEL) + proc->page_dir = memory_kernel_dir(); + else + proc->page_dir = memory_dir_create(); + if (current) list_add(proc_list, proc); @@ -465,20 +472,20 @@ void proc_init(void) vfs_mount(dev, "/proc/"); // Idle proc - struct proc *kernel_proc = proc_make(); + struct proc *kernel_proc = proc_make(PROC_PRIV_NONE); void (*func)(void) = kernel_idle; proc_load(kernel_proc, *(void **)&func); strcpy(kernel_proc->name, "idle"); kernel_proc->state = PROC_SLEEPING; idle_proc = list_add(proc_list, kernel_proc); - struct node *new = list_add(proc_list, proc_make()); + // Init proc (root) + struct node *new = list_add(proc_list, proc_make(PROC_PRIV_ROOT)); bin_load("/bin/init", new->data); current = new; _eip = ((struct proc *)new->data)->regs.eip; _esp = ((struct proc *)new->data)->regs.useresp; - ((struct proc *)new->data)->super = 1; u32 argc = 2; char **argv = malloc(sizeof(*argv) * (argc + 1)); @@ -491,6 +498,7 @@ void proc_init(void) printf("Jumping to userspace!\n"); proc_jump_userspace(); + memory_dir_switch(((struct proc *)new->data)->page_dir); while (1) { }; } -- cgit v1.2.3