MIT_6.828_2018_Homework:bigger files for xv6

地址:bigger files for xv6
題目要求:原來的一個文件的最大大小爲12+128=140個blocks,現在將前12個直接塊取一個出來存放另一個“doubly-indirect”塊,這樣就新增了128*128-1個塊了。有點類似與計算機組成原理裏面的存儲器間接尋址。

準備工作

首先修改Makefile:

CPUS := 1

加入

QEMUEXTRA = -snapshot

修改param.h:

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

開始

修改fs.h

修改NDIRECT:

#define NDIRECT 11
#define MAXFILE (NDIRECT + NINDIRECT + NINDIRECT*NINDIRECT)

同時修改dinode中addrs定義:

// On-disk inode structure
struct dinode {
  short type;           // File type
  short major;          // Major device number (T_DEV only)
  short minor;          // Minor device number (T_DEV only)
  short nlink;          // Number of links to inode in file system
  uint size;            // Size of file (bytes)
  uint addrs[NDIRECT+2];   // Data block addresses
};

最後修改fs.c中的bmap()函數:

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

  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; 

  uint DBNINDIRECT = NINDIRECT*NINDIRECT;

  if (bn < DBNINDIRECT)
  {
  	//在第一級中的位置
  	uint which_block = bn/NINDIRECT;
	//在第二級中的位置
	uint final_location = bn - which_block*NINDIRECT;
	
	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[which_block]) == 0)
	{
		a[which_block] = addr = balloc(ip->dev);
		log_write(bp);
	}

	dp = bread(ip->dev,addr);
	a = (uint*)dp->data;

	if ((addr = a[final_location]) == 0)
	{
		a[final_location] = addr = balloc(ip->dev);
		log_write(dp);
	}

	brelse(bp);
	brelse(dp);
	return addr;
	
  }
  panic("bmap: out of range");
}

運行結果

運行make;make qemu,在shell裏面輸入big,得到如下結果:

qemu -serial mon:stdio -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 1 -m 512 -snapshot
xv6...
cpu0: starting 0
sb: size 20000 nblocks 19937 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
init: starting sh
$ big
.....................................................................................................................................................................
wrote 16523 sectors

總結:注意體會xv6中的分層思想,各個層的作用。

END.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章