# zCore::fs子模块

`zCore/src/fs.rs`为`main()`函数提供了`fs::rootfs()`方法来生成文件系统的对象。在linux_libos模式下是获取HostFS，在linux_bare模式下是从设备载入SFS。

- linux_libos模式下的rootfs()

  先指定根目录`rootfs`的值，再创建一个HostFS对象。

- linux_bare模式下的rootfs()

  先指定设备`device`的值，再从设备载入SFS对象。

- init_ram_disk()函数
  1. 如果定义了`link-user-img`，则根据内存镜像的指针和大小来生成片断。
  2. 否则，返回初始化的RAM盘的片断。

# linux_object::fs子模块

`linux_object/src/fs`实现了fs模块，是文件系统具体的实现者。

```rust
mod devfs;
mod file;
mod ioctl;
mod pipe;
mod pseudo;
mod stdio;

pub trait FileLike: KernelObject {
    ...
}

/// 创建根文件系统，挂载DevFS和RamFS。
pub fn create_root_fs() {...}

/// 把path分隔成(base_path, filename)
pub fn split_path(path: &str) -> (&str, &str) {...}
```

## devfs模块

```rust
mod fbdev;
mod input;
mod random;
mod uartdev;

pub use fbdev::FbDev;
pub use input::{EventDev, MiceDev};
pub use random::RandomINode;
pub use uartdev::UartDev;
```

### input模块

为MiceDev和EventDev实现INode

### fbdev模块

为framebuffer实现INode

### random模块

为RandomINode实现INode

### uartdev模块

为UartDev实现INode

## device模块

看起来没什么用的模块，没有在其它地方被使用。应该是`rcore_fs_wrapper`模块取代了此模块的地位。

## file模块

对文件的各种操作。

## ioctl模块

定义了IOR和IOW用到的一些常数。

## pipe模块

为管道实现INode

## pseudo模块

为伪文件系统实现INode

## stdio模块

为Stdin和Stdout实现INode

## rcore_fs_wrapper模块

是对`rcore_fs::dev::Device`的实现，这样就可以从设备载入文件系统了。

```rust
/// 内存上的缓冲区，这个缓冲区是for device的
pub struct MemBuf(RwLock<&'static mut [u8]>);

impl MemBuf {
    pub fn new () -> Self {}	// 创建一个Membuf结构体
}

impl Device for MemBuf {
    fn read_at()
    fn write_at()
    fn sync()
}

/// 实现了BlockScheme的块设备
pub struct Block(Arc<dyn BlockScheme>);

impl Block {
    pub fn new() -> Self {}		// 创建一个Block结构体
}

impl BlockDevice for Block {
    fn read_at()
    fn write_at()
    fn sync()
}
```

