引言¶
本章导读¶
本章我们将实现一个简单的文件系统 – easyfs,能够对 持久存储设备 (Persistent Storage) I/O 资源进行管理;将设计两种文件:常规文件和目录文件,它们均以文件系统所维护的 磁盘文件 形式被组织并保存在持久存储设备上。
实践体验¶
注解
基于github classroom的开发方式
基于github classroom,可方便建立开发用的git repository,并可基于github的 codespace (在线版ubuntu +vscode)在线开发使用。整个开发环境仅仅需要一个网络浏览器。
在网络浏览器中用自己的 github id 登录 github.com
接收 第四个实验(os6)的github classroom在线邀请 ,根据提示一路选择OK即可。
完成第二步后,你的第四个实验的 github repository 会被自动建立好,点击此github repository的链接,就可看到你要完成的第一个实验了。
在你的第四个实验的网页的中上部可以看到一个醒目的 code 绿色按钮,点击后,可以进一步看到 codespace 标签和醒目的 create codesapce on main 绿色按钮。请点击这个绿色按钮,就可以进入到在线的ubuntu +vscode环境中
再按照下面的环境安装提示在vscode的 console 中安装配置开发环境:rustc,qemu等工具。注:也可在vscode的 console 中执行
make codespaces_setenv来自动安装配置开发环境(执行``sudo``需要root权限,仅需要执行一次)。在vscode的 console 中执行 make setupclassroom_test6 (该命令仅执行一次)配置githubclassroom 自动评分功能。
然后就可以基于在线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
$ 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-------------------------------------------------------------------------------