【MIT 6.S081】Lab9: file system

本文介绍了如何增强xv6文件系统以支持更大的文件,通过增加二级间接块,将最大文件大小提升至(11+256+256*256)*1024字节。同时,文章详细说明了修改`bmap`和`itrunc`函数的过程。另外,文章还讲解了如何在xv6中实现符号链接功能,包括添加O_NOFOLLOW标志和T_SYMLINK类型,以及`sys_symlink`和`sys_open`的修改,以处理软链接的创建和打开操作。


这个lab难度不大,主要理解file system中几个较高层的函数就可以做
笔者用时约3h

Large files

这一部分要求我们扩容xv6文件系统能够支持的最大文件大小,在我们修改代码之前,xv6的文件系统限制为12个直接块和1个一级间接块,最大文件大小为(12+256)*1024字节。
我们需要实现的是,将1个直接块替换为1个二级间接块,其中,二级间接块的意思是,该块中存储256个一级简接块的块号,也就是说,最大文件大小变为(11+256+256*256)*1024字节。
具体实现上,首先我们在fs.h文件中修改并添加一些宏定义(这一步非常重要,因为一开始的宏定义不仅仅在我们需要修改的函数中使用,还在其他地方有使用,最简单的方法就是根据其定义修改其值),如下所示。其中,NDIRECT表示直接块数量,NINDIRECT1表示一级间接块可以表示的块号数量(256),NINDIRECT2表示二级间接块可以表示的块号数量(256*256),NINDIRECT表示所有间接块可以表示的块号数量。

#define NDIRECT 11
#define NINDIRECT1 (BSIZE / sizeof(uint))
#define NINDIRECT2 (NINDIRECT1 * NINDIRECT1)
#define NINDIRECT (NINDIRECT1 + NINDIRECT2)

然后需要修改dinode结构体(定义在kernel/fs.h:34)中addrs数组的大小以及inode结构体(定义在kernel/file.h:17)中addrs数组的大小。

// fs.h
// On-disk inode structure
struct dinode {
   
   
  short type;           // File type
  short major;          // Major device number (T_DEVICE only)
  short minor;          // Minor device number (T_DEVICE only)
  short nlink;          // Number of links to inode in file system
  uint size;            // Size of file (bytes)
  uint addrs[NDIRECT+2];   // Data block addresses
};
// file.h
// in-memory copy of an inode
struct inode {
   
   
  uint dev;           // Device number
  uint inum;          // Inode number
  int ref;            // Reference count
  struct sleeplock lock; // protects everything below here
  int valid;          // inode has been read from disk?

  short type;         // copy of disk inode
  short major;
  short minor;
  short nlink;
  uint size;
  uint addrs[NDIRECT+2];
};

然后根据实验文档,我们修改bmap函数(定义在kernel/fs.c:378),参考一级间接块的处理方案,首先需要判断当前请求的文件块是第几块,如果是二级间接块的话,那么需要获取两个偏移量,分别是二级间接块的偏移量(bn / NINDIRECT1)和该偏移量所指向一级间接块的偏移量(bn % NINDIRECT1)。然后先看二级间接块是否存在,不存在则分配,并跑到对应的一级间接块中,查看一级间接块是否存在,不存在则分配,最后跑到目标块中,查看目标块是否存在,不存在则分配。

static uint
bmap(struct inode *ip, uint bn)
{
   
   
  uint addr, *a;
  struct buf *bp;

  if(bn < NDIRECT){
   
   
    if((addr = ip->addrs[bn]) == 0)
      ip->addrs[bn] = addr = balloc(ip->dev);
    return addr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值