ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MIT6.828 Fall2018 笔记 - Homework 10: bigger files for xv6

2020-05-12 12:52:00  阅读:387  来源: 互联网

标签:files 10 addr ip bn NDIRECT xv6 uint dev


Homework: bigger files for xv6

修改param.h

#define FSSIZE       20000  // size of file system in blocks

修改fs.h

#define NDIRECT 11
#define NINDIRECT (BSIZE / sizeof(uint))
#define NDINDIRECT (NINDIRECT * NINDIRECT)
#define MAXFILE (NDIRECT + NINDIRECT + NDINDIRECT)
struct dinode {
// -- 省略 --
  uint addrs[NDIRECT+2];
};

修改file.h

struct inode {
// -- 省略 --
  uint addrs[NDIRECT+2];
};

修改fs.c

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;
  }
  bn -= NDIRECT;

  if(bn < NINDIRECT){
    // Load indirect block, allocating if necessary.
    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 < NDINDIRECT) {
    uint bn1 = bn / NINDIRECT;
    uint bn2 = bn % NINDIRECT;
    struct buf *bp2;
    if ((addr = ip->addrs[NDIRECT + 1]) == 0)
      ip->addrs[NDIRECT + 1] = addr = balloc(ip->dev);

    bp = bread(ip->dev, addr);
    a = (uint *)bp->data;
    if ((addr = a[bn1]) == 0) {
      a[bn1] = addr = balloc(ip->dev);
      log_write(bp);
    }

    bp2 = bread(ip->dev, addr);
    a = (uint *)bp2->data;
    if ((addr = a[bn2]) == 0) {
      a[bn2] = addr = balloc(ip->dev);
      log_write(bp2);
    }

    brelse(bp2);
    brelse(bp);
    return addr;
  }

  panic("bmap: out of range");
}

然后删除fs.img文件,再make clean qemu

init: starting sh
$ big
.....................................................................................................................................................................
wrote 16523 sectors
done; ok
$

标签:files,10,addr,ip,bn,NDIRECT,xv6,uint,dev
来源: https://www.cnblogs.com/zsmumu/p/12875495.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有