MIT 6.1810 · Lab fs · 文件系统

Lab: 文件系统

在本实验中,你将为 xv6 文件系统添加大文件和符号链接支持。

难度:中等

分支:fs

实验日期:2026 秋季

在编写代码之前,你应该阅读xv6 手册的"第 10 章:文件系统"并研究相应代码。

$ git fetch
$ git checkout fs
$ make clean

大文件 中等

在这个任务中,你将增加 xv6 文件的最大大小。目前 xv6 文件限制为 268 个块,或 268*BSIZE 字节(xv6 中 BSIZE 为 1024)。这个限制来自 xv6 inode 包含 12 个"直接"块号和 1 个"单间接"块号。

$ bigfile
..
wrote 268 blocks
bigfile: file is too small
$

你将更改 xv6 文件系统代码以支持每个 inode 中的"双间接"块,包含 256 个单间接块的地址,每个单间接块最多可以包含 256 个数据块的地址。结果是一个文件最多可以包含 65803 个块。

初步知识

mkfs 程序创建 xv6 文件系统磁盘映像并确定文件系统有多少总块;这个大小由 kernel/param.h 中的 FSSIZE 控制。本实验仓库中的 FSSIZE 设置为 200,000 个块。

nmeta 71 (boot, super, log blocks 31, inode blocks 13, bitmap blocks 25) blocks 199929 total 200000

需要查看的内容

磁盘上 inode 的格式由 fs.h 中的 struct dinode 定义。你特别感兴趣的是 NDIRECT、NINDIRECT、MAXFILE 和 struct dinode 的 addrs[] 元素。

在磁盘上查找文件数据的代码在 fs.c 中的 bmap() 中。bmap() 在读取和写入文件时都被调用。

bmap() 处理两种块号。bn 参数是"逻辑块号"——文件内的块号。ip->addrs[] 中的块号和传递给 bread() 的参数是磁盘块号。

你的工作

修改 bmap() 使其实现双间接块,除了直接块和单间接块。你必须只有 11 个直接块,而不是 12 个,以腾出空间给你的新双间接块;你不允许更改磁盘上 inode 的大小。ip->addrs[] 的前 11 个元素应该是直接块;第 12 个应该是单间接块(和当前一样);第 13 个应该是你的新双间接块。

$ bigfile
..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
wrote 65803 blocks
done; ok
$ usertests -q
...
ALL TESTS PASSED
$

bigfile 将至少需要一分半钟运行。

提示:

符号链接 中等

在这个练习中,你将向 xv6 添加符号链接。符号链接(或软链接)通过路径名引用链接的文件或目录;当打开符号链接时,内核查找链接到的名称。

你不需要处理指向目录的符号链接;唯一需要知道如何跟随符号链接的系统调用是 open()。

你的工作

你将实现 symlink(char *target, char *path) 系统调用,它在 path 创建一个指向 target 的新符号链接。要测试,将 symlinktest 添加到 Makefile 并运行它。

$ symlinktest
Start: test symlinks
test symlinks: ok
Start: test concurrent symlinks
test concurrent symlinks: ok
$ usertests -q
...
ALL TESTS PASSED
$

提示:

提交实验

时间花费

创建一个新文件 time.txt,放入一个整数,表示你花在实验上的小时数。

答案

如果本实验有问题,将答案写在 answers-fs.txt 中。

提交

运行 make zipball,上传到 Gradescope。

可选挑战练习