6.s081 Lab:file system

Lab:file system

1.实验目的

向xv6文件系统添加大文件和符号链接。

2.实验内容

1)在这个任务中,我们需要增加xv6文件的最大大小。目前xv6文件被限制为268个块,也就是268BSIZE字节(在xv6中BSIZE是1024)。这个限制来自于这样一个限定:一个xv6索引节点包含12个直接索引和一个一级间接索引(最多可容纳256个块号的块),总共有12+256=268个块。我们需要更改xv6文件系统代码,以支持每个inode中的二级间接索引,其中包含256个一级间接索引块的地址,每个块最多可以包含256个数据块地址。结果是,一个文件最多可以包含256256+256+11个块(11个而不是12个,因为我们将为二级间接索引块牺牲一个直接索引块号)。
2)我们要向xv6添加符号链接。符号链接(或软链接)通过路径名引用链接文件;当符号链接打开时,内核将跟随链接指向引用的文件。符号链接类似于硬链接,但硬链接仅限于指向同一磁盘上的文件,而符号链接可以跨越磁盘设备。尽管xv6不支持多个设备,但是实现这个系统调用是理解路径名查找工作原理的一个很好的练习。

3.实验步骤(要细化如何实现的思路或流程图)

3.1 Large files

1)切换分支。

图 1 切换分支

2)根据提示,将kernel/param.h中的FSSIZE的数值从2000改为200000,然后rebuild mkfs。

图 2  rebuild mkfs

3)首先,根据题目要求,牺牲了一个直接索引,将其变为二级间接索引,所以我们去修改fs.h,修改一些宏定义和dinode结构体如下。

图 3  修改fs.h文件

4)同样的,根据提示”If you change the definition of NDIRECT, you’ll probably have to change the declaration of addrs[] in struct inode in file.h.”,如果我们修改了NDIRECT的宏定义,我们同样需要修改file.h文件,inode结构体中addrs[]的定义,以确保inode和dinode的在addrs[]中有相同的元素个数。

图 4  修改file.h文件

5)接下来,就是最为关键的地方了。即本部分的关键,修改fs.c文件中的bmap()函数。根据先前fs.h中的宏定义,我们知道一个一级间接索引可以容纳BSIZE/sizeof(uint),即1024/4=256个地址,而我们希望增加的二级间接索引,是通过这256个地址再去寻找一个中间块,然后再找到最终的数据块,这样就可以达到存储更大文件的目的。而,我们看到bmap()函数中的bn参数,代表“logical block number”,所以它是需要三个if来判断它究竟属于那个类型的索引类型,以避免不必的时间/空间上的浪费。根据题意The block numbers in ip->addrs[],然后分析并模仿直接索引和一级间接索引的程序,写下二级间接索引的程序。
 可以分析,首先bn先减去NINDIRECT(256),和之前减去NDIRECT意义相同,因为NDOUBLE_INDIRECT也是代表块个数而不是序号。然后先/再%确定文件具体位置,然后先去找中间层的间接索引,读出来地址后,再去找第二层间接索引,写下刚读到的索引地址。然后根据这个索引再去找数据块写下数据。当然每次bread()后都要bresle(),这是指导书中写到的”Don’t forget to brelse() each block that you bread().”。

图 5  bmp()函数的二级间接索引部分

6)然后,测试如下,成功通过。

图 6  bigfile测试截图
图 7  usertests测试截图

3.2 Symbolic links

1)为了测试,先修改Makefile。

图 8 修改Makefile

2)根据提示,修改user/usys.pl和user/user.h,增加一个system call。

图 9  修改user/usys.pl和user/user.h
在这里插入图片描述

3)根据提示,需要增加一个代表软连接的文件类型到kernel/stst.h中。

图 10  修改stst.h文件

4)然后,在kernel/fcntl.h添加新的标识,来代表。

图 11  修改fcntl.h文件

5)接下来,我们需要修改的就是指导书中提到的open和symlink两个系统调用命令了。
我们现在syscall.c中添加一个叫symlink的指令。

图 12  向syscall中添加symlink指令
在这里插入图片描述
然后,我们再在syscall.h中添加一个与其相对应的系统调用编号。
图 13  向syscall中添加symlink指令
先在sysfile.c中参考模仿sys_link的程序去添加一个sys_symlink指令,然后再修改该文件中的另一个指令sys_open(详情见报告中所附代码)。
6)然后,测试如下(注意看symlinktest,输出与指导书并不完全相同),成功通过。

图 14  symlinktest测试截图
图 15  usertests测试截图

4.实验结论与心得体会

在进行试验过程中遇到了一些问题,但通过翻阅资料和上网搜索借鉴,也算解决了问题。并且在实习过程中,与之前所学习的操作系统课程上所学到的理论知识相结合了起来,增强了读写代码的能力,对于Unix系统的文件系统有了更深的理解。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值