diff --git a/kernel/src/filesystem/procfs/pid/cmdline.rs b/kernel/src/filesystem/procfs/pid/cmdline.rs index bc3957a891..ec78d2aef4 100644 --- a/kernel/src/filesystem/procfs/pid/cmdline.rs +++ b/kernel/src/filesystem/procfs/pid/cmdline.rs @@ -6,12 +6,13 @@ use crate::libs::mutex::MutexGuard; use crate::{ filesystem::{ procfs::{ + pid::find_process_by_vpid, template::{Builder, FileOps, ProcFileBuilder}, utils::proc_read, }, vfs::{FilePrivateData, IndexNode, InodeMode}, }, - process::{ProcessManager, RawPid}, + process::RawPid, }; use alloc::sync::{Arc, Weak}; use system_error::SystemError; @@ -40,7 +41,7 @@ impl FileOps for CmdlineFileOps { _data: MutexGuard, ) -> Result { // 查找进程 - let pcb = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; // 获取 cmdline 字节 let cmdline_bytes = pcb.cmdline_bytes(); diff --git a/kernel/src/filesystem/procfs/pid/exe.rs b/kernel/src/filesystem/procfs/pid/exe.rs index a79de94162..d423fecc06 100644 --- a/kernel/src/filesystem/procfs/pid/exe.rs +++ b/kernel/src/filesystem/procfs/pid/exe.rs @@ -4,10 +4,13 @@ use crate::{ filesystem::{ - procfs::template::{Builder, ProcSymBuilder, SymOps}, + procfs::{ + pid::find_process_by_vpid, + template::{Builder, ProcSymBuilder, SymOps}, + }, vfs::{IndexNode, InodeMode}, }, - process::{ProcessManager, RawPid}, + process::RawPid, }; use alloc::sync::{Arc, Weak}; use system_error::SystemError; @@ -35,7 +38,7 @@ impl ExeSymOps { impl SymOps for ExeSymOps { fn read_link(&self, buf: &mut [u8]) -> Result { // 动态查找进程,获取目标进程的可执行文件路径 - let pcb = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; let exe = pcb.execute_path(); let exe_bytes = exe.as_bytes(); let len = exe_bytes.len().min(buf.len()); diff --git a/kernel/src/filesystem/procfs/pid/fd.rs b/kernel/src/filesystem/procfs/pid/fd.rs index cd79fc033a..f3cecd78cf 100644 --- a/kernel/src/filesystem/procfs/pid/fd.rs +++ b/kernel/src/filesystem/procfs/pid/fd.rs @@ -4,10 +4,13 @@ use crate::{ filesystem::{ - procfs::template::{Builder, DirOps, ProcDir, ProcDirBuilder, ProcSymBuilder, SymOps}, + procfs::{ + pid::find_process_by_vpid, + template::{Builder, DirOps, ProcDir, ProcDirBuilder, ProcSymBuilder, SymOps}, + }, vfs::{IndexNode, InodeMode, SpecialNodeData}, }, - process::{ProcessControlBlock, ProcessManager, RawPid}, + process::RawPid, }; use alloc::{ format, @@ -25,11 +28,7 @@ pub struct FdDirOps { } impl FdDirOps { - pub fn new_inode( - process_ref: Arc, - parent: Weak, - ) -> Arc { - let pid = process_ref.raw_pid(); + pub fn new_inode(pid: RawPid, parent: Weak) -> Arc { ProcDirBuilder::new(Self { pid }, InodeMode::from_bits_truncate(0o500)) // dr-x------ .parent(parent) .volatile() // fd 是易失的,因为它们与特定进程关联 @@ -38,8 +37,8 @@ impl FdDirOps { } /// 获取进程引用 - fn get_process(&self) -> Option> { - ProcessManager::find(self.pid) + fn get_process(&self) -> Option> { + find_process_by_vpid(self.pid) } } @@ -61,6 +60,14 @@ impl DirOps for FdDirOps { let fd_table_guard = fd_table.read(); if fd_table_guard.get_file_by_fd(fd).is_none() { + let open_fds: Vec = + fd_table_guard.iter().map(|(open_fd, _)| open_fd).collect(); + log::warn!( + "procfd lookup miss: pid={} fd={} open_fds={:?}", + self.pid, + fd, + open_fds + ); return Err(SystemError::ENOENT); } } // fd_table_guard在这里被释放 @@ -129,7 +136,7 @@ impl FdSymOps { impl SymOps for FdSymOps { fn read_link(&self, buf: &mut [u8]) -> Result { // 动态查找进程 - let process = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let process = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; // 先获取文件对象的 clone,然后立即释放 fd_table 锁 // 避免在持有锁时调用可能获取其他锁的方法(如 absolute_path) @@ -181,7 +188,7 @@ impl SymOps for FdSymOps { fn special_node(&self) -> Option { // 动态查找进程 - let process = ProcessManager::find(self.pid)?; + let process = find_process_by_vpid(self.pid)?; // 获取文件对象 let file = { diff --git a/kernel/src/filesystem/procfs/pid/fdinfo.rs b/kernel/src/filesystem/procfs/pid/fdinfo.rs index f303f5332b..6a68793afe 100644 --- a/kernel/src/filesystem/procfs/pid/fdinfo.rs +++ b/kernel/src/filesystem/procfs/pid/fdinfo.rs @@ -5,10 +5,13 @@ use crate::libs::mutex::MutexGuard; use crate::{ filesystem::{ - procfs::template::{Builder, DirOps, FileOps, ProcDir, ProcDirBuilder, ProcFileBuilder}, + procfs::{ + pid::find_process_by_vpid, + template::{Builder, DirOps, FileOps, ProcDir, ProcDirBuilder, ProcFileBuilder}, + }, vfs::{FilePrivateData, IndexNode, InodeMode}, }, - process::{ProcessControlBlock, ProcessManager, RawPid}, + process::RawPid, }; use alloc::{ string::ToString, @@ -25,11 +28,7 @@ pub struct FdInfoDirOps { } impl FdInfoDirOps { - pub fn new_inode( - process_ref: Arc, - parent: Weak, - ) -> Arc { - let pid = process_ref.raw_pid(); + pub fn new_inode(pid: RawPid, parent: Weak) -> Arc { ProcDirBuilder::new(Self { pid }, InodeMode::from_bits_truncate(0o555)) .parent(parent) .volatile() @@ -38,8 +37,8 @@ impl FdInfoDirOps { } /// 获取进程引用 - fn get_process(&self) -> Option> { - ProcessManager::find(self.pid) + fn get_process(&self) -> Option> { + find_process_by_vpid(self.pid) } } diff --git a/kernel/src/filesystem/procfs/pid/maps.rs b/kernel/src/filesystem/procfs/pid/maps.rs index 34de53ed7b..2ffa229442 100644 --- a/kernel/src/filesystem/procfs/pid/maps.rs +++ b/kernel/src/filesystem/procfs/pid/maps.rs @@ -7,13 +7,14 @@ use crate::{ arch::MMArch, filesystem::{ procfs::{ + pid::find_process_by_vpid, template::{Builder, FileOps, ProcFileBuilder}, utils::proc_read, }, vfs::{FilePrivateData, IndexNode, InodeMode}, }, mm::{ucontext::LockedVMA, MemoryManagementArch, VmFlags}, - process::{ProcessManager, RawPid}, + process::RawPid, }; use alloc::{ format, @@ -104,7 +105,7 @@ fn format_dev_inode_and_path( /// 生成 /proc/[pid]/maps 内容 fn generate_maps_content(pid: RawPid) -> Result, SystemError> { - let target_pcb = ProcessManager::find(pid).ok_or(SystemError::ESRCH)?; + let target_pcb = find_process_by_vpid(pid).ok_or(SystemError::ESRCH)?; let vm = target_pcb.basic().user_vm().ok_or(SystemError::EINVAL)?; let root_prefix = target_pcb diff --git a/kernel/src/filesystem/procfs/pid/mod.rs b/kernel/src/filesystem/procfs/pid/mod.rs index 1da77b0c42..26d97de75b 100644 --- a/kernel/src/filesystem/procfs/pid/mod.rs +++ b/kernel/src/filesystem/procfs/pid/mod.rs @@ -40,6 +40,10 @@ use statm::StatmFileOps; use status::StatusFileOps; use task::TaskDirOps; +pub(super) fn find_process_by_vpid(pid: RawPid) -> Option> { + ProcessManager::find_task_by_vpid(pid) +} + /// /proc/[pid] 目录的 DirOps 实现 #[derive(Debug)] pub struct PidDirOps { @@ -58,7 +62,7 @@ impl PidDirOps { /// 获取进程引用 fn get_process(&self) -> Option> { - ProcessManager::find(self.pid) + find_process_by_vpid(self.pid) } /// 静态条目表 @@ -94,8 +98,8 @@ impl PidDirOps { ("exe", |ops, parent| ExeSymOps::new_inode(ops.pid, parent)), ("fd", |ops, parent| { // fd 目录仍然需要进程引用来列出文件描述符 - if let Some(process) = ops.get_process() { - FdDirOps::new_inode(process, parent) + if ops.get_process().is_some() { + FdDirOps::new_inode(ops.pid, parent) } else { // 进程已退出,创建空目录 use crate::filesystem::procfs::template::ProcDirBuilder; @@ -124,8 +128,8 @@ impl PidDirOps { }), ("fdinfo", |ops, parent| { // fdinfo 目录也需要进程引用来列出文件描述符 - if let Some(process) = ops.get_process() { - FdInfoDirOps::new_inode(process, parent) + if ops.get_process().is_some() { + FdInfoDirOps::new_inode(ops.pid, parent) } else { // 进程已退出,创建空目录 use crate::filesystem::procfs::template::ProcDirBuilder; @@ -157,7 +161,7 @@ impl PidDirOps { impl DirOps for PidDirOps { fn owner(&self) -> Option<(usize, usize)> { - let pcb = ProcessManager::find(self.pid)?; + let pcb = find_process_by_vpid(self.pid)?; if pcb.is_kthread() { return Some((0, 0)); } diff --git a/kernel/src/filesystem/procfs/pid/ns.rs b/kernel/src/filesystem/procfs/pid/ns.rs index 017011b825..ef2e44627a 100644 --- a/kernel/src/filesystem/procfs/pid/ns.rs +++ b/kernel/src/filesystem/procfs/pid/ns.rs @@ -6,6 +6,7 @@ use crate::libs::mutex::MutexGuard; use crate::{ filesystem::{ procfs::{ + pid::find_process_by_vpid, template::{Builder, DirOps, ProcDir, ProcDirBuilder, ProcSymBuilder, SymOps}, thread_self::NsFileType, }, @@ -16,7 +17,7 @@ use crate::{ }, process::{ namespace::{nsproxy::NamespaceId, NamespaceOps}, - ProcessManager, RawPid, + RawPid, }, }; use alloc::{ @@ -29,7 +30,7 @@ use system_error::SystemError; /// 获取指定进程的命名空间 ID fn get_pid_ns_ino(pid: RawPid, ns_type: NsFileType) -> Result { - let pcb = ProcessManager::find(pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(pid).ok_or(SystemError::ESRCH)?; let nsproxy = pcb.nsproxy(); let ino: NamespaceId = match ns_type { @@ -76,7 +77,7 @@ impl DirOps for NsDirOps { let ns_type = NsFileType::try_from(name)?; // 检查进程是否存在 - if ProcessManager::find(self.pid).is_none() { + if find_process_by_vpid(self.pid).is_none() { return Err(SystemError::ESRCH); } @@ -93,7 +94,7 @@ impl DirOps for NsDirOps { fn populate_children(&self, dir: &ProcDir) { // 检查进程是否存在 - if ProcessManager::find(self.pid).is_none() { + if find_process_by_vpid(self.pid).is_none() { return; } @@ -154,7 +155,7 @@ impl SymOps for NsSymOps { fn open(&self, data: &mut MutexGuard) -> Result<(), SystemError> { // 当打开命名空间文件时,设置命名空间私有数据 // 这使得 setns() 可以使用这个 fd - let pcb = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; let nsproxy = pcb.nsproxy(); let ns_data = match self.ns_type { diff --git a/kernel/src/filesystem/procfs/pid/stat.rs b/kernel/src/filesystem/procfs/pid/stat.rs index b58b50da51..c4f3fb79c1 100644 --- a/kernel/src/filesystem/procfs/pid/stat.rs +++ b/kernel/src/filesystem/procfs/pid/stat.rs @@ -9,13 +9,14 @@ use crate::{ arch::MMArch, filesystem::{ procfs::{ + pid::find_process_by_vpid, template::{Builder, FileOps, ProcFileBuilder}, utils::proc_read, }, vfs::{FilePrivateData, IndexNode, InodeMode}, }, mm::MemoryManagementArch, - process::{pid::PidType, ProcessControlBlock, ProcessManager, ProcessState, RawPid}, + process::{pid::PidType, ProcessControlBlock, ProcessState, RawPid}, sched::{cputime::ns_to_clock_t, prio::PrioUtil}, }; use alloc::{ @@ -149,7 +150,7 @@ impl FileOps for StatFileOps { buf: &mut [u8], _data: MutexGuard, ) -> Result { - let pcb = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; let comm = pcb.basic().name().to_string(); let sched = pcb.sched_info(); diff --git a/kernel/src/filesystem/procfs/pid/statm.rs b/kernel/src/filesystem/procfs/pid/statm.rs index 10d0796eca..c7dd15198f 100644 --- a/kernel/src/filesystem/procfs/pid/statm.rs +++ b/kernel/src/filesystem/procfs/pid/statm.rs @@ -7,13 +7,14 @@ use crate::{ arch::MMArch, filesystem::{ procfs::{ + pid::find_process_by_vpid, template::{Builder, FileOps, ProcFileBuilder}, utils::proc_read, }, vfs::{FilePrivateData, IndexNode, InodeMode}, }, mm::MemoryManagementArch, - process::{ProcessManager, RawPid}, + process::RawPid, }; use alloc::{ format, @@ -45,7 +46,7 @@ impl FileOps for StatmFileOps { _data: MutexGuard, ) -> Result { // 查找进程 - let pcb = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; // 获取进程内存信息(简化实现) let size_pages = pcb diff --git a/kernel/src/filesystem/procfs/pid/status.rs b/kernel/src/filesystem/procfs/pid/status.rs index 6e64e2da79..b80548e0e3 100644 --- a/kernel/src/filesystem/procfs/pid/status.rs +++ b/kernel/src/filesystem/procfs/pid/status.rs @@ -6,12 +6,13 @@ use crate::libs::mutex::MutexGuard; use crate::{ filesystem::{ procfs::{ + pid::find_process_by_vpid, template::{Builder, FileOps, ProcFileBuilder}, utils::{proc_read, trim_string}, }, vfs::{FilePrivateData, IndexNode, InodeMode}, }, - process::{ProcessManager, RawPid}, + process::RawPid, }; use alloc::{ borrow::ToOwned, @@ -44,7 +45,7 @@ impl StatusFileOps { /// 生成 status 文件内容 fn generate_status_content(&self) -> Result, SystemError> { // 动态查找进程,确保获取最新状态 - let pcb = ProcessManager::find(self.pid).ok_or(SystemError::ESRCH)?; + let pcb = find_process_by_vpid(self.pid).ok_or(SystemError::ESRCH)?; let mut pdata = Vec::new(); // Name diff --git a/kernel/src/filesystem/procfs/pid/task.rs b/kernel/src/filesystem/procfs/pid/task.rs index 8643d65409..069f01cb89 100644 --- a/kernel/src/filesystem/procfs/pid/task.rs +++ b/kernel/src/filesystem/procfs/pid/task.rs @@ -5,7 +5,7 @@ use crate::{ filesystem::{ procfs::{ - pid::stat::StatFileOps, + pid::{find_process_by_vpid, stat::StatFileOps}, template::{ lookup_child_from_table, populate_children_from_table, DirOps, ProcDir, ProcDirBuilder, @@ -14,7 +14,7 @@ use crate::{ }, vfs::{IndexNode, InodeMode}, }, - process::{ProcessManager, RawPid}, + process::RawPid, }; use alloc::{ string::ToString, @@ -55,7 +55,7 @@ impl DirOps for TaskDirOps { } // 检查进程是否存在 - if ProcessManager::find(self.pid).is_none() { + if find_process_by_vpid(self.pid).is_none() { return Err(SystemError::ESRCH); } @@ -72,7 +72,7 @@ impl DirOps for TaskDirOps { fn populate_children(&self, dir: &ProcDir) { // 检查进程是否存在 - if ProcessManager::find(self.pid).is_none() { + if find_process_by_vpid(self.pid).is_none() { return; } diff --git a/kernel/src/filesystem/procfs/root.rs b/kernel/src/filesystem/procfs/root.rs index 95ee404bd4..d32c6beef9 100644 --- a/kernel/src/filesystem/procfs/root.rs +++ b/kernel/src/filesystem/procfs/root.rs @@ -28,7 +28,7 @@ use crate::{ }, vfs::{FileSystemMakerData, IndexNode, InodeMode, FSMAKER}, }, - process::{ProcessManager, RawPid}, + process::{pid::PidType, ProcessManager, RawPid}, register_mountable_fs, }; use alloc::{ @@ -86,7 +86,7 @@ impl DirOps for RootDirOps { // 首先检查是否是 PID 目录 if let Ok(pid) = name.parse::() { // 检查进程是否存在 - if ProcessManager::find(pid).is_some() { + if ProcessManager::find_task_by_vpid(pid).is_some() { let mut cached_children = dir.cached_children().write(); // 检查缓存中是否已存在 @@ -118,16 +118,14 @@ impl DirOps for RootDirOps { } fn populate_children(&self, dir: &ProcDir) { - // 先收集进程 PID,然后立即释放进程表锁 - let pid_list = { - let all_processes = crate::process::all_process().lock_irqsave(); - if let Some(process_map) = all_processes.as_ref() { - process_map.keys().cloned().collect::>() - } else { - Vec::new() - } - }; - // 进程表锁已经释放 + let active_pid_ns = ProcessManager::current_pcb().active_pid_ns(); + let pid_list = active_pid_ns + .collect_pids() + .into_iter() + .filter(|pid| pid.pid_task(PidType::PID).is_some()) + .map(|pid| pid.pid_nr_ns(&active_pid_ns)) + .filter(|pid| pid.data() != 0) + .collect::>(); // 获取缓存写锁并填充 let mut cached_children = dir.cached_children().write();