1393f6915SLoGin use core::{intrinsics::unlikely, sync::atomic::Ordering}; 2393f6915SLoGin 31496ba7bSLoGin use alloc::{string::ToString, sync::Arc}; 42eab6dd7S曾俊 use log::error; 591e9d4abSLoGin use system_error::SystemError; 6c8025a88Slogin 7c8025a88Slogin use crate::{ 8393f6915SLoGin arch::{interrupt::TrapFrame, ipc::signal::Signal}, 9971462beSGnoCiYeH filesystem::procfs::procfs_register_pid, 10971462beSGnoCiYeH ipc::signal::flush_signal_handlers, 11971462beSGnoCiYeH libs::rwlock::RwLock, 12971462beSGnoCiYeH mm::VirtAddr, 13971462beSGnoCiYeH process::ProcessFlags, 14f0c87a89SGnoCiYeH sched::{sched_cgroup_fork, sched_fork}, 15f0c87a89SGnoCiYeH smp::core::smp_get_processor_id, 1691e9d4abSLoGin syscall::user_access::UserBufferWriter, 17c8025a88Slogin }; 1866f67c6aSlogin 191496ba7bSLoGin use super::{ 201496ba7bSLoGin kthread::{KernelThreadPcbPrivate, WorkerPrivate}, 211496ba7bSLoGin KernelStack, Pid, ProcessControlBlock, ProcessManager, 221496ba7bSLoGin }; 231a2eaa40Slogin 241496ba7bSLoGin bitflags! { 251496ba7bSLoGin /// 进程克隆标志 26971462beSGnoCiYeH pub struct CloneFlags: u64 { 271496ba7bSLoGin /// 在进程间共享虚拟内存空间 28971462beSGnoCiYeH const CLONE_VM = 0x00000100; 29971462beSGnoCiYeH /// 在进程间共享文件系统信息 30971462beSGnoCiYeH const CLONE_FS = 0x00000200; 311496ba7bSLoGin /// 共享打开的文件 32971462beSGnoCiYeH const CLONE_FILES = 0x00000400; 33971462beSGnoCiYeH /// 克隆时,与父进程共享信号处理结构体 34971462beSGnoCiYeH const CLONE_SIGHAND = 0x00000800; 35971462beSGnoCiYeH /// 返回进程的文件描述符 36971462beSGnoCiYeH const CLONE_PIDFD = 0x00001000; 37971462beSGnoCiYeH /// 使克隆对象成为父进程的跟踪对象 38971462beSGnoCiYeH const CLONE_PTRACE = 0x00002000; 39971462beSGnoCiYeH /// 在执行 exec() 或 _exit() 之前挂起父进程的执行 40971462beSGnoCiYeH const CLONE_VFORK = 0x00004000; 41971462beSGnoCiYeH /// 使克隆对象的父进程为调用进程的父进程 42971462beSGnoCiYeH const CLONE_PARENT = 0x00008000; 43971462beSGnoCiYeH /// 拷贝线程 44971462beSGnoCiYeH const CLONE_THREAD = 0x00010000; 45971462beSGnoCiYeH /// 创建一个新的命名空间,其中包含独立的文件系统挂载点层次结构。 46971462beSGnoCiYeH const CLONE_NEWNS = 0x00020000; 47971462beSGnoCiYeH /// 与父进程共享 System V 信号量。 48971462beSGnoCiYeH const CLONE_SYSVSEM = 0x00040000; 49971462beSGnoCiYeH /// 设置其线程本地存储 50971462beSGnoCiYeH const CLONE_SETTLS = 0x00080000; 51971462beSGnoCiYeH /// 设置partent_tid地址为子进程线程 ID 52971462beSGnoCiYeH const CLONE_PARENT_SETTID = 0x00100000; 53971462beSGnoCiYeH /// 在子进程中设置一个清除线程 ID 的用户空间地址 54971462beSGnoCiYeH const CLONE_CHILD_CLEARTID = 0x00200000; 55971462beSGnoCiYeH /// 创建一个新线程,将其设置为分离状态 56971462beSGnoCiYeH const CLONE_DETACHED = 0x00400000; 57971462beSGnoCiYeH /// 使其在创建者进程或线程视角下成为无法跟踪的。 58971462beSGnoCiYeH const CLONE_UNTRACED = 0x00800000; 59971462beSGnoCiYeH /// 设置其子进程线程 ID 60971462beSGnoCiYeH const CLONE_CHILD_SETTID = 0x01000000; 61971462beSGnoCiYeH /// 将其放置在一个新的 cgroup 命名空间中 62971462beSGnoCiYeH const CLONE_NEWCGROUP = 0x02000000; 63971462beSGnoCiYeH /// 将其放置在一个新的 UTS 命名空间中 64971462beSGnoCiYeH const CLONE_NEWUTS = 0x04000000; 65971462beSGnoCiYeH /// 将其放置在一个新的 IPC 命名空间中 66971462beSGnoCiYeH const CLONE_NEWIPC = 0x08000000; 67971462beSGnoCiYeH /// 将其放置在一个新的用户命名空间中 68971462beSGnoCiYeH const CLONE_NEWUSER = 0x10000000; 69971462beSGnoCiYeH /// 将其放置在一个新的 PID 命名空间中 70971462beSGnoCiYeH const CLONE_NEWPID = 0x20000000; 71971462beSGnoCiYeH /// 将其放置在一个新的网络命名空间中 72971462beSGnoCiYeH const CLONE_NEWNET = 0x40000000; 73971462beSGnoCiYeH /// 在新的 I/O 上下文中运行它 74971462beSGnoCiYeH const CLONE_IO = 0x80000000; 75971462beSGnoCiYeH /// 克隆时,与父进程共享信号结构体 76971462beSGnoCiYeH const CLONE_SIGNAL = 0x00010000 | 0x00000800; 77971462beSGnoCiYeH /// 克隆时,将原本被设置为SIG_IGNORE的信号,设置回SIG_DEFAULT 78971462beSGnoCiYeH const CLONE_CLEAR_SIGHAND = 0x100000000; 79971462beSGnoCiYeH } 80971462beSGnoCiYeH } 81971462beSGnoCiYeH 82971462beSGnoCiYeH /// ## clone与clone3系统调用的参数载体 83971462beSGnoCiYeH /// 84971462beSGnoCiYeH /// 因为这两个系统调用的参数很多,所以有这样一个载体更灵活 85971462beSGnoCiYeH /// 86971462beSGnoCiYeH /// 仅仅作为参数传递 87971462beSGnoCiYeH #[derive(Debug, Clone, Copy)] 88*bd70d2d1SLoGin #[allow(dead_code)] 89971462beSGnoCiYeH pub struct KernelCloneArgs { 90971462beSGnoCiYeH pub flags: CloneFlags, 91971462beSGnoCiYeH 92971462beSGnoCiYeH // 下列属性均来自用户空间 93971462beSGnoCiYeH pub pidfd: VirtAddr, 94971462beSGnoCiYeH pub child_tid: VirtAddr, 95971462beSGnoCiYeH pub parent_tid: VirtAddr, 96971462beSGnoCiYeH pub set_tid: VirtAddr, 97971462beSGnoCiYeH 98393f6915SLoGin /// 进程退出时发送的信号 99393f6915SLoGin pub exit_signal: Signal, 100971462beSGnoCiYeH 101971462beSGnoCiYeH pub stack: usize, 102971462beSGnoCiYeH // clone3用到 103971462beSGnoCiYeH pub stack_size: usize, 104971462beSGnoCiYeH pub tls: usize, 105971462beSGnoCiYeH 106971462beSGnoCiYeH pub set_tid_size: usize, 107971462beSGnoCiYeH pub cgroup: i32, 108971462beSGnoCiYeH 109971462beSGnoCiYeH pub io_thread: bool, 110971462beSGnoCiYeH pub kthread: bool, 111971462beSGnoCiYeH pub idle: bool, 112971462beSGnoCiYeH pub func: VirtAddr, 113971462beSGnoCiYeH pub fn_arg: VirtAddr, 114971462beSGnoCiYeH // cgrp 和 cset? 115971462beSGnoCiYeH } 116971462beSGnoCiYeH 117971462beSGnoCiYeH impl KernelCloneArgs { new() -> Self118971462beSGnoCiYeH pub fn new() -> Self { 119971462beSGnoCiYeH let null_addr = VirtAddr::new(0); 120971462beSGnoCiYeH Self { 121971462beSGnoCiYeH flags: unsafe { CloneFlags::from_bits_unchecked(0) }, 122971462beSGnoCiYeH pidfd: null_addr, 123971462beSGnoCiYeH child_tid: null_addr, 124971462beSGnoCiYeH parent_tid: null_addr, 125971462beSGnoCiYeH set_tid: null_addr, 126393f6915SLoGin exit_signal: Signal::SIGCHLD, 127971462beSGnoCiYeH stack: 0, 128971462beSGnoCiYeH stack_size: 0, 129971462beSGnoCiYeH tls: 0, 130971462beSGnoCiYeH set_tid_size: 0, 131971462beSGnoCiYeH cgroup: 0, 132971462beSGnoCiYeH io_thread: false, 133971462beSGnoCiYeH kthread: false, 134971462beSGnoCiYeH idle: false, 135971462beSGnoCiYeH func: null_addr, 136971462beSGnoCiYeH fn_arg: null_addr, 137971462beSGnoCiYeH } 138c8025a88Slogin } 13966f67c6aSlogin } 14066f67c6aSlogin 1411496ba7bSLoGin impl ProcessManager { 1421496ba7bSLoGin /// 创建一个新进程 1431496ba7bSLoGin /// 1441496ba7bSLoGin /// ## 参数 1451496ba7bSLoGin /// 1461496ba7bSLoGin /// - `current_trapframe`: 当前进程的trapframe 1471496ba7bSLoGin /// - `clone_flags`: 进程克隆标志 1481496ba7bSLoGin /// 1491496ba7bSLoGin /// ## 返回值 1501496ba7bSLoGin /// 1511496ba7bSLoGin /// - 成功:返回新进程的pid 1521496ba7bSLoGin /// - 失败:返回Err(SystemError),fork失败的话,子线程不会执行。 1531496ba7bSLoGin /// 1541496ba7bSLoGin /// ## Safety 1551496ba7bSLoGin /// 1561496ba7bSLoGin /// - fork失败的话,子线程不会执行。 fork( current_trapframe: &TrapFrame, clone_flags: CloneFlags, ) -> Result<Pid, SystemError>1571496ba7bSLoGin pub fn fork( 158840045afSLoGin current_trapframe: &TrapFrame, 1591496ba7bSLoGin clone_flags: CloneFlags, 1601496ba7bSLoGin ) -> Result<Pid, SystemError> { 1611496ba7bSLoGin let current_pcb = ProcessManager::current_pcb(); 1624fda81ceSLoGin 1634fda81ceSLoGin let new_kstack: KernelStack = KernelStack::new()?; 1644fda81ceSLoGin 1651496ba7bSLoGin let name = current_pcb.basic().name().to_string(); 1660d6cf65aSLoGin 1671496ba7bSLoGin let pcb = ProcessControlBlock::new(name, new_kstack); 1681496ba7bSLoGin 169971462beSGnoCiYeH let mut args = KernelCloneArgs::new(); 170971462beSGnoCiYeH args.flags = clone_flags; 171393f6915SLoGin args.exit_signal = Signal::SIGCHLD; 17259fdb447SLoGin Self::copy_process(¤t_pcb, &pcb, args, current_trapframe).map_err(|e| { 1732eab6dd7S曾俊 error!( 17459fdb447SLoGin "fork: Failed to copy process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 17559fdb447SLoGin current_pcb.pid(), 17659fdb447SLoGin pcb.pid(), 17759fdb447SLoGin e 17859fdb447SLoGin ); 17959fdb447SLoGin e 18059fdb447SLoGin })?; 1811496ba7bSLoGin ProcessManager::add_pcb(pcb.clone()); 1821496ba7bSLoGin 1831496ba7bSLoGin // 向procfs注册进程 1841496ba7bSLoGin procfs_register_pid(pcb.pid()).unwrap_or_else(|e| { 1851496ba7bSLoGin panic!( 1861496ba7bSLoGin "fork: Failed to register pid to procfs, pid: [{:?}]. Error: {:?}", 1871496ba7bSLoGin pcb.pid(), 1881496ba7bSLoGin e 1891496ba7bSLoGin ) 1901496ba7bSLoGin }); 1911496ba7bSLoGin 192f0c87a89SGnoCiYeH pcb.sched_info().set_on_cpu(Some(smp_get_processor_id())); 193f0c87a89SGnoCiYeH 1941496ba7bSLoGin ProcessManager::wakeup(&pcb).unwrap_or_else(|e| { 1951496ba7bSLoGin panic!( 1961496ba7bSLoGin "fork: Failed to wakeup new process, pid: [{:?}]. Error: {:?}", 1971496ba7bSLoGin pcb.pid(), 1981496ba7bSLoGin e 1991496ba7bSLoGin ) 2001496ba7bSLoGin }); 2011496ba7bSLoGin 2021496ba7bSLoGin return Ok(pcb.pid()); 2031496ba7bSLoGin } 2041496ba7bSLoGin copy_flags( clone_flags: &CloneFlags, new_pcb: &Arc<ProcessControlBlock>, ) -> Result<(), SystemError>2051496ba7bSLoGin fn copy_flags( 2061496ba7bSLoGin clone_flags: &CloneFlags, 2071496ba7bSLoGin new_pcb: &Arc<ProcessControlBlock>, 2081496ba7bSLoGin ) -> Result<(), SystemError> { 2091496ba7bSLoGin if clone_flags.contains(CloneFlags::CLONE_VM) { 2101496ba7bSLoGin new_pcb.flags().insert(ProcessFlags::VFORK); 2111496ba7bSLoGin } 212b5b571e0SLoGin *new_pcb.flags.get_mut() = *ProcessManager::current_pcb().flags(); 2131496ba7bSLoGin return Ok(()); 21466f67c6aSlogin } 21540fe15e0SLoGin 21640fe15e0SLoGin /// 拷贝进程的地址空间 21740fe15e0SLoGin /// 21840fe15e0SLoGin /// ## 参数 21940fe15e0SLoGin /// 22040fe15e0SLoGin /// - `clone_vm`: 是否与父进程共享地址空间。true表示共享 22140fe15e0SLoGin /// - `new_pcb`: 新进程的pcb 22240fe15e0SLoGin /// 22340fe15e0SLoGin /// ## 返回值 22440fe15e0SLoGin /// 22540fe15e0SLoGin /// - 成功:返回Ok(()) 22640fe15e0SLoGin /// - 失败:返回Err(SystemError) 22740fe15e0SLoGin /// 22840fe15e0SLoGin /// ## Panic 22940fe15e0SLoGin /// 23040fe15e0SLoGin /// - 如果当前进程没有用户地址空间,则panic 2314fda81ceSLoGin #[inline(never)] copy_mm( clone_flags: &CloneFlags, current_pcb: &Arc<ProcessControlBlock>, new_pcb: &Arc<ProcessControlBlock>, ) -> Result<(), SystemError>2321496ba7bSLoGin fn copy_mm( 2331496ba7bSLoGin clone_flags: &CloneFlags, 2341496ba7bSLoGin current_pcb: &Arc<ProcessControlBlock>, 2351496ba7bSLoGin new_pcb: &Arc<ProcessControlBlock>, 2361496ba7bSLoGin ) -> Result<(), SystemError> { 2371496ba7bSLoGin let old_address_space = current_pcb.basic().user_vm().unwrap_or_else(|| { 2381496ba7bSLoGin panic!( 2391496ba7bSLoGin "copy_mm: Failed to get address space of current process, current pid: [{:?}]", 2401496ba7bSLoGin current_pcb.pid() 2411496ba7bSLoGin ) 2421496ba7bSLoGin }); 24340fe15e0SLoGin 2441496ba7bSLoGin if clone_flags.contains(CloneFlags::CLONE_VM) { 2451496ba7bSLoGin unsafe { new_pcb.basic_mut().set_user_vm(Some(old_address_space)) }; 24640fe15e0SLoGin return Ok(()); 24740fe15e0SLoGin } 2480d6cf65aSLoGin let new_address_space = old_address_space.write_irqsave().try_clone().unwrap_or_else(|e| { 24940fe15e0SLoGin panic!( 2501496ba7bSLoGin "copy_mm: Failed to clone address space of current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 2511496ba7bSLoGin current_pcb.pid(), new_pcb.pid(), e 25240fe15e0SLoGin ) 25340fe15e0SLoGin }); 2541496ba7bSLoGin unsafe { new_pcb.basic_mut().set_user_vm(Some(new_address_space)) }; 25540fe15e0SLoGin return Ok(()); 25640fe15e0SLoGin } 2571496ba7bSLoGin 2580d6cf65aSLoGin #[inline(never)] copy_files( clone_flags: &CloneFlags, current_pcb: &Arc<ProcessControlBlock>, new_pcb: &Arc<ProcessControlBlock>, ) -> Result<(), SystemError>2591496ba7bSLoGin fn copy_files( 2601496ba7bSLoGin clone_flags: &CloneFlags, 2611496ba7bSLoGin current_pcb: &Arc<ProcessControlBlock>, 2621496ba7bSLoGin new_pcb: &Arc<ProcessControlBlock>, 2631496ba7bSLoGin ) -> Result<(), SystemError> { 2641496ba7bSLoGin // 如果不共享文件描述符表,则拷贝文件描述符表 2651496ba7bSLoGin if !clone_flags.contains(CloneFlags::CLONE_FILES) { 2661496ba7bSLoGin let new_fd_table = current_pcb.basic().fd_table().unwrap().read().clone(); 2671496ba7bSLoGin let new_fd_table = Arc::new(RwLock::new(new_fd_table)); 2681496ba7bSLoGin new_pcb.basic_mut().set_fd_table(Some(new_fd_table)); 269bb0e4d41SGnoCiYeH } else { 2701496ba7bSLoGin // 如果共享文件描述符表,则直接拷贝指针 2711496ba7bSLoGin new_pcb 2721496ba7bSLoGin .basic_mut() 2731496ba7bSLoGin .set_fd_table(current_pcb.basic().fd_table().clone()); 274bb0e4d41SGnoCiYeH } 2751496ba7bSLoGin 2761496ba7bSLoGin return Ok(()); 2771496ba7bSLoGin } 2781496ba7bSLoGin 2791496ba7bSLoGin #[allow(dead_code)] copy_sighand( clone_flags: &CloneFlags, current_pcb: &Arc<ProcessControlBlock>, new_pcb: &Arc<ProcessControlBlock>, ) -> Result<(), SystemError>2801496ba7bSLoGin fn copy_sighand( 2813c82aa56SChiichen clone_flags: &CloneFlags, 2823c82aa56SChiichen current_pcb: &Arc<ProcessControlBlock>, 2833c82aa56SChiichen new_pcb: &Arc<ProcessControlBlock>, 2841496ba7bSLoGin ) -> Result<(), SystemError> { 2853c82aa56SChiichen // // 将信号的处理函数设置为default(除了那些被手动屏蔽的) 2863c82aa56SChiichen if clone_flags.contains(CloneFlags::CLONE_CLEAR_SIGHAND) { 2873c82aa56SChiichen flush_signal_handlers(new_pcb.clone(), false); 2883c82aa56SChiichen } 2893c82aa56SChiichen 2903c82aa56SChiichen if clone_flags.contains(CloneFlags::CLONE_SIGHAND) { 291b5b571e0SLoGin new_pcb.sig_struct_irqsave().handlers = current_pcb.sig_struct_irqsave().handlers; 2923c82aa56SChiichen } 2931496ba7bSLoGin return Ok(()); 2941496ba7bSLoGin } 295971462beSGnoCiYeH 296971462beSGnoCiYeH /// 拷贝进程信息 297971462beSGnoCiYeH /// 298971462beSGnoCiYeH /// ## panic: 299971462beSGnoCiYeH /// 某一步拷贝失败时会引发panic 300971462beSGnoCiYeH /// 例如:copy_mm等失败时会触发panic 301971462beSGnoCiYeH /// 302971462beSGnoCiYeH /// ## 参数 303971462beSGnoCiYeH /// 304971462beSGnoCiYeH /// - clone_flags 标志位 3050d6cf65aSLoGin /// - current_pcb 拷贝源pcb 3060d6cf65aSLoGin /// - pcb 目标pcb 307971462beSGnoCiYeH /// 308971462beSGnoCiYeH /// ## return 309971462beSGnoCiYeH /// - 发生错误时返回Err(SystemError) 3104fda81ceSLoGin #[inline(never)] copy_process( current_pcb: &Arc<ProcessControlBlock>, pcb: &Arc<ProcessControlBlock>, clone_args: KernelCloneArgs, current_trapframe: &TrapFrame, ) -> Result<(), SystemError>311971462beSGnoCiYeH pub fn copy_process( 312971462beSGnoCiYeH current_pcb: &Arc<ProcessControlBlock>, 313971462beSGnoCiYeH pcb: &Arc<ProcessControlBlock>, 314971462beSGnoCiYeH clone_args: KernelCloneArgs, 315840045afSLoGin current_trapframe: &TrapFrame, 316971462beSGnoCiYeH ) -> Result<(), SystemError> { 317971462beSGnoCiYeH let clone_flags = clone_args.flags; 318971462beSGnoCiYeH // 不允许与不同namespace的进程共享根目录 319971462beSGnoCiYeH if (clone_flags == (CloneFlags::CLONE_NEWNS | CloneFlags::CLONE_FS)) 320971462beSGnoCiYeH || clone_flags == (CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_FS) 321971462beSGnoCiYeH { 322971462beSGnoCiYeH return Err(SystemError::EINVAL); 323971462beSGnoCiYeH } 324971462beSGnoCiYeH 325971462beSGnoCiYeH // 线程组必须共享信号,分离线程只能在线程组内启动。 326971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_THREAD) 327971462beSGnoCiYeH && !clone_flags.contains(CloneFlags::CLONE_SIGHAND) 328971462beSGnoCiYeH { 329971462beSGnoCiYeH return Err(SystemError::EINVAL); 330971462beSGnoCiYeH } 331971462beSGnoCiYeH 332971462beSGnoCiYeH // 共享信号处理器意味着共享vm。 333971462beSGnoCiYeH // 线程组也意味着共享vm。阻止这种情况可以简化其他代码。 334971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_SIGHAND) 335971462beSGnoCiYeH && !clone_flags.contains(CloneFlags::CLONE_VM) 336971462beSGnoCiYeH { 337971462beSGnoCiYeH return Err(SystemError::EINVAL); 338971462beSGnoCiYeH } 339971462beSGnoCiYeH 340971462beSGnoCiYeH // TODO: 处理CLONE_PARENT 与 SIGNAL_UNKILLABLE的情况 341971462beSGnoCiYeH 342971462beSGnoCiYeH // 如果新进程使用不同的 pid 或 namespace, 343971462beSGnoCiYeH // 则不允许它与分叉任务共享线程组。 344b5b571e0SLoGin if clone_flags.contains(CloneFlags::CLONE_THREAD) 345b5b571e0SLoGin && clone_flags.contains(CloneFlags::CLONE_NEWUSER | CloneFlags::CLONE_NEWPID) 346b5b571e0SLoGin { 347971462beSGnoCiYeH return Err(SystemError::EINVAL); 348971462beSGnoCiYeH // TODO: 判断新进程与当前进程namespace是否相同,不同则返回错误 349971462beSGnoCiYeH } 350971462beSGnoCiYeH 351971462beSGnoCiYeH // 如果新进程将处于不同的time namespace, 352971462beSGnoCiYeH // 则不能让它共享vm或线程组。 353971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_THREAD | CloneFlags::CLONE_VM) { 354971462beSGnoCiYeH // TODO: 判断time namespace,不同则返回错误 355971462beSGnoCiYeH } 356971462beSGnoCiYeH 357971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_PIDFD) 358971462beSGnoCiYeH && clone_flags.contains(CloneFlags::CLONE_DETACHED | CloneFlags::CLONE_THREAD) 359971462beSGnoCiYeH { 360971462beSGnoCiYeH return Err(SystemError::EINVAL); 361971462beSGnoCiYeH } 362971462beSGnoCiYeH 363971462beSGnoCiYeH // TODO: 克隆前应该锁信号处理,等待克隆完成后再处理 364971462beSGnoCiYeH 365971462beSGnoCiYeH // 克隆架构相关 36616033951SGnoCiYeH let guard = current_pcb.arch_info_irqsave(); 3670d6cf65aSLoGin unsafe { pcb.arch_info().clone_from(&guard) }; 36816033951SGnoCiYeH drop(guard); 369971462beSGnoCiYeH 370971462beSGnoCiYeH // 为内核线程设置WorkerPrivate 371971462beSGnoCiYeH if current_pcb.flags().contains(ProcessFlags::KTHREAD) { 372971462beSGnoCiYeH *pcb.worker_private() = 373971462beSGnoCiYeH Some(WorkerPrivate::KernelThread(KernelThreadPcbPrivate::new())); 374971462beSGnoCiYeH } 375971462beSGnoCiYeH 376971462beSGnoCiYeH // 设置clear_child_tid,在线程结束时将其置0以通知父进程 377971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_CHILD_CLEARTID) { 37852bcb59eSGnoCiYeH pcb.thread.write_irqsave().clear_child_tid = Some(clone_args.child_tid); 379971462beSGnoCiYeH } 380971462beSGnoCiYeH 381971462beSGnoCiYeH // 设置child_tid,意味着子线程能够知道自己的id 382971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_CHILD_SETTID) { 38352bcb59eSGnoCiYeH pcb.thread.write_irqsave().set_child_tid = Some(clone_args.child_tid); 384971462beSGnoCiYeH } 385971462beSGnoCiYeH 386971462beSGnoCiYeH // 将子进程/线程的id存储在用户态传进的地址中 387971462beSGnoCiYeH if clone_flags.contains(CloneFlags::CLONE_PARENT_SETTID) { 388971462beSGnoCiYeH let mut writer = UserBufferWriter::new( 389971462beSGnoCiYeH clone_args.parent_tid.data() as *mut i32, 390971462beSGnoCiYeH core::mem::size_of::<i32>(), 391971462beSGnoCiYeH true, 392971462beSGnoCiYeH )?; 393971462beSGnoCiYeH 394971462beSGnoCiYeH writer.copy_one_to_user(&(pcb.pid().0 as i32), 0)?; 395971462beSGnoCiYeH } 396971462beSGnoCiYeH 397f0c87a89SGnoCiYeH sched_fork(pcb).unwrap_or_else(|e| { 398f0c87a89SGnoCiYeH panic!( 399f0c87a89SGnoCiYeH "fork: Failed to set sched info from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 400f0c87a89SGnoCiYeH current_pcb.pid(), pcb.pid(), e 401f0c87a89SGnoCiYeH ) 402f0c87a89SGnoCiYeH }); 403f0c87a89SGnoCiYeH 404971462beSGnoCiYeH // 拷贝标志位 405b5b571e0SLoGin Self::copy_flags(&clone_flags, pcb).unwrap_or_else(|e| { 406971462beSGnoCiYeH panic!( 407971462beSGnoCiYeH "fork: Failed to copy flags from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 408971462beSGnoCiYeH current_pcb.pid(), pcb.pid(), e 409971462beSGnoCiYeH ) 410971462beSGnoCiYeH }); 411971462beSGnoCiYeH 412971462beSGnoCiYeH // 拷贝用户地址空间 413b5b571e0SLoGin Self::copy_mm(&clone_flags, current_pcb, pcb).unwrap_or_else(|e| { 414971462beSGnoCiYeH panic!( 415971462beSGnoCiYeH "fork: Failed to copy mm from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 416971462beSGnoCiYeH current_pcb.pid(), pcb.pid(), e 417971462beSGnoCiYeH ) 418971462beSGnoCiYeH }); 419971462beSGnoCiYeH 420971462beSGnoCiYeH // 拷贝文件描述符表 421b5b571e0SLoGin Self::copy_files(&clone_flags, current_pcb, pcb).unwrap_or_else(|e| { 422971462beSGnoCiYeH panic!( 423971462beSGnoCiYeH "fork: Failed to copy files from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 424971462beSGnoCiYeH current_pcb.pid(), pcb.pid(), e 425971462beSGnoCiYeH ) 426971462beSGnoCiYeH }); 427971462beSGnoCiYeH 428393f6915SLoGin // 拷贝信号相关数据 429b5b571e0SLoGin Self::copy_sighand(&clone_flags, current_pcb, pcb).unwrap_or_else(|e| { 430393f6915SLoGin panic!( 431393f6915SLoGin "fork: Failed to copy sighand from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 432393f6915SLoGin current_pcb.pid(), pcb.pid(), e 433393f6915SLoGin ) 434b5b571e0SLoGin }); 435971462beSGnoCiYeH 436971462beSGnoCiYeH // 拷贝线程 437b5b571e0SLoGin Self::copy_thread(current_pcb, pcb, clone_args,current_trapframe).unwrap_or_else(|e| { 438971462beSGnoCiYeH panic!( 439971462beSGnoCiYeH "fork: Failed to copy thread from current process, current pid: [{:?}], new pid: [{:?}]. Error: {:?}", 440971462beSGnoCiYeH current_pcb.pid(), pcb.pid(), e 441971462beSGnoCiYeH ) 442971462beSGnoCiYeH }); 443971462beSGnoCiYeH 444393f6915SLoGin // 设置线程组id、组长 445393f6915SLoGin if clone_flags.contains(CloneFlags::CLONE_THREAD) { 44652bcb59eSGnoCiYeH pcb.thread.write_irqsave().group_leader = 44752bcb59eSGnoCiYeH current_pcb.thread.read_irqsave().group_leader.clone(); 448393f6915SLoGin unsafe { 449393f6915SLoGin let ptr = pcb.as_ref() as *const ProcessControlBlock as *mut ProcessControlBlock; 450393f6915SLoGin (*ptr).tgid = current_pcb.tgid; 451393f6915SLoGin } 452393f6915SLoGin } else { 453b5b571e0SLoGin pcb.thread.write_irqsave().group_leader = Arc::downgrade(pcb); 454393f6915SLoGin unsafe { 455393f6915SLoGin let ptr = pcb.as_ref() as *const ProcessControlBlock as *mut ProcessControlBlock; 456393f6915SLoGin (*ptr).tgid = pcb.tgid; 457393f6915SLoGin } 458393f6915SLoGin } 459393f6915SLoGin 460393f6915SLoGin // CLONE_PARENT re-uses the old parent 461393f6915SLoGin if clone_flags.contains(CloneFlags::CLONE_PARENT | CloneFlags::CLONE_THREAD) { 46252bcb59eSGnoCiYeH *pcb.real_parent_pcb.write_irqsave() = 46352bcb59eSGnoCiYeH current_pcb.real_parent_pcb.read_irqsave().clone(); 464393f6915SLoGin 465393f6915SLoGin if clone_flags.contains(CloneFlags::CLONE_THREAD) { 466393f6915SLoGin pcb.exit_signal.store(Signal::INVALID, Ordering::SeqCst); 467393f6915SLoGin } else { 46852bcb59eSGnoCiYeH let leader = current_pcb.thread.read_irqsave().group_leader(); 469393f6915SLoGin if unlikely(leader.is_none()) { 470393f6915SLoGin panic!( 471393f6915SLoGin "fork: Failed to get leader of current process, current pid: [{:?}]", 472393f6915SLoGin current_pcb.pid() 473393f6915SLoGin ); 474393f6915SLoGin } 475393f6915SLoGin 476393f6915SLoGin pcb.exit_signal.store( 477393f6915SLoGin leader.unwrap().exit_signal.load(Ordering::SeqCst), 478393f6915SLoGin Ordering::SeqCst, 479393f6915SLoGin ); 480393f6915SLoGin } 481393f6915SLoGin } else { 482393f6915SLoGin // 新创建的进程,设置其父进程为当前进程 483b5b571e0SLoGin *pcb.real_parent_pcb.write_irqsave() = Arc::downgrade(current_pcb); 484393f6915SLoGin pcb.exit_signal 485393f6915SLoGin .store(clone_args.exit_signal, Ordering::SeqCst); 486393f6915SLoGin } 487393f6915SLoGin 488e7071df6SLoGin // todo: 增加线程组相关的逻辑。 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/kernel/fork.c#2437 489393f6915SLoGin 490f0c87a89SGnoCiYeH sched_cgroup_fork(pcb); 491f0c87a89SGnoCiYeH 492971462beSGnoCiYeH Ok(()) 493971462beSGnoCiYeH } 4941496ba7bSLoGin } 495