diff --git a/kernel/proc.c b/kernel/proc.c index f7a7973..11fc6f5 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -7,13 +7,9 @@ #include "defs.h" struct proc proc[NPROC]; - struct proc *initproc; - extern void forkret(void); -extern char trampoline[]; // trampoline.S - // helps ensure that wakeups of wait()ing // parents are not lost. helps obey the // memory model when using p->parent. @@ -37,34 +33,8 @@ proc_mapstacks(pagetable_t kpgtbl) } } -// initialize the proc table. -void -procinit(void) -{ - struct proc *p; - - initlock(&wait_lock, "wait_lock"); - for(p = proc; p < &proc[NPROC]; p++) { - initlock(&p->lock, "proc"); - p->state = UNUSED; - p->kstack = KSTACK((int) (p - proc)); - } -} - -// Look in the process table for an UNUSED proc. -// If found, initialize state required to run in the kernel, -// and return with p->lock held. -// If there are no free procs, or a memory allocation fails, return 0. struct proc *allocproc(void); -// Create a user page table for a given process, with no user memory, -// but with trampoline and trapframe pages. -pagetable_t proc_pagetable(struct proc *p); - -// Free a process's page table, and free the -// physical memory it refers to. -void proc_freepagetable(pagetable_t pagetable, uint64 sz); - // a user program that calls exec("/init") // assembled from ../user/initcode.S // od -t xC ../user/initcode @@ -124,10 +94,6 @@ forkret(void) usertrapret(); } -// Atomically release lock and sleep on chan. -// Reacquires lock when awakened. -void sleep_lock(void *chan, struct spinlock *lk); - // Copy to either a user address, or kernel address, // depending on usr_dst. // Returns 0 on success, -1 on error. diff --git a/kernel/rustkernel/src/arch/mod.rs b/kernel/rustkernel/src/arch/mod.rs index cd9646b..005693d 100644 --- a/kernel/rustkernel/src/arch/mod.rs +++ b/kernel/rustkernel/src/arch/mod.rs @@ -29,8 +29,8 @@ pub mod mem { pub use super::riscv::{ asm::sfence_vma as flush_cached_pages, mem::{ - Pagetable, PagetableEntry, KERNEL_BASE, PAGE_SIZE, PHYSICAL_END, PTE_R, PTE_U, PTE_V, - PTE_W, PTE_X, TRAMPOLINE, TRAPFRAME, VIRTUAL_MAX, + kstack, Pagetable, PagetableEntry, KERNEL_BASE, PAGE_SIZE, PHYSICAL_END, PTE_R, PTE_U, + PTE_V, PTE_W, PTE_X, TRAMPOLINE, TRAPFRAME, VIRTUAL_MAX, }, }; diff --git a/kernel/rustkernel/src/proc/process.rs b/kernel/rustkernel/src/proc/process.rs index cec756a..7a17b01 100644 --- a/kernel/rustkernel/src/proc/process.rs +++ b/kernel/rustkernel/src/proc/process.rs @@ -8,7 +8,7 @@ use super::{ }; use crate::{ arch::{ - mem::{Pagetable, PAGE_SIZE, PTE_R, PTE_W, PTE_X, TRAMPOLINE, TRAPFRAME}, + mem::{kstack, Pagetable, PAGE_SIZE, PTE_R, PTE_W, PTE_X, TRAMPOLINE, TRAPFRAME}, trap::InterruptBlocker, virtual_memory::{ copyout, mappages, uvmalloc, uvmcopy, uvmcreate, uvmdealloc, uvmfree, uvmunmap, @@ -35,8 +35,6 @@ use core::{ extern "C" { pub static mut proc: [Process; crate::NPROC]; pub static mut initproc: *mut Process; - pub static mut nextpid: i32; - pub static mut pid_lock: Spinlock; /// Helps ensure that wakeups of wait()ing /// parents are not lost. Helps obey the /// memory model when using p->parent. @@ -45,18 +43,24 @@ extern "C" { // trampoline.S pub static mut trampoline: *mut c_char; - pub fn procinit(); pub fn userinit(); pub fn forkret(); - // pub fn fork() -> i32; - // pub fn exit(status: i32) -> !; pub fn wait(addr: u64) -> i32; - // pub fn procdump(); pub fn proc_mapstacks(kpgtbl: Pagetable); } pub static NEXT_PID: AtomicI32 = AtomicI32::new(1); +/// Initialize the proc table. +pub unsafe fn procinit() { + wait_lock = Spinlock::new(); + for (i, p) in proc.iter_mut().enumerate() { + *p = Process::new(); + p.state = ProcessState::Unused; + p.kernel_stack = kstack(i) as u64; + } +} + #[repr(C)] #[derive(Copy, Clone, Debug, Default, PartialEq)] pub enum ProcessState {