1 use alloc::{string::String, sync::Arc, vec::Vec}; 2 3 use crate::{ 4 process::{fork::KernelCloneArgs, KernelStack, ProcessControlBlock, ProcessManager}, 5 syscall::SystemError, 6 }; 7 8 use super::interrupt::TrapFrame; 9 10 pub mod kthread; 11 pub mod syscall; 12 13 #[allow(dead_code)] 14 #[repr(align(32768))] 15 union InitProcUnion { 16 /// 用于存放idle进程的内核栈 17 idle_stack: [u8; 32768], 18 } 19 20 #[link_section = ".data.init_proc_union"] 21 #[no_mangle] 22 static BSP_IDLE_STACK_SPACE: InitProcUnion = InitProcUnion { 23 idle_stack: [0; 32768], 24 }; 25 26 pub unsafe fn arch_switch_to_user(path: String, argv: Vec<String>, envp: Vec<String>) -> ! { 27 unimplemented!("RiscV64 arch_switch_to_user") 28 } 29 30 impl ProcessManager { 31 pub fn arch_init() { 32 unimplemented!("ProcessManager::arch_init") 33 } 34 35 /// fork的过程中复制线程 36 /// 37 /// 由于这个过程与具体的架构相关,所以放在这里 38 pub fn copy_thread( 39 current_pcb: &Arc<ProcessControlBlock>, 40 new_pcb: &Arc<ProcessControlBlock>, 41 clone_args: KernelCloneArgs, 42 current_trapframe: &TrapFrame, 43 ) -> Result<(), SystemError> { 44 unimplemented!("ProcessManager::copy_thread") 45 } 46 47 /// 切换进程 48 /// 49 /// ## 参数 50 /// 51 /// - `prev`:上一个进程的pcb 52 /// - `next`:下一个进程的pcb 53 pub unsafe fn switch_process(prev: Arc<ProcessControlBlock>, next: Arc<ProcessControlBlock>) { 54 unimplemented!("ProcessManager::switch_process") 55 } 56 } 57 58 impl ProcessControlBlock { 59 /// 获取当前进程的pcb 60 pub fn arch_current_pcb() -> Arc<Self> { 61 unimplemented!("ProcessControlBlock::arch_current_pcb") 62 } 63 } 64 65 /// PCB中与架构相关的信息 66 #[derive(Debug)] 67 #[allow(dead_code)] 68 pub struct ArchPCBInfo { 69 // todo: add arch related fields 70 } 71 72 #[allow(dead_code)] 73 impl ArchPCBInfo { 74 /// 创建一个新的ArchPCBInfo 75 /// 76 /// ## 参数 77 /// 78 /// - `kstack`:内核栈的引用 79 /// 80 /// ## 返回值 81 /// 82 /// 返回一个新的ArchPCBInfo 83 pub fn new(kstack: &KernelStack) -> Self { 84 unimplemented!("ArchPCBInfo::new") 85 } 86 // ### 从另一个ArchPCBInfo处clone,但是保留部分字段不变 87 pub fn clone_from(&mut self, from: &Self) { 88 unimplemented!("ArchPCBInfo::clone_from") 89 } 90 } 91