From da1759ee20bbd54dfdfd13580e08ccf7228ea494 Mon Sep 17 00:00:00 2001 From: LoGin Date: Thu, 29 Jan 2026 13:28:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(procfs):=20=E5=A2=9E=E5=BC=BAprocfs?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=B3=BB=E7=BB=9F=E5=8A=9F=E8=83=BD=20(#1713?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(procfs): 增强procfs文件系统功能 - 在meminfo文件中添加SwapTotal和SwapFree字段 - 为/proc/目录实现动态owner方法,支持实时UID/GID查询 - 在pid/stat文件中改进tty_nr字段的获取逻辑 - 在procfs模板中为DirOps、FileOps和SymOps添加owner方法支持 Signed-off-by: longjin --- kernel/src/filesystem/procfs/meminfo.rs | 2 ++ kernel/src/filesystem/procfs/pid/mod.rs | 9 +++++++++ kernel/src/filesystem/procfs/pid/stat.rs | 6 +++++- kernel/src/filesystem/procfs/template/dir.rs | 15 ++++++++++++++- kernel/src/filesystem/procfs/template/file.rs | 15 ++++++++++++++- kernel/src/filesystem/procfs/template/sym.rs | 10 ++++++++++ 6 files changed, 54 insertions(+), 3 deletions(-) diff --git a/kernel/src/filesystem/procfs/meminfo.rs b/kernel/src/filesystem/procfs/meminfo.rs index 003f0397f..224457456 100644 --- a/kernel/src/filesystem/procfs/meminfo.rs +++ b/kernel/src/filesystem/procfs/meminfo.rs @@ -64,6 +64,8 @@ impl MeminfoFileOps { .as_bytes() .to_owned(), ); + data.append(&mut format!("SwapTotal:\t{} kB\n", 0u64).as_bytes().to_owned()); + data.append(&mut format!("SwapFree:\t{} kB\n", 0u64).as_bytes().to_owned()); data.append( &mut format!("Dirty:\t\t{} kB\n", stats.file_dirty * page_kb) .as_bytes() diff --git a/kernel/src/filesystem/procfs/pid/mod.rs b/kernel/src/filesystem/procfs/pid/mod.rs index e4034e5c3..1da77b0c4 100644 --- a/kernel/src/filesystem/procfs/pid/mod.rs +++ b/kernel/src/filesystem/procfs/pid/mod.rs @@ -156,6 +156,15 @@ impl PidDirOps { } impl DirOps for PidDirOps { + fn owner(&self) -> Option<(usize, usize)> { + let pcb = ProcessManager::find(self.pid)?; + if pcb.is_kthread() { + return Some((0, 0)); + } + let cred = pcb.cred(); + Some((cred.euid.data(), cred.egid.data())) + } + fn lookup_child( &self, dir: &ProcDir, diff --git a/kernel/src/filesystem/procfs/pid/stat.rs b/kernel/src/filesystem/procfs/pid/stat.rs index 8ab4388db..b58b50da5 100644 --- a/kernel/src/filesystem/procfs/pid/stat.rs +++ b/kernel/src/filesystem/procfs/pid/stat.rs @@ -77,7 +77,11 @@ fn generate_linux_proc_stat_line( // 尽量填真实值;拿不到的先填 0 let pgrp: usize = 0; let session: usize = 0; - let tty_nr: i32 = 0; + let tty_nr: i32 = pcb + .sig_info_irqsave() + .tty() + .map(|tty| tty.core().device_number().new_encode_dev() as i32) + .unwrap_or(0); let tpgid: i32 = 0; let flags: u64 = 0; let minflt: u64 = 0; diff --git a/kernel/src/filesystem/procfs/template/dir.rs b/kernel/src/filesystem/procfs/template/dir.rs index 5abd1d978..07b4c0617 100644 --- a/kernel/src/filesystem/procfs/template/dir.rs +++ b/kernel/src/filesystem/procfs/template/dir.rs @@ -94,9 +94,17 @@ impl ProcDir { impl IndexNode for ProcDir { fn fs(&self) -> Arc; fn as_any_ref(&self) -> &dyn core::any::Any; - fn metadata(&self) -> Result; fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError>; + fn metadata(&self) -> Result { + let mut metadata = self.common.metadata()?; + if let Some((uid, gid)) = self.inner.owner() { + metadata.uid = uid; + metadata.gid = gid; + } + Ok(metadata) + } + fn read_at( &self, _offset: usize, @@ -241,6 +249,11 @@ pub trait DirOps: Sync + Send + Sized + Debug { fn validate_child(&self, _child: &dyn IndexNode) -> bool { true } + + /// 返回动态 owner(用于 /proc/ 等需要实时 UID/GID 的场景) + fn owner(&self) -> Option<(usize, usize)> { + None + } } pub fn lookup_child_from_table( diff --git a/kernel/src/filesystem/procfs/template/file.rs b/kernel/src/filesystem/procfs/template/file.rs index ea21452aa..774e41f33 100644 --- a/kernel/src/filesystem/procfs/template/file.rs +++ b/kernel/src/filesystem/procfs/template/file.rs @@ -105,6 +105,11 @@ pub trait FileOps: Sync + Send + Sized + Debug { ) -> Result { Err(SystemError::EPERM) } + + /// 返回动态 owner(用于 /proc/ 等需要实时 UID/GID 的场景) + fn owner(&self) -> Option<(usize, usize)> { + None + } } /// 为 ProcFile 实现 IndexNode trait @@ -113,9 +118,17 @@ pub trait FileOps: Sync + Send + Sized + Debug { impl IndexNode for ProcFile { fn fs(&self) -> Arc; fn as_any_ref(&self) -> &dyn core::any::Any; - fn metadata(&self) -> Result; fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError>; + fn metadata(&self) -> Result { + let mut metadata = self.common.metadata()?; + if let Some((uid, gid)) = self.inner.owner() { + metadata.uid = uid; + metadata.gid = gid; + } + Ok(metadata) + } + fn read_at( &self, offset: usize, diff --git a/kernel/src/filesystem/procfs/template/sym.rs b/kernel/src/filesystem/procfs/template/sym.rs index 32e0ec718..f1911f665 100644 --- a/kernel/src/filesystem/procfs/template/sym.rs +++ b/kernel/src/filesystem/procfs/template/sym.rs @@ -118,6 +118,11 @@ pub trait SymOps: Sync + Send + Sized + Debug { fn dynamic_inode_id(&self) -> Option { None } + + /// 返回动态 owner(用于 /proc/ 等需要实时 UID/GID 的场景) + fn owner(&self) -> Option<(usize, usize)> { + None + } } /// 为 ProcSym 实现 IndexNode trait @@ -131,6 +136,11 @@ impl IndexNode for ProcSym { fn metadata(&self) -> Result { let mut metadata = self.common.metadata()?; + if let Some((uid, gid)) = self.inner.owner() { + metadata.uid = uid; + metadata.gid = gid; + } + // 如果 inner 提供了动态 inode ID(如命名空间文件),使用它 if let Some(dynamic_id) = self.inner.dynamic_inode_id() { metadata.inode_id = dynamic_id;