Skip to content

Commit

Permalink
feat: add new vfs framework
Browse files Browse the repository at this point in the history
1. remove the simplegui and virtio-input-decoder module.
2. add new vfs framework
  a. impl VfsInode trait for every device
  b. construct file tree
  • Loading branch information
Godones committed Oct 13, 2023
1 parent bb64abe commit e253633
Show file tree
Hide file tree
Showing 73 changed files with 1,405 additions and 2,850 deletions.
1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ members = [
"boot",
"modules/gmanager",
"modules/basemachine",
"modules/virtio-input-decoder",
"modules/input2event",
"modules/simple-net",
"apps/slint-helper",
Expand Down
2 changes: 1 addition & 1 deletion apps/egui/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ edition = "2021"

[dependencies]
Mstd = { path = "../../userlib", features = ["gui"] }
simplegui = { path = "../../modules/simplegui" }
simplegui = { path = "../../../os-modules/simplegui" }
2 changes: 1 addition & 1 deletion apps/printdemo/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright © SixtyFPS GmbH <info@slint.dev>
# Copyright © SixtyFPS GmbH <info@slint.devfs>
# SPDX-License-Identifier: MIT

[package]
Expand Down
2 changes: 1 addition & 1 deletion apps/printdemo/build.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright © SixtyFPS GmbH <info@slint.dev>
// Copyright © SixtyFPS GmbH <info@slint.devfs>
// SPDX-License-Identifier: MIT

fn main() {
Expand Down
2 changes: 1 addition & 1 deletion apps/printdemo/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright © SixtyFPS GmbH <info@slint.dev>
// Copyright © SixtyFPS GmbH <info@slint.devfs>
// SPDX-License-Identifier: MIT

#![no_std]
Expand Down
2 changes: 1 addition & 1 deletion apps/printdemo/ui/fonts/convert.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/bin/bash -e
# Copyright © SixtyFPS GmbH <info@slint.dev>
# Copyright © SixtyFPS GmbH <info@slint.devfs>
# SPDX-License-Identifier: MIT

# This script converts the NotoSans font from https://www.google.com/get/noto/#sans-lgc
Expand Down
2 changes: 1 addition & 1 deletion apps/sysinfo/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ fn main() {
sysinfo.set_swap_used_kb(0);
sysinfo.set_swap_total_kb(0);

// in-out property <[{dev: string, mnt: string, total: int, free: int}]> partitions;
// in-out property <[{devfs: string, mnt: string, total: int, free: int}]> partitions;
let mount = Rc::new(
slint::VecModel::<(SharedString, i32, SharedString, i32)>::from(vec![
(
Expand Down
15 changes: 8 additions & 7 deletions boot/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ use kernel::board;
use kernel::board::init_dtb;
use kernel::config::CPU_NUM;
use kernel::device::init_device;
use kernel::fs::init_filesystem;
use kernel::fs::vfs::init_vfs;
use kernel::interrupt::init_plic;
use kernel::memory::{init_memory_system, kernel_info};
Expand All @@ -52,13 +53,15 @@ static STARTED: AtomicBool = AtomicBool::new(false);
/// cpu启动计数
static CPUS: AtomicUsize = AtomicUsize::new(0);

extern "C" {
fn _start();
fn sbss();
fn ebss();
}

/// 清空.bss段
#[inline]
fn clear_bss() {
extern "C" {
fn sbss();
fn ebss();
}
unsafe {
core::slice::from_raw_parts_mut(sbss as usize as *mut u8, ebss as usize - sbss as usize)
.fill(0);
Expand Down Expand Up @@ -101,6 +104,7 @@ pub fn main(_: usize, _: usize) -> ! {
// init all device
init_device();
trap::init_trap_subsystem();
init_filesystem();
init_vfs();
task::init_process();
CPUS.fetch_add(1, Ordering::Release);
Expand Down Expand Up @@ -136,9 +140,6 @@ fn init_other_hart(hart_id: usize) {
}
}
for i in start_hart..CPU_NUM {
extern "C" {
fn _start();
}
if i != hart_id {
let res = hart_start(i, _start as usize, 0);
assert_eq!(res.error, 0);
Expand Down
83 changes: 83 additions & 0 deletions doc/fs.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# Fs

## filesystem syscall support

Now the os supports the following system calls:

```rust
Expand Down Expand Up @@ -48,3 +51,83 @@ pub fn sys_fremovexattr(fd: usize, name: *const u8) -> isize
```

There are some applications in the `app` directory to test the system calls.



## /dev/shm

Linux中,`/dev/shm` 目录是用来实现共享内存的,它允许多个进程之间共享内存段,以便它们可以相互交换数据而无需通过磁盘进行数据传输。这种共享内存的机制通常比其他进程间通信方法(如管道或套接字)更快,因为数据直接存储在内存中,而不需要进行磁盘 I/O 操作。

`/dev/shm` 是一个特殊的文件系统,通常挂载在内存中,而不是硬盘上。这意味着 `/dev/shm` 中的数据会存储在系统的物理内存中,而不是存储在磁盘上,因此速度更快。

通常,`/dev/shm` 目录被用于创建共享内存段,使不同的进程可以访问这些内存段以进行数据共享。这对于需要高性能数据传输的应用程序很有用,例如数据库管理系统、多线程应用程序、图形处理程序等。



## /dev/misc

Linux系统中,`/dev/misc` 目录通常是一个特殊的设备目录,用于包含一些不属于特定设备类型的杂项设备文件。这些杂项设备文件通常不归类为块设备、字符设备或其他特定设备类型,而是一些不太常见的或不适合分类的设备。

`/dev/misc` 中的设备文件可能包括一些特殊的硬件接口或设备,例如温度传感器、风扇控制器、一些特殊的输入设备等。这些设备通常不符合标准的设备类别,因此它们被放在 `/dev/misc` 目录中以供用户或应用程序使用。

用户和应用程序可以通过访问 `/dev/misc` 中的设备文件来与这些特殊设备进行通信。通常,这些设备文件的权限设置会限制哪些用户或进程可以访问它们,以确保安全性。



## /dev/tty

`/dev/tty` 是一个特殊的设备文件,在UnixUnix-like操作系统(包括Linux)中用于代表终端设备,允许与终端进行输入和输出交互。这个设备文件通常与标准输入(stdin)、标准输出(stdout)和标准错误(stderr)相关联,允许用户和应用程序在终端上进行文本输入和输出。

`/dev/tty` 文件通常是一个符号链接,它指向当前的终端设备文件,这使得在不同终端会话中使用时非常有用,因为它会自动适应当前正在使用的终端。



## /dev/random/dev/urandom

`/dev/urandom` 是一个特殊的设备文件,它在UnixUnix-like操作系统中用于生成伪随机数据。这个设备文件提供了高质量的熵(随机性),可以用于密码学、加密、随机数生成等应用。与 `/dev/random` 相比,`/dev/urandom` 通常更快,因为它会根据需要生成伪随机数据,而不会阻塞等待熵源。

- `/dev/random` 会尝试生成真正的随机数据,但如果系统的熵池(entropy pool)为空,它会阻塞等待更多的随机事件,这可能导致进程在等待期间被挂起。这是因为真正的随机数据需要足够的随机熵来源,而这些来源不一定一直可用。
- `/dev/urandom` 则会生成伪随机数据,使用一个伪随机数生成器(PRNG),它可以在没有足够熵的情况下生成数据,而不会阻塞等待。PRNG的输出通常足够随机以满足大多数应用的需求,但要注意,它的质量依赖于系统的熵池

`/dev/urandom` 和 `/dev/random` 这两个设备文件都是实现了读取(`read`)操作的,但它们通常不支持写入(`write`)操作。这是因为这些设备的主要目的是生成随机数据并提供给应用程序,而不是接受外部数据。

对这两个文件的处理:

- 实现`read`
- `write` is empty



## /var

`/var` 目录在LinuxUnix系统中具有重要的作用,主要用于存储经常变化的数据,包括:

1. **日志文件**:系统和应用程序生成的各种日志文件通常存储在 `/var/log` 中。这些日志文件包括系统日志、安全日志、应用程序日志等,以便系统管理员和开发人员可以查看和分析系统和应用程序的活动。
2. **运行时数据**: `/var/run` 或 `/run` 子目录用于存储正在运行的进程和服务的运行时信息。这包括进程标识号(PID)文件,以便其他进程可以查找并与它们通信。
3. **临时文件**: `/var/tmp` 子目录用于存储临时文件,这些文件不应在系统重启后被清除。相比之下,`/tmp` 目录通常用于存储临时文件,但其内容可以在系统重启时被清除。
4. **软件包数据**: `/var/lib` 子目录通常包含一些软件包管理工具(如APTYum)使用的数据,用于跟踪已安装软件包和它们的状态。
5. **邮件数据**:邮件服务器存储邮件和邮件队列数据在 `/var/mail` 和 `/var/spool/mail` 子目录中。
6. **数据库文件**:某些应用程序和服务(如数据库管理系统)可能使用 `/var` 子目录来存储数据库文件和数据。
7. **缓存数据**:某些应用程序和系统组件可能会使用 `/var` 目录中的子目录来存储缓存数据,以加速对数据的访问。



## /etc

`/etc` 目录在LinuxUnix系统中具有重要的作用,它通常用于存储系统的配置文件和配置数据。这个目录包含了各种应用程序和系统组件的配置文件,用于定义系统的行为和属性。

以下是 `/etc` 目录的一些常见用途:

1. **系统配置**:`/etc` 目录包含了与整个系统操作和配置相关的文件,包括网络设置、主机名、DNS解析、时区、日志配置等。例如,`/etc/hostname` 文件包含系统的主机名。

2. **软件包管理**:大多数Linux发行版使用`/etc`目录来存储软件包管理工具的配置文件,如APT的`/etc/apt`和Yum的`/etc/yum`。这些配置文件包括软件源的信息以及软件包的安装和更新规则。

3. **用户和组配置**:`/etc/passwd` 文件包含系统中用户的帐户信息,包括用户名、用户ID、家目录等。`/etc/group` 文件包含系统中的组信息。

4. **服务配置**:`/etc` 目录中包含了系统和服务的配置文件,如网络服务(`/etc/network`)、SSH服务(`/etc/ssh`)、Web服务器(`/etc/apache2` 或 `etc/nginx`)等。这些配置文件定义了服务的行为和属性。

5. **安全和权限配置**:`/etc` 目录包含一些用于安全性和权限的配置文件,如 `/etc/sudoers`,这是用于sudo权限管理的文件。`/etc/security` 子目录中存储了许多安全策略相关的配置文件。

6. **环境变量和全局脚本**:`/etc/profile` 和 `/etc/environment` 等文件包含全局的环境变量设置,影响所有用户的命令行环境。

总之,`/etc` 目录用于存储系统范围的配置文件,这些文件定义了系统的各种属性、服务和应用程序的行为。这些文件通常由管理员进行编辑和管理,以确保系统按照所需的方式运行。
25 changes: 18 additions & 7 deletions kernel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,28 +21,40 @@ lru = "0.10.0"
core2 = { version = "0.4.0", default-features = false, features = ["alloc"] }
cfg-if = "1.0.0"
page-table = { git = "https://github.com/os-module/page-table.git", branch = "dev" }
#page-table = { path = "../../os-module/page-table" }
rvfs = { git = "https://github.com/Godones/rvfs.git" }
#rvfs = { path = "../../os-module/rvfs" }
fat32-vfs = { git = "https://github.com/Godones/fat32-vfs.git" }
#fat32-vfs = { path = "../../os-module/fat32-vfs" }
visionfive2-sd = { git = "https://github.com/os-module/visionfive2-sd.git", optional = true }
tracer = { git = "https://github.com/os-module/tracer" }
preprint = "0.1.0"
rslab = { version = "0.2.1" }
rslab = { version = "0.2.1" ,optional = true}
syscall-table = { git = "https://github.com/os-module/syscall-table.git" }
plic = { git = "https://github.com/os-module/plic" }
pager = { git = "https://github.com/os-module/pager", default-features = false, optional = true }
gmanager = { path = "../modules/gmanager" }
kernel-sync = { git = "https://github.com/os-module/kernel-sync.git" }
syscall_define = { git = "https://github.com/os-module/pconst.git", package = "pconst" }

#syscall_define = { git = "https://github.com/os-module/pconst.git", package = "pconst" }

syscall_define = { path = "../../os-modules/pconst", package = "pconst" }

basemachine = { path = "../modules/basemachine" }
uart16550 = { version = "0.0.1", optional = true }
uart8250 = { git = "https://github.com/os-module/uart-rs.git", optional = true }
smpscheduler = {git = "https://github.com/os-module/smpscheduler.git" }
talc = { version = "1.0", optional = true }
buddy_system_allocator = { version = "0.9.0", optional = true }

#vfscore = {git = "https://github.com/os-module/rvfs.git"}
#devfs = {git = "https://github.com/os-module/rvfs.git"}
#dynfs = {git = "https://github.com/os-module/rvfs.git"}
#ramfs = {git = "https://github.com/os-module/rvfs.git"}
#fat-vfs = {git = "https://github.com/os-module/rvfs.git"}
vfscore = {path = "../../os-modules/rvfs/vfscore"}
devfs = {path = "../../os-modules/rvfs/devfs"}
dynfs = {path = "../../os-modules/rvfs/dynfs"}
ramfs = {path = "../../os-modules/rvfs/ramfs"}
fat-vfs = {path = "../../os-modules/rvfs/fat-vfs"}

simple-net = { path = "../modules/simple-net" }
[dependencies.smoltcp]
git = "https://github.com/rcore-os/smoltcp.git"
Expand All @@ -57,14 +69,13 @@ features = [

[features]
default = ["pager_bitmap", ]
#default = ["pager_buddy"]
vf2 = ["visionfive2-sd", "uart8250"]
cv1811h = []
hifive = ["uart16550"]
qemu = ["uart16550"]
net_test = []

slab = []
slab = ["rslab"]
talloc = ["talc"]
buddy = ["buddy_system_allocator"]

Expand Down
72 changes: 70 additions & 2 deletions kernel/src/device/block.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,83 @@
use alloc::sync::Arc;

use crate::driver::GenericBlockDevice;
use crate::fs::dev::DeviceId;
use rvfs::superblock::Device;
use spin::Once;
use vfscore::error::VfsError;
use vfscore::file::VfsFile;
use vfscore::inode::{InodeAttr, VfsInode};
use vfscore::superblock::VfsSuperBlock;
use vfscore::utils::{FileStat, PollEvents, VfsNodeType};
use vfscore::VfsResult;

use crate::interrupt::DeviceBase;

pub trait BlockDevice: Device + DeviceBase {}

pub static BLOCK_DEVICE: Once<Arc<dyn Device>> = Once::new();
pub static BLOCK_DEVICE: Once<Arc<GenericBlockDevice>> = Once::new();

pub fn init_block_device(block_device: Arc<dyn Device>) {
pub fn init_block_device(block_device: Arc<GenericBlockDevice>) {
// BLOCK_DEVICE.lock().push(block_device);
BLOCK_DEVICE.call_once(|| block_device);
}

pub struct BLKDevice {
device_id: DeviceId,
device: Arc<GenericBlockDevice>,
}

impl BLKDevice {
pub fn new(device_id: DeviceId, device: Arc<GenericBlockDevice>) -> Self {
Self { device_id, device }
}
pub fn device_id(&self) -> DeviceId {
self.device_id
}
}

impl VfsFile for BLKDevice {
fn read_at(&self, offset: u64, buf: &mut [u8]) -> VfsResult<usize> {
self.device
.read(buf, offset as usize)
.map_err(|_| VfsError::IoError)
}
fn write_at(&self, offset: u64, buf: &[u8]) -> VfsResult<usize> {
self.device
.write(buf, offset as usize)
.map_err(|_| VfsError::IoError)
}
fn poll(&self, _event: PollEvents) -> VfsResult<PollEvents> {
todo!()
}
fn ioctl(&self, _cmd: u32, _arg: u64) -> VfsResult<Option<u64>> {
todo!()
}
fn flush(&self) -> VfsResult<()> {
Ok(())
}
fn fsync(&self) -> VfsResult<()> {
Ok(())
}
}

impl VfsInode for BLKDevice {
fn get_super_block(&self) -> VfsResult<Arc<dyn VfsSuperBlock>> {
Err(VfsError::NoSys)
}

fn set_attr(&self, _attr: InodeAttr) -> VfsResult<()> {
Ok(())
}

fn get_attr(&self) -> VfsResult<FileStat> {
Ok(FileStat {
st_rdev: self.device_id.id(),
..Default::default()
})
}

fn inode_type(&self) -> VfsNodeType {
VfsNodeType::BlockDevice
}
}
Loading

0 comments on commit e253633

Please sign in to comment.