Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions kernel/src/filesystem/procfs/pid/cmdline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -40,7 +41,7 @@ impl FileOps for CmdlineFileOps {
_data: MutexGuard<FilePrivateData>,
) -> Result<usize, SystemError> {
// 查找进程
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();
Expand Down
9 changes: 6 additions & 3 deletions kernel/src/filesystem/procfs/pid/exe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -35,7 +38,7 @@ impl ExeSymOps {
impl SymOps for ExeSymOps {
fn read_link(&self, buf: &mut [u8]) -> Result<usize, SystemError> {
// 动态查找进程,获取目标进程的可执行文件路径
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());
Expand Down
29 changes: 18 additions & 11 deletions kernel/src/filesystem/procfs/pid/fd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -25,11 +28,7 @@ pub struct FdDirOps {
}

impl FdDirOps {
pub fn new_inode(
process_ref: Arc<ProcessControlBlock>,
parent: Weak<dyn IndexNode>,
) -> Arc<dyn IndexNode> {
let pid = process_ref.raw_pid();
pub fn new_inode(pid: RawPid, parent: Weak<dyn IndexNode>) -> Arc<dyn IndexNode> {
ProcDirBuilder::new(Self { pid }, InodeMode::from_bits_truncate(0o500)) // dr-x------
.parent(parent)
.volatile() // fd 是易失的,因为它们与特定进程关联
Expand All @@ -38,8 +37,8 @@ impl FdDirOps {
}

/// 获取进程引用
fn get_process(&self) -> Option<Arc<ProcessControlBlock>> {
ProcessManager::find(self.pid)
fn get_process(&self) -> Option<Arc<crate::process::ProcessControlBlock>> {
find_process_by_vpid(self.pid)
}
}

Expand All @@ -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<i32> =
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在这里被释放
Expand Down Expand Up @@ -129,7 +136,7 @@ impl FdSymOps {
impl SymOps for FdSymOps {
fn read_link(&self, buf: &mut [u8]) -> Result<usize, SystemError> {
// 动态查找进程
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)
Expand Down Expand Up @@ -181,7 +188,7 @@ impl SymOps for FdSymOps {

fn special_node(&self) -> Option<SpecialNodeData> {
// 动态查找进程
let process = ProcessManager::find(self.pid)?;
let process = find_process_by_vpid(self.pid)?;

// 获取文件对象
let file = {
Expand Down
17 changes: 8 additions & 9 deletions kernel/src/filesystem/procfs/pid/fdinfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -25,11 +28,7 @@ pub struct FdInfoDirOps {
}

impl FdInfoDirOps {
pub fn new_inode(
process_ref: Arc<ProcessControlBlock>,
parent: Weak<dyn IndexNode>,
) -> Arc<dyn IndexNode> {
let pid = process_ref.raw_pid();
pub fn new_inode(pid: RawPid, parent: Weak<dyn IndexNode>) -> Arc<dyn IndexNode> {
ProcDirBuilder::new(Self { pid }, InodeMode::from_bits_truncate(0o555))
.parent(parent)
.volatile()
Expand All @@ -38,8 +37,8 @@ impl FdInfoDirOps {
}

/// 获取进程引用
fn get_process(&self) -> Option<Arc<ProcessControlBlock>> {
ProcessManager::find(self.pid)
fn get_process(&self) -> Option<Arc<crate::process::ProcessControlBlock>> {
find_process_by_vpid(self.pid)
}
}

Expand Down
5 changes: 3 additions & 2 deletions kernel/src/filesystem/procfs/pid/maps.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -104,7 +105,7 @@ fn format_dev_inode_and_path(

/// 生成 /proc/[pid]/maps 内容
fn generate_maps_content(pid: RawPid) -> Result<Vec<u8>, 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
Expand Down
16 changes: 10 additions & 6 deletions kernel/src/filesystem/procfs/pid/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ use statm::StatmFileOps;
use status::StatusFileOps;
use task::TaskDirOps;

pub(super) fn find_process_by_vpid(pid: RawPid) -> Option<Arc<ProcessControlBlock>> {
ProcessManager::find_task_by_vpid(pid)
}

/// /proc/[pid] 目录的 DirOps 实现
#[derive(Debug)]
pub struct PidDirOps {
Expand All @@ -58,7 +62,7 @@ impl PidDirOps {

/// 获取进程引用
fn get_process(&self) -> Option<Arc<ProcessControlBlock>> {
ProcessManager::find(self.pid)
find_process_by_vpid(self.pid)
}

/// 静态条目表
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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));
}
Expand Down
11 changes: 6 additions & 5 deletions kernel/src/filesystem/procfs/pid/ns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
},
Expand All @@ -16,7 +17,7 @@ use crate::{
},
process::{
namespace::{nsproxy::NamespaceId, NamespaceOps},
ProcessManager, RawPid,
RawPid,
},
};
use alloc::{
Expand All @@ -29,7 +30,7 @@ use system_error::SystemError;

/// 获取指定进程的命名空间 ID
fn get_pid_ns_ino(pid: RawPid, ns_type: NsFileType) -> Result<usize, SystemError> {
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 {
Expand Down Expand Up @@ -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);
}

Expand All @@ -93,7 +94,7 @@ impl DirOps for NsDirOps {

fn populate_children(&self, dir: &ProcDir<Self>) {
// 检查进程是否存在
if ProcessManager::find(self.pid).is_none() {
if find_process_by_vpid(self.pid).is_none() {
return;
}

Expand Down Expand Up @@ -154,7 +155,7 @@ impl SymOps for NsSymOps {
fn open(&self, data: &mut MutexGuard<FilePrivateData>) -> 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 {
Expand Down
5 changes: 3 additions & 2 deletions kernel/src/filesystem/procfs/pid/stat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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::{
Expand Down Expand Up @@ -149,7 +150,7 @@ impl FileOps for StatFileOps {
buf: &mut [u8],
_data: MutexGuard<FilePrivateData>,
) -> Result<usize, SystemError> {
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();
Expand Down
5 changes: 3 additions & 2 deletions kernel/src/filesystem/procfs/pid/statm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -45,7 +46,7 @@ impl FileOps for StatmFileOps {
_data: MutexGuard<FilePrivateData>,
) -> Result<usize, SystemError> {
// 查找进程
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
Expand Down
5 changes: 3 additions & 2 deletions kernel/src/filesystem/procfs/pid/status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -44,7 +45,7 @@ impl StatusFileOps {
/// 生成 status 文件内容
fn generate_status_content(&self) -> Result<Vec<u8>, 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
Expand Down
Loading
Loading