file system
这个lab难度不大,主要理解file system中几个较高层的函数就可以做
笔者用时约3h
Large files
这一部分要求我们扩容xv6文件系统能够支持的最大文件大小,在我们修改代码之前,xv6的文件系统限制为12个直接块和1个一级间接块,最大文件大小为(12+256)*1024字节。
我们需要实现的是,将1个直接块替换为1个二级间接块,其中,二级间接块的意思是,该块中存储256个一级简接块的块号,也就是说,最大文件大小变为(11+256+256*256)*1024字节。
具体实现上,首先我们在fs.h文件中修改并添加一些宏定义(这一步非常重要,因为一开始的宏定义不仅仅在我们需要修改的函数中使用,还在其他地方有使用,最简单的方法就是根据其定义修改其值),如下所示。其中,NDIRECT表示直接块数量,NINDIRECT1表示一级间接块可以表示的块号数量(256),NINDIRECT2表示二级间接块可以表示的块号数量(256*256),NINDIRECT表示所有间接块可以表示的块号数量。
#define NDIRECT 11
#define NINDIRECT1 (BSIZE / sizeof(uint))
#define NINDIRECT2 (NINDIRECT1 * NINDIRECT1)
#define NINDIRECT (NINDIRECT1 + NINDIRECT2)
然后需要修改dinode结构体(定义在kernel/fs.h:34)中addrs数组的大小以及inode结构体(定义在kernel/file.h:17)中addrs数组的大小。
// fs.h
// On-disk inode structure
struct dinode {
short type; // File type
short major; // Major device number (T_DEVICE only)
short minor; // Minor device number (T_DEVICE only)
short nlink; // Number of links to inode in file system
uint size; // Size of file (bytes)
uint addrs[NDIRECT+2]; // Data block addresses
};
// file.h
// in-memory copy of an inode
struct inode {
uint dev; // Device number
uint inum; // Inode number
int ref; // Reference count
struct sleeplock lock; // protects everything below here
int valid; // inode has been read from disk?
short type; // copy of disk inode
short major;
short minor;
short nlink;
uint size;
uint addrs[NDIRECT+2];
};
然后根据实验文档,我们修改bmap函数(定义在kernel/fs.c:378),参考一级间接块的处理方案,首先需要判断当前请求的文件块是第几块,如果是二级间接块的话,那么需要获取两个偏移量,分别是二级间接块的偏移量(bn / NINDIRECT1)和该偏移量所指向一级间接块的偏移量(bn % NINDIRECT1)。然后先看二级间接块是否存在,不存在则分配,并跑到对应的一级间接块中,查看一级间接块是否存在,不存在则分配,最后跑到目标块中,查看目标块是否存在,不存在则分配。
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

本文介绍了如何增强xv6文件系统以支持更大的文件,通过增加二级间接块,将最大文件大小提升至(11+256+256*256)*1024字节。同时,文章详细说明了修改`bmap`和`itrunc`函数的过程。另外,文章还讲解了如何在xv6中实现符号链接功能,包括添加O_NOFOLLOW标志和T_SYMLINK类型,以及`sys_symlink`和`sys_open`的修改,以处理软链接的创建和打开操作。
最低0.47元/天 解锁文章
1142

被折叠的 条评论
为什么被折叠?



