一、实验内容:
Part A Large files
-
Change the definition of
NDIRECT
and add the definition ofNNINDIRECT
. Change the declaration ofaddrs[]
instruct inode
infile.h
. Make sure thatstruct inode
andstruct dinode
have the same number of elements in theiraddrs[]
arrays.除此之外,记得在计算MAXFILE时把NNINDIRECT加上。
-
Run
make clean
which forces make to rebuild fs.img -
Modify
bmap()
-
实现思路:根据实验要求,我们要构造的就是一个二级的映射,因为一级的映射已经有了(NINDIRECT),所以可以以一级为基础再套一级即可。同样,先将bn减去NINDIRECT,判断是否在NNINDIRECT的范围内。把地址取到NNINDIRECT对应的那块,没有(为0)则进行分配。因为是两级,所以NINDIRECT中的bn相当于有两个,第一个(cn)可由bn除得到,第二个(dn)可由bn除余得到。然后通过以上的cn和dn迭代获取addr的步骤得到最后的addr。
-
具体实现
测试:
Part B Symbolic links
- 编译准备
- Create a new system call number for symlink, add an entry to user/usys.pl, user/user.h, and implement an empty sys_symlink in kernel/sysfile.c.
-
Add a new file type (
T_SYMLINK
) to kernel/stat.h to represent a symbolic link. -
Add a new flag to kernel/fcntl.h, (
O_NOFOLLOW
), that can be used with theopen
system call.为保证不发生位冲突,将
O_NOFOLLOW
设为0x010 -
Add symlinktest to the Makefile and run it
成功编译
- Implement the
symlink(target, path)
system call to create a new symbolic link at path that refers to target. Note that target does not need to exist for the system call to succeed. You will need to choose somewhere to store the target path of a symbolic link
-
实现思路:简而言之,就是要在path去存一下target。一个简单的想法就是path下创建一个T_SYMLINK的inode,在inode里面加一个char[]的内容用来放target。这里面有诸多细节需要注意:首先放target到inode中,因为是char[]的复制,不能直接用“=”,strcpy也无法使用,所以回归最基本的办法,将一个一个char进行拷贝,以’\0’作为结尾判断,但要注意inode中sympath拿出来后要进行初始化,因为无法知道原来里面放的是啥。然后是creat有lock操作,结束了要unlock。
-
具体实现:
- Modify the
open
system call to handle the case where the path refers to a symbolic link.
-
实现思路:open操作的实现已经有了,我们要做的就是找到正确的path,确定了这一点后,我们便把代码写在open功能的前面。先做一个位判断和格式判断,设一个count后便进入循环,循环终止条件有:读到不是T_SYNLINK、count大于10。把inode里的sympath读出来到path中,以此完成一个循环。还有一些lock的细节,因为inode会因为path的不同而变化,故与inode有关的锁也会变,所以在inode变化后要把旧锁unlock,lock新锁。
-
具体实现:
测试:
make grade
二、问题解决:
【问题】在Part A完成了Hints后,测试bigfile后显示wrote 267 blocks。
【分析】相比于最开始的版本少了1个block,再对比正确的65803 blocks可知应该是最后那个二级映射的block没有计算进去。
【解决】详细检查代码后发现,计算MAXFILE时没有把NNINDIRECT加上,这点确实在Hints里面没有提,最开始写的时候也没有注意到。加上后,再跑就能正常运行了。
【问题】在Part B进行测试时,显示FAILURE: Failed to open 1。
【分析】先尝试去看看path对不对,在open里添加一行printf代码。
结果发现path就不对了,后面多了一些奇怪的东西,再看看在inode的sympath里面有没有。
结果还是有这些东西,所以是在sys_symlink传值的时候出现的问题,传进来的target固然没有问题,只有可能就是sympath没有初始化。
【解决】在sys_symlink传值之前对sympath进行初始化,都初始化为’\0’。之后再进行测试,便能正常运行了。
三、实验总结:
-
这个实验除了在做文件系统,还用到了之前的很多内容,对知识进行了综合的考察。比如涉及到的锁的操作,并且还是以inode为参数的hash锁,这让我在PatrB的open函数中花了很长时间才反应过来。
-
感觉自己还是过于依赖Hints了,一到Hints没有的内容,就不知道怎么做了。只盯着Hints有的内容,明明MAXFILE的define就在NDIRECT后面,却没有发现并做相应的修改。
-
这就是本学期最后一次实验了,通过这些实验,我对操作系统的一些理论的内容通过实践有了更深的理解,对一个操作系统的搭建也有了较为完整的认识。除此之外,我还学会了linux下许多基本的指令以及git自己的项目上传branch的操作。
五、实验参考及git地址: