From e7add27923d85946dca4cf054492daf36bb2e054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=AB=E8=8A=B1?= Date: Wed, 14 Jan 2026 23:56:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(procfs):=20procfs=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8C=82=E8=BD=BD=20(#1639)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: procfs支持挂载 Signed-off-by: sparkzky * fix: 增加错误处理 Signed-off-by: sparkzky --------- Signed-off-by: sparkzky --- kernel/src/filesystem/procfs/root.rs | 34 +++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/kernel/src/filesystem/procfs/root.rs b/kernel/src/filesystem/procfs/root.rs index ac2a566c8..f41e9126d 100644 --- a/kernel/src/filesystem/procfs/root.rs +++ b/kernel/src/filesystem/procfs/root.rs @@ -24,9 +24,10 @@ use crate::{ version_signature::VersionSignatureFileOps, Builder, PROCFS_BLOCK_SIZE, PROCFS_MAX_NAMELEN, }, - vfs::{IndexNode, InodeMode}, + vfs::{FileSystemMakerData, IndexNode, InodeMode, FSMAKER}, }, process::{ProcessManager, RawPid}, + register_mountable_fs, }; use alloc::{ string::ToString, @@ -47,7 +48,7 @@ impl RootDirOps { ProcDirBuilder::new(Self, InodeMode::from_bits_truncate(0o555)) .fs(fs) .build() - .unwrap() + .expect("Failed to create RootDirOps") } /// 静态条目表 @@ -142,8 +143,9 @@ impl DirOps for RootDirOps { } } -use crate::filesystem::vfs::{FileSystem, FsInfo, Magic, SuperBlock}; +use crate::filesystem::vfs::{FileSystem, FsInfo, Magic, MountableFileSystem, SuperBlock}; use crate::libs::rwsem::RwSem; +use linkme::distributed_slice; /// ProcFS 文件系统 #[derive(Debug)] @@ -194,3 +196,29 @@ impl FileSystem for ProcFS { self.super_block.read().clone() } } + +impl MountableFileSystem for ProcFS { + /// 创建 procfs 挂载数据 + /// + /// procfs 是一个虚拟文件系统,不需要任何挂载数据。 + /// 与需要挂载选项的文件系统(如带有大小限制的 tmpfs)不同, + /// procfs 的行为完全由内核状态决定,不需要额外的配置参数。 + fn make_mount_data( + _raw_data: Option<&str>, + _source: &str, + ) -> Result>, SystemError> + { + // procfs 不需要任何额外的挂载数据 + Ok(None) + } + + fn make_fs( + _data: Option<&dyn crate::filesystem::vfs::FileSystemMakerData>, + ) -> Result, SystemError> { + let fs = ProcFS::new(); + Ok(fs) + } +} + +// 注册 procfs 为可挂载文件系统 +register_mountable_fs!(ProcFS, PROCFSMAKER, "proc");