NJUOS-29-XV6 文件系统实现

本文最后更新于:5 个月前

复习

  • 文件系统:bread/bwrite 上的数据结构
    • balloc/bfree
    • 文件:FAT (链表)/UNIX 文件系统 (索引)
    • 目录文件
  • 持久数据的可靠性
    • RAID 和日志

本次课回答的问题

  • Q: 到底能不能看一看文件系统实现的代码?

本次课主要内容

  • Xv6 文件系统实现

文件系统:复习

“磁盘上的数据结构”

支持的操作

img

  • 目录 (索引)

    • “图书馆” - mkdir, rmdir, link, unlink, open, …
  • 文件 (虚拟磁盘)

    • “图书” - read, write, mmap, …
  • 文件描述符 (偏移量)

    • “书签” - lseek
  • 实现的方法

    • block I/O → block 管理 → 文件 → 目录文件

    • FAT: 文件信息 “分别” 保存在链表和目录项中

    • UNIX 文件系统:集中存储文件对象

RTFSC

(讨论:假设你第一次阅读这部分代码,应该怎么做?)

mkfs: 创建文件系统 (格式化)

1
2
3
// Disk layout:
// [ boot block | sb block | log | inode blocks
// | free bit map | data blocks ]
  • 可以知道每一部分的含义

    • 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
2
3
4
5
6
7
void crash() {
static int count = 100;
if (--count < 0) {
printf("crash\n");
*((int *)0x100000) = 0x5555;
}
}
  • (“sifive finisher”)

  • xv6 是相对比较 deterministic 的

    • 枚举可能的 count
      • 我们就得到了一个 “测试框架”!
      • 我们用类似的 trick 模拟应用程序写入数据后的系统崩溃

总结

  • 本次课回答的问题

    • Q: 到底怎么实现一个真正的文件系统?
      • Xv6 文件系统:mkfs; 系统调用实现和日志
  • Takeaway messages

    • 调试代码的建议
      • 先了解一下你要调试的对象
      • 然后从 trace 开始
      • 不要惧怕调试任何一部分

References

  1. slides
  2. vedio

NJUOS-29-XV6 文件系统实现
https://alexanderliu-creator.github.io/2023/10/10/njuos-29-xv6-wen-jian-xi-tong-shi-xian/
作者
Alexander Liu
发布于
2023年10月10日
许可协议