From 78588e88b1ca65c4357f9d70bad930b6fc7b5b5f Mon Sep 17 00:00:00 2001 From: LoGin Date: Thu, 5 Jun 2025 22:51:27 +0800 Subject: [PATCH] refactor-process-pcb-init (#1193) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将`do_create_pcb()`的内存占用量从10k降低到5k Signed-off-by: longjin --- kernel/src/process/mod.rs | 81 ++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/kernel/src/process/mod.rs b/kernel/src/process/mod.rs index c694392b..28406669 100644 --- a/kernel/src/process/mod.rs +++ b/kernel/src/process/mod.rs @@ -803,52 +803,53 @@ impl ProcessControlBlock { let flags = unsafe { LockFreeFlags::new(ProcessFlags::empty()) }; let sched_info = ProcessSchedulerInfo::new(None); - let arch_info = SpinLock::new(ArchPCBInfo::new(&kstack)); let ppcb: Weak = ProcessManager::find(ppid) .map(|p| Arc::downgrade(&p)) .unwrap_or_default(); - let mut pcb = Self { - pid, - tgid: pid, - thread_pid: Arc::new(RwLock::new(PidStrcut::new())), - basic: basic_info, - preempt_count, - flags, - kernel_stack: RwLock::new(kstack), - syscall_stack: RwLock::new(KernelStack::new().unwrap()), - worker_private: SpinLock::new(None), - sched_info, - arch_info, - sig_info: RwLock::new(ProcessSignalInfo::default()), - sig_struct: SpinLock::new(SignalStruct::new()), - exit_signal: AtomicSignal::new(Signal::SIGCHLD), - parent_pcb: RwLock::new(ppcb.clone()), - real_parent_pcb: RwLock::new(ppcb), - children: RwLock::new(Vec::new()), - wait_queue: WaitQueue::default(), - thread: RwLock::new(ThreadInfo::new()), - fs: RwLock::new(Arc::new(FsStruct::new())), - alarm_timer: SpinLock::new(None), - robust_list: RwLock::new(None), - nsproxy: Arc::new(RwLock::new(NsProxy::new())), - cred: SpinLock::new(cred), - self_ref: Weak::new(), - restart_block: SpinLock::new(None), - process_group: Mutex::new(Weak::new()), - executable_path: RwLock::new(name), - }; - - pcb.sig_info.write().set_tty(tty); - - // 初始化系统调用栈 - #[cfg(target_arch = "x86_64")] - pcb.arch_info - .lock() - .init_syscall_stack(&pcb.syscall_stack.read()); + // 使用 Arc::new_cyclic 避免在栈上创建巨大的结构体 let pcb = Arc::new_cyclic(|weak| { - pcb.self_ref = weak.clone(); + let arch_info = SpinLock::new(ArchPCBInfo::new(&kstack)); + let pcb = Self { + pid, + tgid: pid, + thread_pid: Arc::new(RwLock::new(PidStrcut::new())), + basic: basic_info, + preempt_count, + flags, + kernel_stack: RwLock::new(kstack), + syscall_stack: RwLock::new(KernelStack::new().unwrap()), + worker_private: SpinLock::new(None), + sched_info, + arch_info, + sig_info: RwLock::new(ProcessSignalInfo::default()), + sig_struct: SpinLock::new(SignalStruct::new()), + exit_signal: AtomicSignal::new(Signal::SIGCHLD), + parent_pcb: RwLock::new(ppcb.clone()), + real_parent_pcb: RwLock::new(ppcb), + children: RwLock::new(Vec::new()), + wait_queue: WaitQueue::default(), + thread: RwLock::new(ThreadInfo::new()), + fs: RwLock::new(Arc::new(FsStruct::new())), + alarm_timer: SpinLock::new(None), + robust_list: RwLock::new(None), + nsproxy: Arc::new(RwLock::new(NsProxy::new())), + cred: SpinLock::new(cred), + self_ref: weak.clone(), + restart_block: SpinLock::new(None), + process_group: Mutex::new(Weak::new()), + executable_path: RwLock::new(name), + }; + + pcb.sig_info.write().set_tty(tty); + + // 初始化系统调用栈 + #[cfg(target_arch = "x86_64")] + pcb.arch_info + .lock() + .init_syscall_stack(&pcb.syscall_stack.read()); + pcb });