From 8db6a55696fd2cd38d966f9afcac09ed76b5fc8f Mon Sep 17 00:00:00 2001 From: LI Qing Date: Wed, 31 Mar 2021 17:15:28 +0800 Subject: [PATCH] Mount ramfs at '/dev/shm' --- deps/sefs | 2 +- src/libos/src/fs/dev_fs/dev_shm.rs | 41 ++++++++++++++++++++++++++++++ src/libos/src/fs/dev_fs/mod.rs | 16 ++++++++++-- src/libos/src/fs/rootfs.rs | 2 +- test/device/main.c | 31 +++++++++++++++++++++- 5 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 src/libos/src/fs/dev_fs/dev_shm.rs diff --git a/deps/sefs b/deps/sefs index bb574e0c..6bf6fc26 160000 --- a/deps/sefs +++ b/deps/sefs @@ -1 +1 @@ -Subproject commit bb574e0c0bb0a3034f1f4eb48b1d559fe84d2555 +Subproject commit 6bf6fc267b9712a60477727506ed96a37e5f21b2 diff --git a/src/libos/src/fs/dev_fs/dev_shm.rs b/src/libos/src/fs/dev_fs/dev_shm.rs new file mode 100644 index 00000000..8cfcd871 --- /dev/null +++ b/src/libos/src/fs/dev_fs/dev_shm.rs @@ -0,0 +1,41 @@ +use super::*; + +#[derive(Debug)] +pub struct DevShm; + +impl INode for DevShm { + fn read_at(&self, offset: usize, buf: &mut [u8]) -> vfs::Result { + Err(vfs::FsError::NotFile) + } + + fn write_at(&self, offset: usize, buf: &[u8]) -> vfs::Result { + Err(vfs::FsError::NotFile) + } + + fn poll(&self) -> vfs::Result { + Err(vfs::FsError::NotFile) + } + + fn metadata(&self) -> vfs::Result { + Ok(Metadata { + dev: 0, + inode: 2, + size: 0, + blk_size: 0, + blocks: 0, + atime: Timespec { sec: 0, nsec: 0 }, + mtime: Timespec { sec: 0, nsec: 0 }, + ctime: Timespec { sec: 0, nsec: 0 }, + type_: vfs::FileType::Dir, + mode: 0o777, + nlinks: 1, + uid: 0, + gid: 0, + rdev: 0, + }) + } + + fn as_any_ref(&self) -> &dyn Any { + self + } +} diff --git a/src/libos/src/fs/dev_fs/mod.rs b/src/libos/src/fs/dev_fs/mod.rs index a25e07e5..f395ee81 100644 --- a/src/libos/src/fs/dev_fs/mod.rs +++ b/src/libos/src/fs/dev_fs/mod.rs @@ -1,19 +1,25 @@ +use super::rootfs::mount_fs_at; use super::*; + use rcore_fs::vfs; use rcore_fs_devfs::DevFS; +use rcore_fs_mountfs::MountFS; +use rcore_fs_ramfs::RamFS; use self::dev_null::DevNull; use self::dev_random::DevRandom; use self::dev_sgx::DevSgx; +use self::dev_shm::DevShm; use self::dev_zero::DevZero; mod dev_null; mod dev_random; mod dev_sgx; +mod dev_shm; mod dev_zero; /// API to initialize the DevFS -pub fn init_devfs() -> Result> { +pub fn init_devfs() -> Result> { let devfs = DevFS::new(); let dev_null = Arc::new(DevNull) as _; devfs.add("null", dev_null)?; @@ -25,6 +31,12 @@ pub fn init_devfs() -> Result> { devfs.add("arandom", Arc::clone(&dev_random))?; let dev_sgx = Arc::new(DevSgx) as _; devfs.add("sgx", dev_sgx)?; + let dev_shm = Arc::new(DevShm) as _; + devfs.add("shm", dev_shm)?; + let mountable_devfs = MountFS::new(devfs); + // Mount the ramfs at '/shm' + let ramfs = RamFS::new(); + mount_fs_at(ramfs, &mountable_devfs.root_inode(), &Path::new("/shm"))?; // TODO: Add stdio(stdin, stdout, stderr) into DevFS - Ok(devfs) + Ok(mountable_devfs) } diff --git a/src/libos/src/fs/rootfs.rs b/src/libos/src/fs/rootfs.rs index e10159b0..0231d364 100644 --- a/src/libos/src/fs/rootfs.rs +++ b/src/libos/src/fs/rootfs.rs @@ -123,7 +123,7 @@ pub fn mount_nonroot_fs_according_to( Ok(()) } -fn mount_fs_at(fs: Arc, parent_inode: &MNode, abs_path: &Path) -> Result<()> { +pub fn mount_fs_at(fs: Arc, parent_inode: &MNode, abs_path: &Path) -> Result<()> { let mut mount_dir = parent_inode.find(false, ".")?; // The first component of abs_path is the RootDir, skip it. for dirname in abs_path.iter().skip(1) { diff --git a/test/device/main.c b/test/device/main.c index 0bfaf162..d3c87b1a 100644 --- a/test/device/main.c +++ b/test/device/main.c @@ -4,7 +4,7 @@ #include #include #include -#include "test.h" +#include "test_fs.h" // ============================================================================ // Test utilities @@ -115,6 +115,34 @@ int test_dev_arandom() { return 0; } +int test_dev_shm() { + struct stat stat_buf; + if (stat("/dev/shm", &stat_buf) < 0) { + THROW_ERROR("failed to stat /dev/shm"); + } + if (!S_ISDIR(stat_buf.st_mode)) { + THROW_ERROR("failed to check if it is dir"); + } + + char *write_str = "Hello World\n"; + char *file_path = "/dev/shm/test_read_write.txt"; + int fd = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, 00666); + if (fd < 0) { + THROW_ERROR("failed to open a file to write"); + } + if (write(fd, write_str, strlen(write_str)) <= 0) { + THROW_ERROR("failed to write"); + } + close(fd); + if (fs_check_file_content(file_path, write_str) < 0) { + THROW_ERROR("failed to check file content"); + } + if (unlink(file_path) < 0) { + THROW_ERROR("failed to unlink the file"); + } + return 0; +} + // ============================================================================ // Test suite // ============================================================================ @@ -127,6 +155,7 @@ static test_case_t test_cases[] = { TEST_CASE(test_dev_urandom_fstat), TEST_CASE(test_dev_urandom_poll), TEST_CASE(test_dev_arandom), + TEST_CASE(test_dev_shm), }; int main() {