homework: xv6大文件支持

本章节中,我们将会增加xv6所支持的文件的最大大小.

xv6目前所支持的文件大小为140个扇区(12个直接扇区+128个间接扇区),一共是71,680字节.

我们要为xv6 inode增加一个双重间接扇区.双重间接扇区包含128个间接扇区,每个间接扇区包含128个扇区.这样每个inode将会增加16384个扇区,当然我们会将原先的一个直接扇区修改为双重间接扇区.因此最终的文件大小最大为: 16384+140-1=16523.

准备工作

  1. 修改xv6 Makefile中的CPUS的定义,修改为: CPUS := 1.
  2. 在Makefile QEMUOPTS前,添加QEMUEXTRA = -snapshot.
  3. 以上两个修改主要是为了提高xv6创建大文件的速度.
  4. mkfs初始化文件系统时,能够管理的空闲数据block,是通过param.h中的FSSIZE控制的.
  5. 目前bitmap大小仅为1000,需要修改为20000.#define FSSIZE 20000 // size of file system in blocks
  6. 下载big.c,将big添加到UPROGS,启动xv6并运行big.
  7. big将会尽力创建一个足够大的文件,并输出最终文件的大小.目前应该为140个扇区.

阅读核心代码

  1. fs.h中的struct dinode定义了磁盘上的inode结构.
  2. struct dinode中的NDIRECT, NINDIRECT, MAXFILE以及addrs[],是需要重点关注的字段
  3. struct dinode图示: ``` dinode

+---------+ |type | +---------+ |major | +-----+ +---------+ |data | |minor | ++----+ +---------+ ^ |nlink | | +-----+ +---------+ | |data | |size | | +-|---+ +---------+ | ^ |address 1+--------------+ | +---------+ | |... | | +-------+ +---------+ | | data | |address 2+----------------------------+ +---|---+ +---------+ ^ +-----+ |indirect +----------------------+ | |data | +---------+ | | +--|--+ | | ^ v | | +---|-------+ | | |address 1 +-------------+ | +-----------+ | |.... | | +-----------+ | |address 128+--------------------------+ +-----------+

                       indirect block

```

  1. fs.c中的bmap()函数的作用是根据逻辑blockno找到磁盘上真实的blockno.
  2. 当我们读写文件时,bmap()都会被调用到.认真阅读bmap(),确保你已经完全掌握.

修改工作

  1. 修改bmap(),以实现双重间接扇区.
  2. struct dinode中,addrs数组大小为13.
  3. 新的规划为: 前11个为直接扇区, 第12个为间接扇区, 第13个为双重间接扇区.
  4. 我们不需要处理带有双重间接扇区的文件的删除.
  5. 如果修改正确,那么big创建的文件大小将为16523.

提示

  1. 确保你已经完全掌握了bmap()的实现,并且完全了解了上面的struct dinode的图示.
  2. 我们需要思考如何在逻辑block number和真实block number之间转换.
  3. 如果我们修改了struct dinode,那么同样需要修改struct inode.因为两者是同构的.
  4. 如果我们修改了NDIRECT的定义,则需要重新生成fs.img.比较保险的做法是先make clean,再重新make.
  5. 每个block在bread()之后,不要忘了brelse().
  6. 类似于bmap(),我们仅在文件确实超出范围后,再分配间接扇区或者双重间接扇区.

results matching ""

    No results matching ""