我是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>
}
```