引言

本章导读

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

实践体验

获取本章代码:

$ git clone https://github.com/LearningOS/rCore-Tutorial-Code-2024A.git
$ cd rCore-Tutorial-Code-2024A
$ git checkout ch6

在 qemu 模拟器上运行本章代码:

$ cd os
$ make run

内核初始化完成之后就会进入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
>>

本章代码树

 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-------------------------------------------------------------------------------