Sfoglia il codice sorgente

refactor-process-pcb-init (#1193)

将`do_create_pcb()`的内存占用量从10k降低到5k

Signed-off-by: longjin <longjin@DragonOS.org>
LoGin 3 settimane fa
parent
commit
78588e88b1
1 ha cambiato i file con 40 aggiunte e 39 eliminazioni
  1. 40 39
      kernel/src/process/mod.rs

+ 40 - 39
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<ProcessControlBlock> = 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);
+        // 使用 Arc::new_cyclic 避免在栈上创建巨大的结构体
+        let pcb = Arc::new_cyclic(|weak| {
+            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),
+            };
 
-        // 初始化系统调用栈
-        #[cfg(target_arch = "x86_64")]
-        pcb.arch_info
-            .lock()
-            .init_syscall_stack(&pcb.syscall_stack.read());
+            pcb.sig_info.write().set_tty(tty);
+
+            // 初始化系统调用栈
+            #[cfg(target_arch = "x86_64")]
+            pcb.arch_info
+                .lock()
+                .init_syscall_stack(&pcb.syscall_stack.read());
 
-        let pcb = Arc::new_cyclic(|weak| {
-            pcb.self_ref = weak.clone();
             pcb
         });