# 引言 - Open-Source-OS-Training-Camp-2022 文档

Hide navigation sidebar
Hide table of contents sidebar
Toggle table of contents sidebar

# 引言

## 本章导读

本章我们将实现一个简单的文件系统 – easyfs，能够对 持久存储设备 (Persistent Storage) I/O 资源进行管理；将设计两种文件：常规文件和目录文件，它们均以文件系统所维护的 磁盘文件 形式被组织并保存在持久存储设备上。

## 实践体验

注解

基于github classroom的开发方式

基于github classroom，可方便建立开发用的git repository，并可基于github的 codespace （在线版ubuntu +vscode）在线开发使用。整个开发环境仅仅需要一个网络浏览器。

1. 在网络浏览器中用自己的 github id 登录 github.com

2. 接收 第四个实验(os6)的github classroom在线邀请 ，根据提示一路选择OK即可。

3. 完成第二步后，你的第四个实验的 github repository 会被自动建立好，点击此github repository的链接，就可看到你要完成的第一个实验了。

4. 在你的第四个实验的网页的中上部可以看到一个醒目的 code 绿色按钮，点击后，可以进一步看到 codespace 标签和醒目的 create codesapce on main 绿色按钮。请点击这个绿色按钮，就可以进入到在线的ubuntu +vscode环境中

5. 再按照下面的环境安装提示在vscode的 console 中安装配置开发环境：rustc，qemu等工具。注：也可在vscode的 console 中执行 `make codespaces_setenv` 来自动安装配置开发环境（执行``sudo``需要root权限，仅需要执行一次）。

6. 在vscode的 console 中执行 make setupclassroom_test6 （该命令仅执行一次）配置githubclassroom 自动评分功能。

7. 然后就可以基于在线vscode进行开发、运行、提交等完整的实验过程了。

上述的3，4，5步不是必须的，你也可以线下本地开发。

注：如果是本地的ubuntu中建立开发环境，可在shell中执行 `make ubuntu_local_setenv` 来自动安装配置开发环境（执行``sudo``需要root权限，仅需要执行一次）。

在 qemu 模拟器上运行本章代码参考框架：

    $ git clone ``gitaddr of github-classroom-build-lab4``
    $ cd ``github-classroom-build-lab4``
    $ make setupclassroom_test6  //注意：这一步很重要，是用于github classroom自动评测你的工作。这一步只需在首次克隆项目仓库时执行一次，以后一般就不用执行了，除非 .github/workflows/classroom.yml发生了变化。
    $ cd os6-ref
    $ make run

注解

实验名称 ：实验编号

- lab0-0 : test1

- lab0-1：test2

- lab1：test3

- lab2：test4

- lab3：test5

- lab4：test6

- lab5：test8

内核初始化完成之后就会进入shell程序，在这里我们运行一下本章的测例 `ch6b_filetest_simple` ：

    >> ch6b_filetest_simple
    file_test passed!
    Shell: Process 2 exited with code 0
    >>

它会将 `Hello, world!` 输出到另一个文件 `filea` ，并读取里面的内容确认输出正确。我们也可以通过命令行工具 `ch6b_cat` 来查看 `filea` 中的内容：

    >> ch6b_cat
    Hello, world!
    Shell: Process 2 exited with code 0
    >>

## easy-fs和 lab4(os6)参考框架:

     1├── easy-fs(新增：从内核中独立出来的一个简单的文件系统 EasyFileSystem 的实现)
     2│   ├── Cargo.toml
     3│   └── src
     4│       ├── bitmap.rs(位图抽象)
     5│       ├── block_cache.rs(块缓存层，将块设备中的部分块缓存在内存中)
     6│       ├── block_dev.rs(声明块设备抽象接口 BlockDevice，需要库的使用者提供其实现)
     7│       ├── efs.rs(实现整个 EasyFileSystem 的磁盘布局)
     8│       ├── layout.rs(一些保存在磁盘上的数据结构的内存布局)
     9│       ├── lib.rs
    10│       └── vfs.rs(提供虚拟文件系统的核心抽象，即索引节点 Inode)
    11├── easy-fs-fuse(新增：将当前 OS 上的应用可执行文件按照 easy-fs 的格式进行打包)
    12│   ├── Cargo.toml
    13│   └── src
    14│       └── main.rs
    15├── os
    16    ├── build.rs(修改：不再需要将用户态程序链接到内核中）
    17    ├── Cargo.toml(修改：新增 Qemu 的块设备驱动依赖 crate)
    18    ├── Makefile(修改：新增文件系统的构建流程)
    19    └── src
    20        ├── config.rs(修改：新增访问块设备所需的一些 MMIO 配置)
    21        ├── ...
    22        ├── drivers(新增：Qemu 平台的块设备驱动)
    23        │   ├── block
    24        │   │   ├── mod.rs(将不同平台上的块设备全局实例化为 BLOCK_DEVICE 提供给其他模块使用)
    25        │   │   └── virtio_blk.rs(Qemu 平台的 virtio-blk 块设备)
    26        │   └── mod.rs
    27        ├── fs(新增：对文件系统及文件抽象)
    28        │   ├── inode.rs(新增：将 easy-fs 提供的 Inode 抽象封装为内核看到的 OSInode
    29        │   │            并实现 fs 子模块的 File Trait)
    30        │   ├── mod.rs
    31        │   └── stdio.rs(新增：将标准输入输出也抽象为文件)
    32        ├── loader.rs(移除：应用加载器 loader 子模块，本章开始从文件系统中加载应用)
    33        ├── mm
    34        │   ├── address.rs
    35        │   ├── frame_allocator.rs
    36        │   ├── heap_allocator.rs
    37        │   ├── memory_set.rs(修改：在创建地址空间的时候插入 MMIO 虚拟页面)
    38        │   ├── mod.rs
    39        │   └── page_table.rs(新增：应用地址空间的缓冲区抽象 UserBuffer 及其迭代器实现)
    40        ├── syscall
    41        │   ├── fs.rs(修改：新增 sys_open，修改sys_read、sys_write)
    42        │   ├── mod.rs
    43        │   └── process.rs(修改：sys_exec 改为从文件系统中加载 ELF)
    44        ├── task
    45            ├── context.rs
    46            ├── manager.rs
    47            ├── mod.rs(修改：初始进程 INITPROC 的初始化)
    48            ├── pid.rs
    49            ├── processor.rs
    50            ├── switch.rs
    51            ├── switch.S
    52            └── task.rs(修改：在任务控制块中加入文件描述符表的相关机制)
    53
    54cloc easy-fs os
    55-------------------------------------------------------------------------------
    56Language                     files          blank        comment           code
    57-------------------------------------------------------------------------------
    58Rust                            41            306            418           3349
    59Assembly                         4             53             26            526
    60make                             1             13              4             48
    61TOML                             2              4              2             23
    62-------------------------------------------------------------------------------
    63SUM:                            48            376            450           3946
    64-------------------------------------------------------------------------------