From ef75c8a0724a8576d2ad2833b40f42c58c099418 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Sat, 17 Nov 2018 12:39:48 +0800 Subject: [PATCH] fix unwrap panic. now user shell is working. --- crate/process/src/thread.rs | 2 +- kernel/src/arch/riscv32/mod.rs | 2 -- kernel/src/arch/x86_64/mod.rs | 1 - kernel/src/process/mod.rs | 12 +++++++----- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/crate/process/src/thread.rs b/crate/process/src/thread.rs index fc40a85..8c7e944 100644 --- a/crate/process/src/thread.rs +++ b/crate/process/src/thread.rs @@ -95,7 +95,7 @@ pub fn spawn(f: F) -> JoinHandle // 在Processor中创建新的线程 let context = new_kernel_context(kernel_thread_entry::, f as usize); let pid = processor().manager().add(context); - processor().manager().set_parent(current().id(), pid); + processor().manager().set_parent(0, pid); // 接下来看看`JoinHandle::join()`的实现 // 了解是如何获取f返回值的 diff --git a/kernel/src/arch/riscv32/mod.rs b/kernel/src/arch/riscv32/mod.rs index ffdb088..c419892 100644 --- a/kernel/src/arch/riscv32/mod.rs +++ b/kernel/src/arch/riscv32/mod.rs @@ -25,9 +25,7 @@ pub extern fn rust_main(hartid: usize, dtb: usize, hart_mask: usize) -> ! { interrupt::init(); memory::init(); timer::init(); - ::process::init(); - ::thread::spawn(::shell::run_user_shell); unsafe { cpu::start_others(hart_mask); } ::kmain(); diff --git a/kernel/src/arch/x86_64/mod.rs b/kernel/src/arch/x86_64/mod.rs index 5d03d9c..ac7cb8f 100644 --- a/kernel/src/arch/x86_64/mod.rs +++ b/kernel/src/arch/x86_64/mod.rs @@ -48,7 +48,6 @@ pub extern "C" fn _start(boot_info: &'static BootInfo) -> ! { driver::init(); ::process::init(); - ::thread::spawn(::shell::run_user_shell); AP_CAN_INIT.store(true, Ordering::Relaxed); diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index 3d04f7e..c8ad2bd 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -13,18 +13,20 @@ pub fn init() { let scheduler = Box::new(scheduler::RRScheduler::new(5)); let manager = Arc::new(ProcessManager::new(scheduler, MAX_PROCESS_NUM)); + unsafe { + for cpu_id in 0..MAX_CPU_NUM { + PROCESSORS[cpu_id].init(cpu_id, ContextImpl::new_init(), manager.clone()); + } + } + extern fn idle(_arg: usize) -> ! { loop { cpu::halt(); } } for i in 0..4 { manager.add(ContextImpl::new_kernel(idle, i)); } + ::shell::run_user_shell(); - unsafe { - for cpu_id in 0..MAX_CPU_NUM { - PROCESSORS[cpu_id].init(cpu_id, ContextImpl::new_init(), manager.clone()); - } - } info!("process init end"); }