跳转至

实验4:语义文件系统

实验总览

本次实验要求大家在 NexOS 中实现基于 FAT16 的语义文件系统,主要分为两个部分:基础 FAT16 文件系统文件属性系统

  1. 基础 FAT16 文件系统

    完成文件系统的基本功能,包括读取文件系统元数据、读取文件、写入文件等;

  2. 文件属性系统

    为文件添加语义信息,并提供根据语义信息查询相关文件的 API。

以上两部分构成本实验的必做部分,共计 20分,按与 lab1 相同的折算方式计入最终成绩:

  • 代码测试结果:按 70% 比例计入必做部分总分;
  • 线下提问检查:按 30% 比例计入必做部分总分。

此外,本次实验还有一个选做 Bonus,满分 5分。Bonus 不在平台上自动测试,需要与助教线下检查。

本次实验需要重点关注以下代码文件:

文件 需要关注的内容
kernel/include/file.h FAT16 目录项结构体定义与内存中与文件一一对应的inode结构体定义
kernel/fs/fat16fs.c FAT16 文件系统的读写逻辑与文件属性系统对于属性的处理
kernel/fs/bptree.c B+树的实现

实验代码提交说明

本实验采用希冀平台作为测试平台,网址为 https://cscourse.ustc.edu.cn

在在线作业 lab4 的代码提交界面,需要粘贴你自己的 GitLab 代码仓库链接。由于本次实验使用的是 lab4 分支,因此需要额外指定待测分支,可使用下面两种格式之一:

https://cscourse.ustc.edu.cn/vdir/Gitlab/username/yourproj.git --branch=lab4
https://cscourse.ustc.edu.cn/vdir/Gitlab/username/yourproj.git lab4

注意:由于 NexOS 依赖文件系统的读取功能,因此在实现文件系统读取功能之前,NexOS 都不能成功进入 shell,导致无法进行读取功能依赖的函数测试,平台将会报 0,如果有同学想要检查读取功能之前的实现,请找助教线下检查。

实验时间安排

说明

此处为实验发布时的安排计划,请以课程主页和课程群内最新公告为准。

  • 5.28 晚实验课,讲解实验四并检查实验;
  • 6.4 晚实验课,检查实验;
  • 6.11 晚实验课,检查实验;
  • 6.18 晚实验课,检查实验;
  • 6.25 晚及之后实验课,补检查实验。

补检查分数照常给分,但会记录此次检查未按时完成,此记录在最后综合分数时作为一种参考。本次实验难度较高,建议不要在最后几天集中完成。

检查时间、地点:周四晚 18:30-22:00,电三楼 406/408。基础实验周期为三周,之后为补检查。

获取实验代码(切换到 lab4 分支)

本实验假设你已经在本机 clone 过课程仓库。接下来请拉取远端 lab4 分支,并切换到该分支完成实验。

在仓库根目录执行:

git fetch --all
git checkout -b lab4 upstream/lab4
# 或者:
# git switch -c lab4 --track upstream/lab4

当你完成实验后,push 代码时,请注意指定远端仓库:

git push origin lab4

如果你本地已经有 lab4 分支,可以直接切换:

git checkout lab4
# 或者:
# git switch lab4

切换分支前

请先用 git status 检查当前工作区,避免未提交改动被分支切换打断。若提示找不到 upstream/lab4,请先确认远端是否已经发布该分支,以及你的远端名称是否为 upstream

实验任务

本次实验主体由 Part1:FAT16 文件系统Part2:文件属性系统 构成,Bonus 部分包含在 Part2 中,同学们可自主选择是否完成 Bonus。本次实验难度较高,请同学们根据情况合理安排时间完成。

上述两文档分别包含两个部分的实验背景、系统介绍与实验任务,由于本次实验对 FAT16 文件系统有较大“魔改”,建议同学们在做实验之前仔细阅读相关材料。

若有同学发现实验文档存在错误/歧义,还请尽快联系助教修改。

实验注意事项

启动 NexOS

实验4 分支搭载了 FAT16 文件系统,请使用以下命令启动内核并挂载 FAT16 文件系统:

make qemu FS=fat16

实验提示

实验4 已经在 kernel/fs/fat16fs.ckernel/fs/bptree.c 中标明了 TODO,同学们可以在文件中搜索 TODO 以快速定位。被包在 TODO 中的 panic() 是用来帮助同学们快速寻找哪个功能没有实现的,同学们实现完一个功能之后请记得注释掉 panic()

fat16fs.c 总代码量有 2000+ 行,同学们不要望而却步,需要大家实现的代码量约 100-200 行,大部分辅助函数助教都已经提供并说明其作用,代码中也添加了简要的提示,可以对照 实验4:辅助函数与宏定义速查 查看,对于需要大家自己实现的内容,可以翻阅两份实验任务文档,其中有对要实现的函数的详细流程。

强烈建议同学们使用 C/C++Intellisense Enigine 或者 clangd 进行代码索引,本实验需要了解的函数比较多,索引将有效提升阅读效率。对于 clangd,同学们可以先运行一次 make qemu FS=fat16,仓库下会自动生成 build/fat16/compile_commands.json,同学们将其拉到 clangd 会搜索的目录下即可配置成功,搜索目录一般是 build 或者工作区。

如何测试

测试脚本

仓库提供了一个简单的测试脚本 user/lab4test.c,可以在 shell 中输入 lab4test 来检测大家实现的功能,当然,NexOS 需要先能运行 shell。这是因为 NexOS 本身依赖于文件系统而得以运行,只有在实现完 fat16fs_readi() 之后才能够正常进入到 shell 中,此前可能会出现很多让人头疼的 bug,希望同学们不要灰心,善用 内核日志系统与调试输出 找出问题,同时也欢迎大家来 debug。

shell 内手动测试

也可以使用如下的 shell 命令来手动测试你的实现:

mkdir d1
cd d1
touch a
kwset a os file_system ai llm
touch b
kwset b llm rag database vector
touch c
kwset c compute_system gpu llm

query os # 全盘扫描
# /d1/a

query -b llm # B+ 树索引
# /d1/a
# /d1/b
# /d1/c

自行编写 shell 脚本测试

同学们可以在 user/ 下自行创建 shell 脚本,写入 shell 命令以进行自动化测试,运行内核,然后在 shell 中使用仓库提供的 rscr 命令执行脚本。

脚本编写事项

rscr 命令与实验1 中实现的 runscript 命令所实现的功能一致,因此不要在脚本中写 cd 等不支持的命令。