diff --git a/kernel/src/arch/riscv32/context.rs b/kernel/src/arch/riscv32/context.rs index 4a00cfa..0a6037d 100644 --- a/kernel/src/arch/riscv32/context.rs +++ b/kernel/src/arch/riscv32/context.rs @@ -11,6 +11,7 @@ pub struct TrapFrame { } /// 用于在内核栈中构造新线程的中断帧 +/// The trapframe for building new process in kernel impl TrapFrame { fn new_kernel_thread(entry: extern fn(usize) -> !, arg: usize, sp: usize) -> Self { use core::mem::zeroed; diff --git a/kernel/src/fs.rs b/kernel/src/fs.rs index fe20c6c..748cc12 100644 --- a/kernel/src/fs.rs +++ b/kernel/src/fs.rs @@ -15,6 +15,7 @@ _binary_user_riscv_img_end: "#); pub fn shell() { + // load riscv32/x86_64 user program #[cfg(target_arch = "riscv32")] let device = { extern { @@ -36,6 +37,7 @@ pub fn shell() { const BUF_SIZE: usize = 0x40000; let layout = Layout::from_size_align(BUF_SIZE, 0x1000).unwrap(); let buf = unsafe{ slice::from_raw_parts_mut(alloc(layout), BUF_SIZE) }; + // start interaction loop { print!(">> "); use console::get_line; diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 4a23294..28ef150 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -61,16 +61,20 @@ pub mod arch; pub mod arch; pub fn kmain() -> ! { + // Init the first kernel process(idle proc) process::init(); + // enable the interrupt unsafe { arch::interrupt::enable(); } - fs::shell(); + // the test is not supported in riscv32(maybe) + //thread::test::local_key(); + //thread::test::unpack(); + //sync::test::philosopher_using_mutex(); + //sync::test::philosopher_using_monitor(); + //sync::mpsc::test::test_all(); -// thread::test::local_key(); -// thread::test::unpack(); -// sync::test::philosopher_using_mutex(); -// sync::test::philosopher_using_monitor(); -// sync::mpsc::test::test_all(); + // come into shell + fs::shell(); loop {} } diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index 569f3d2..41355f4 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -9,6 +9,10 @@ mod context; type Processor = Processor_; +/* +* @brief: +* initialize a new kernel process (idleproc) +*/ pub fn init() { PROCESSOR.call_once(|| SpinNoIrqLock::new({