【本文尚未完工,将持续更新】

我是Oct,这篇文章主要介绍了虚拟文件系统VFS,并提供了基于Rust的rCore实现。
希望能给你带来一点启发(●’◡’●)

原版rCode第六章是实现了一个简易的文件系统easy-fs,并没有高级封装。本文为rCore引入虚拟文件系统(VFS),使其能够适配多种不同的文件系统。

1. 虚拟文件系统数据结构

一般来说,虚拟文件系统包含以下四个基本的数据结构:

1.1. SuperBlock(超级块):

包含文件系统共通的数据,如该文件系统的名称、总块数等,其代码定义如下:
```rust
pub struct SuperBlockInner {
    pub s_fs_info: Option<Box<dyn FileSystemInfo>>,
    pub inode_set: BTreeSet<Arc<Inode>>,
}

pub struct SuperBlock {
    /* Const data */
    pub block_size_shift: u8,
    pub block_size: usize,

    /* Arc pointer */
    pub block_device: Option<Arc<dyn BlockDevice>>,
    pub fs_type: Arc<FsType>,
    pub sb_op: Arc<SuperBlockOperations>,
    pub root: Arc<DEntry>,

    /* Data with thread contention risk */
    inner: RwLock<SuperBlockInner>,
    pub block_cache: Option<Mutex<BlockCacheManager>>,
}
```

1.2. Inode(索引节点)

包含各文件系统Inode共通的数据,如该节点的文件属性等,其代码定义如下:
```rust
pub enum InodeDevice {
    BlockDevice(Arc<dyn BlockDevice>),
    CharacterDevice(Arc<dyn CharacterDevice>),
    None
}

pub struct InodeInner {
    pub i_info: Option<Arc<dyn InodeInfo>>,

    pub i_file_size: u64,
    pub i_blocks: u64,
    pub i_last_block_bytes: u16,
    pub i_atime_sec: u64,
    pub i_atime_nsec: u32,
    pub i_mtime_sec: u64,
    pub i_mtime_nsec: u32,

    pub i_device: InodeDevice,

    pub i_access_flag: InodeAccessFlag,
    pub i_state_flag: InodeStateFlag,
}

pub struct Inode {
    /* Const data */
    pub i_id: OnceCell<usize>,
    pub i_ctime_sec: OnceCell<u64>,
    pub i_ctime_nsec: OnceCell<u32>,
    pub i_type: OnceCell<InodeTypeFlag>,

    /* Arc pointer */
    pub super_block: Arc<SuperBlock>,
    pub inode_op: Arc<InodeOperations>,

    /* Data with thread contention risk */
    inner: RwLock<InodeInner>
}

```

1.3. DEntry(目录项)

1.4. File(文件)