NJUOS-29-XV6 文件系统实现
本文最后更新于:5 个月前
复习
- 文件系统:bread/bwrite 上的数据结构
- balloc/bfree
- 文件:FAT (链表)/UNIX 文件系统 (索引)
- 目录文件
- 持久数据的可靠性
- RAID 和日志
本次课回答的问题
- Q: 到底能不能看一看文件系统实现的代码?
本次课主要内容
- Xv6 文件系统实现
文件系统:复习
“磁盘上的数据结构”
支持的操作
目录 (索引)
- “图书馆” - mkdir, rmdir, link, unlink, open, …
文件 (虚拟磁盘)
- “图书” - read, write, mmap, …
文件描述符 (偏移量)
- “书签” - lseek
实现的方法
block I/O → block 管理 → 文件 → 目录文件
FAT: 文件信息 “分别” 保存在链表和目录项中
UNIX 文件系统:集中存储文件对象
RTFSC
(讨论:假设你第一次阅读这部分代码,应该怎么做?)
mkfs: 创建文件系统 (格式化)
1 |
|
可以知道每一部分的含义
boot block - 启动加载器
sb block (super block) - 文件系统元数据
log - 日志 (崩溃恢复)
inode blocks
free bitmap - balloc/bfree
data blocks
- RTFSC!
mkfs: 创建文件系统 (cont’d)
“只管分配、不管回收” (类似于极限速通)
rsect/wsect (bread/bwrite)
balloc/bzero
ialloc
iappend
rinode/winode
RTFSC 的正确方式
“读代码不如读执行”: trace.py
gdb -ex 'source mkfs/trace.py' mkfs/mkfs
调试代码
调试系统调用
有很多选择
open - 路径解析、创建文件描述符
read/write - 文件描述符和数据操作
link - 文件元数据操作
…
应该选哪一个?
取决于你对代码的熟悉程度和信心
- 有信心可以选复杂一些的
- 没有信心可以选简单一些的
但如果有了刚才的铺垫,应该都有信心!
崩溃恢复
能否让我们调试崩溃恢复的代码?
“Get out of your comfort zone.”
懒惰是我们的本性
“调试这部分代码有点小麻烦”
“反正考试也不考,算了吧”
- 一定要相信是可以优雅地做到的
课程作业的意义
逼迫大家克服懒惰
- 好作业的设计必须是 “不吃苦做不出来”
获得激励和 “self motivation”
故障注入 (Fault Injection)
- Crash = “断电”
1 |
|
(“sifive finisher”)
xv6 是相对比较 deterministic 的
- 枚举可能的 count
- 我们就得到了一个 “测试框架”!
- 我们用类似的 trick 模拟应用程序写入数据后的系统崩溃
- 枚举可能的 count
总结
本次课回答的问题
- Q: 到底怎么实现一个真正的文件系统?
- Xv6 文件系统:mkfs; 系统调用实现和日志
- Q: 到底怎么实现一个真正的文件系统?
Takeaway messages
- 调试代码的建议
- 先了解一下你要调试的对象
- 然后从 trace 开始
- 不要惧怕调试任何一部分
- 调试代码的建议