引言¶
本章导读¶
本章我们将实现一个简单的文件系统 – easyfs,能够对 持久存储设备 (Persistent Storage) I/O 资源进行管理;将设计两种文件:常规文件和目录文件,它们均以文件系统所维护的 磁盘文件 形式被组织并保存在持久存储设备上。
实践体验¶
获取本章代码:
$ git clone https://github.com/LearningOS/rCore-Tutorial-Code-2023A.git
$ cd rCore-Tutorial-Code-2023A
$ 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-------------------------------------------------------------------------------