homework: xv6大文件支持
本章节中,我们将会增加xv6所支持的文件的最大大小.
xv6目前所支持的文件大小为140个扇区(12个直接扇区+128个间接扇区),一共是71,680字节.
我们要为xv6 inode增加一个双重间接扇区.双重间接扇区包含128个间接扇区,每个间接扇区包含128个扇区.这样每个inode将会增加16384个扇区,当然我们会将原先的一个直接扇区修改为双重间接扇区.因此最终的文件大小最大为: 16384+140-1=16523.
准备工作
- 修改xv6 Makefile中的CPUS的定义,修改为:
CPUS := 1
. - 在Makefile QEMUOPTS前,添加
QEMUEXTRA = -snapshot
. - 以上两个修改主要是为了提高xv6创建大文件的速度.
mkfs
初始化文件系统时,能够管理的空闲数据block,是通过param.h
中的FSSIZE
控制的.- 目前bitmap大小仅为1000,需要修改为20000.
#define FSSIZE 20000 // size of file system in blocks
- 下载big.c,将big添加到
UPROGS
,启动xv6并运行big. - big将会尽力创建一个足够大的文件,并输出最终文件的大小.目前应该为140个扇区.
阅读核心代码
fs.h
中的struct dinode
定义了磁盘上的inode结构.struct dinode
中的NDIRECT, NINDIRECT, MAXFILE以及addrs[],是需要重点关注的字段struct dinode
图示: ``` dinode
+---------+ |type | +---------+ |major | +-----+ +---------+ |data | |minor | ++----+ +---------+ ^ |nlink | | +-----+ +---------+ | |data | |size | | +-|---+ +---------+ | ^ |address 1+--------------+ | +---------+ | |... | | +-------+ +---------+ | | data | |address 2+----------------------------+ +---|---+ +---------+ ^ +-----+ |indirect +----------------------+ | |data | +---------+ | | +--|--+ | | ^ v | | +---|-------+ | | |address 1 +-------------+ | +-----------+ | |.... | | +-----------+ | |address 128+--------------------------+ +-----------+
indirect block
```
- fs.c中的
bmap()
函数的作用是根据逻辑blockno找到磁盘上真实的blockno. - 当我们读写文件时,
bmap()
都会被调用到.认真阅读bmap()
,确保你已经完全掌握.
修改工作
- 修改
bmap()
,以实现双重间接扇区. struct dinode
中,addrs数组大小为13.- 新的规划为: 前11个为直接扇区, 第12个为间接扇区, 第13个为双重间接扇区.
- 我们不需要处理带有双重间接扇区的文件的删除.
- 如果修改正确,那么
big
创建的文件大小将为16523
.
提示
- 确保你已经完全掌握了
bmap()
的实现,并且完全了解了上面的struct dinode
的图示. - 我们需要思考如何在逻辑block number和真实block number之间转换.
- 如果我们修改了
struct dinode
,那么同样需要修改struct inode
.因为两者是同构的. - 如果我们修改了
NDIRECT
的定义,则需要重新生成fs.img.比较保险的做法是先make clean
,再重新make
. - 每个block在
bread()
之后,不要忘了brelse()
. - 类似于
bmap()
,我们仅在文件确实超出范围后,再分配间接扇区或者双重间接扇区.