From d7eecdfd0817da9fd20476df2b10325eacce7b63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=81=AB=E8=8A=B1?= Date: Thu, 15 Jan 2026 13:22:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(sysfs):=20sysfs=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=8C=82=E8=BD=BD=20(#1667)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(sysfs): sysfs支持挂载 实现 FileSystem 和 MountableFileSystem trait,使 sysfs 成为可挂载文件系统。 Signed-off-by: sparkzky * feat(qemu): 将虚拟机内存调整至2G,避免OOM Signed-off-by: sparkzky --------- Signed-off-by: sparkzky --- kernel/src/filesystem/sysfs/mod.rs | 53 ++++++++++++++++++++++++++++-- tools/run-qemu.sh | 2 +- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/kernel/src/filesystem/sysfs/mod.rs b/kernel/src/filesystem/sysfs/mod.rs index 4802bdc63..a877bf114 100644 --- a/kernel/src/filesystem/sysfs/mod.rs +++ b/kernel/src/filesystem/sysfs/mod.rs @@ -1,16 +1,16 @@ use core::fmt::Debug; use self::{dir::SysKernDirPriv, file::SysKernFilePriv}; - use super::{ kernfs::{KernFS, KernFSInode}, - vfs::{FileSystem, InodeMode}, + vfs::{FileSystem, FileSystemMakerData, InodeMode, MountableFileSystem, SuperBlock}, }; use crate::{ driver::base::kobject::KObject, - filesystem::vfs::mount::MountFlags, + filesystem::vfs::{mount::MountFlags, FSMAKER}, libs::{casting::DowncastArc, once::Once}, process::ProcessManager, + register_mountable_fs, }; use alloc::sync::Arc; use log::{info, warn}; @@ -231,3 +231,50 @@ impl SysFS { warn!("duplicate sysfs entry: {path}/{name}"); } } + +use linkme::distributed_slice; + +impl FileSystem for SysFS { + fn root_inode(&self) -> Arc { + return self.root_inode.clone(); + } + + fn info(&self) -> super::vfs::FsInfo { + return self.kernfs.info(); + } + + fn as_any_ref(&self) -> &dyn core::any::Any { + self + } + + fn name(&self) -> &str { + "sysfs" + } + + fn super_block(&self) -> SuperBlock { + self.kernfs.super_block() + } +} + +impl MountableFileSystem for SysFS { + /// 创建 sysfs 挂载数据 + /// + /// sysfs 是一个虚拟文件系统,不需要任何挂载数据。 + fn make_mount_data( + _raw_data: Option<&str>, + _source: &str, + ) -> Result>, SystemError> { + // sysfs 不需要任何额外的挂载数据 + Ok(None) + } + + fn make_fs( + _data: Option<&dyn FileSystemMakerData>, + ) -> Result, SystemError> { + let fs = SysFS::new(); + Ok(Arc::new(fs)) + } +} + +// 注册 sysfs 为可挂载文件系统 +register_mountable_fs!(SysFS, SYSFSMAKER, "sysfs"); diff --git a/tools/run-qemu.sh b/tools/run-qemu.sh index fbe5e3b3e..b55478f73 100755 --- a/tools/run-qemu.sh +++ b/tools/run-qemu.sh @@ -98,7 +98,7 @@ QEMU=$(which qemu-system-${ARCH}) QEMU_DISK_IMAGE="../bin/${DISK_NAME}" QEMU_EXT4_DISK_IMAGE="../bin/${EXT4_DISK_NAME}" QEMU_FAT_DISK_IMAGE="../bin/${FAT_DISK_NAME}" -QEMU_MEMORY="1024M" +QEMU_MEMORY="2G" # 检查必要的环境变量 if [ -z "${ROOT_PATH}" ]; then