1 use alloc::sync::Arc; 2 use riscv::register::sstatus::SPP; 3 use system_error::SystemError; 4 5 use crate::{ 6 arch::interrupt::TrapFrame, 7 process::{ 8 fork::CloneFlags, 9 kthread::{KernelThreadCreateInfo, KernelThreadMechanism}, 10 Pid, ProcessManager, 11 }, 12 }; 13 14 impl KernelThreadMechanism { 15 /// 伪造trapframe,创建内核线程 16 /// 17 /// ## 返回值 18 /// 19 /// 返回创建的内核线程的pid 20 #[inline(never)] 21 pub fn __inner_create( 22 info: &Arc<KernelThreadCreateInfo>, 23 clone_flags: CloneFlags, 24 ) -> Result<Pid, SystemError> { 25 // WARNING: If create failed, we must drop the info manually or it will cause memory leak. (refcount will not decrease when create failed) 26 let create_info: *const KernelThreadCreateInfo = 27 KernelThreadCreateInfo::generate_unsafe_arc_ptr(info.clone()); 28 29 let mut frame = TrapFrame::new(); 30 frame.a0 = create_info as usize; 31 32 // 使能中断 33 frame.status.update_sie(true); 34 frame.status.update_spp(SPP::Supervisor); 35 36 frame.ra = kernel_thread_bootstrap_stage1 as usize; 37 38 // fork失败的话,子线程不会执行。否则将导致内存安全问题。 39 let pid = ProcessManager::fork(&frame, clone_flags).map_err(|e| { 40 unsafe { KernelThreadCreateInfo::parse_unsafe_arc_ptr(create_info) }; 41 e 42 })?; 43 44 ProcessManager::find(pid) 45 .unwrap() 46 .set_name(info.name().clone()); 47 48 return Ok(pid); 49 } 50 } 51 52 /// 内核线程引导函数的第一阶段 53 /// 54 /// 当内核线程开始执行时,会先执行这个函数,这个函数会将伪造的trapframe中的数据弹出,然后跳转到第二阶段 55 /// 56 /// 跳转之后,指向Box<KernelThreadClosure>的指针将传入到stage2的函数 57 // #[naked] 58 // pub(super) unsafe extern "C" fn kernel_thread_bootstrap_stage1() { 59 // todo!() 60 // } 61 pub(super) unsafe extern "C" fn kernel_thread_bootstrap_stage1() { 62 // 这个函数要是naked的,只是因为现在还没有实现,而naked func不能打`unimplemented!()` 63 // 所以先写成了普通函数 64 unimplemented!("kernel_thread_bootstrap_stage1") 65 } 66