XV6 operating system: bigger files for xv6

本文介绍如何修改xv6操作系统以支持更大的文件。通过调整Makefile、param.h及fs.c等文件,实现对大文件的支持,并详细解析inode结构与bmap函数的改写过程。

操作系统9:bigger files forxv6

1.首先,根据题目要求,将

CPUS := 1

QEMUEXTRA = -snapshot
这两行代码分别加入Makefile文件中的相应位置。

 
2.然后打开param.h,将
#define FSSIZE       1000
改为: #define FSSIZE       20000

 
3.然后下载big.c文件并放入xv6的文件夹,然后在makefile文件中的
UPROGS list中的最后加入对big的引用:

 

 

保存后运行xv6,输入big回车,显示140个blocks则至此,所有的准备工作完成。

 

 4.首先了解inode

 

 

一个inode有12个direct指针,这个指针是直接指向硬盘中的文件块的,还有一个inderict指针,这个指针指向另外一个indirect block, 这个indirect block有128的新的指针,分别指向一个文件块。这样,一个inode就可以指向:12+128=140个文件块,这也解释了为什么运行big函数后显示140个block

在xv6,inode的定义是这样的:

 

接下来更改fs.c文件:(将其中的bmap函数改写)

bmap(structinode *ip, uint bn)

{

  uint addr, *a, *indirect, *double_indirect,indirect_idx, double_indirect_idx;

  struct buf *bp, *bp2;

 

  if(bn < NDIRECT){

    if((addr = ip->addrs[bn]) == 0)

      ip->addrs[bn] = addr =balloc(ip->dev);

    return addr;

  }

  bn -= NDIRECT;

 

  if(bn < NINDIRECT){

    // Load indirect block, allocating ifnecessary.

    if((addr = ip->addrs[NDIRECT]) == 0)

      ip->addrs[NDIRECT] = addr =balloc(ip->dev);

    bp = bread(ip->dev, addr);

    a = (uint*)bp->data;

    if((addr = a[bn]) == 0){

      a[bn] = addr = balloc(ip->dev);

      log_write(bp);

    }

    brelse(bp);

    return addr;

  }

  bn -= NINDIRECT;

 

  if (bn < NINDIRECT*NINDIRECT) {

    // Load first indirect block, allocating ifnecessary.

    if((addr = ip->addrs[NDIRECT + 1]) == 0)

      ip->addrs[NDIRECT + 1] = addr =balloc(ip->dev);

 

    bp = bread(ip->dev, addr);

    indirect = (uint *) bp->data;

    indirect_idx = bn / NINDIRECT;

 

    if ((addr = indirect[indirect_idx]) == 0) {

      addr = indirect[indirect_idx] =balloc(ip->dev);

      log_write(bp);

    }

 

    bp2 = bread(ip->dev, addr);

    double_indirect = (uint *) bp2->data;

    double_indirect_idx = bn % NINDIRECT;

 

    if((addr = double_indirect[double_indirect_idx]) == 0) {

      addr =double_indirect[double_indirect_idx] = balloc(ip->dev);

      log_write(bp2);

    }

 

    brelse(bp2);

    brelse(bp);

    return addr;

  }

 

  panic("bmap: out of range");

}

 

接着打开fs.h文件,将NDIRECT改为11

 

相应的更改:

 

如果这个时候运行big,会显示138个block,原因出在:更改前的MAXFILE太小了,我们需要把它扩大:

 

保存后运行big,显示出来

 

 

注:16523 = 128*128(doubly-indirectblocks) + 11(singly-indirect blocks) + 128(directblocks)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值