实验4:语义文件系统¶
实验总览¶
本次实验要求大家在 NexOS 中实现基于 FAT16 的语义文件系统,主要分为两个部分:基础 FAT16 文件系统与文件属性系统。
-
基础 FAT16 文件系统
完成文件系统的基本功能,包括读取文件系统元数据、读取文件、写入文件等;
-
文件属性系统
为文件添加语义信息,并提供根据语义信息查询相关文件的 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 分支,并切换到该分支完成实验。
在仓库根目录执行:
当你完成实验后,push 代码时,请注意指定远端仓库:
如果你本地已经有 lab4 分支,可以直接切换:
切换分支前
请先用 git status 检查当前工作区,避免未提交改动被分支切换打断。若提示找不到 upstream/lab4,请先确认远端是否已经发布该分支,以及你的远端名称是否为 upstream。
实验任务¶
本次实验主体由 Part1:FAT16 文件系统 与 Part2:文件属性系统 构成,Bonus 部分包含在 Part2 中,同学们可自主选择是否完成 Bonus。本次实验难度较高,请同学们根据情况合理安排时间完成。
上述两文档分别包含两个部分的实验背景、系统介绍与实验任务,由于本次实验对 FAT16 文件系统有较大“魔改”,建议同学们在做实验之前仔细阅读相关材料。
若有同学发现实验文档存在错误/歧义,还请尽快联系助教修改。
实验注意事项¶
启动 NexOS¶
实验4 分支搭载了 FAT16 文件系统,请使用以下命令启动内核并挂载 FAT16 文件系统:
实验提示¶
实验4 已经在 kernel/fs/fat16fs.c 与 kernel/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 等不支持的命令。