山东大学操作系统课程设计实验四——文件系统扩充
实验四 扩展文件系统(lab4)
实验目的:
扩展Nachos的文件系统。Nachos的文件系统是一个简单并且能力有限的系统,限制之一就是文件的大小是不可扩展的。通过扩展,使得文件的大小是灵活可变的。
实验环境:
虚拟机下Ubuntu Linux 16.04 LTS系统,nachos-3.4内核管理模块和MIPS CPU软件模拟模块,文件系统模块,代码在lab4文件夹下面实现。
实验思路:
第一步
1.创建lab4,并将lab5拷贝进来,再把filesys文件夹下的拷贝进来
2.阅读源码,找主要任务
那我们先开始看文件:
根据实验指导书上面讲的,disk和synchdisk是文件系统的最底层,负责将指定数据写入指定扇区,在我们的任务中不需要修改。Bitmap储存磁盘状况,Directory储存文件头位置,也不需要修改。main.cc和fstest.cc也是完整的调试文件,不需要修改。
那么本次实验主要需要改动的就是openfile文件,fileHeader保存了文件的大小、数据扇区,所以也要被修改。
openfile
openfile.h发现主要是打开文件的读写操作之类的
fileheader
.h发现在这里对文件的长度有了定义,那么想要自由改变文件长度就要在这里修改
第二步 开始操作
1.添加文件长度拓展的接口,名命名为extend
2.在openfile内添加可以返回文件头位置的方法
3makefile修改
makefile.local
makefile
4.fstest修改
按照实验指导,在Append方法和NAppend方法中去掉openfile->WriteBack()一句的注释。
关键源代码注释以及程序说明:
长度拓展接口代码:
bool
FileHeader::Extend(int newSize)
{
if(newSize<numBytes)return FALSE; //if not a extend operation
if(newSize==numBytes)return TRUE; //if size not change
int newNumSectors = divRoundUp(newSize, SectorSize); //the number of sectors the new size need to be allocated.
if(newNumSectors == numSectors){
numBytes = newSize;
return TRUE; //if number of sectors new size need equals the
}
int diffSector = newNumSectors - numSectors;
OpenFile *bitmapfile = new OpenFile(0);
BitMap *freeMap;
freeMap = new BitMap(NumSectors);
freeMap->FetchFrom(bitmapfile);
printf("debug in fhdr extend where new Sector=%d \n",freeMap->NumClear());
if(newNumSectors>NumDirect||freeMap->NumClear()< diffSector)return FALSE; //if disk is full or file size is too big.
//allocate the new sectors and store them into file header
int i;
for(i = numSectors; i<newNumSectors; i++)
{
dataSectors[i] = freeMap->Find();
}
numBytes = newSize;
numSectors = newNumSectors;
return TRUE;
}
WriteBack代码
void
OpenFile::WriteBack()
{
hdr->WriteBack(headSector);
}
调试记录及实验结果:
make命令成功
创建磁盘命令
cp新文件
ap对文件进行加长
同上
同上
使用-d命令
empty文件和small文件大小都在
因为之前写的比较乱,因此重新写了一遍方便整理,对代码进行了重构
实验原理
为什么初始条件下不能增加文件长度
因为在fstest中,append是我们在main中调用的实际对文件进行操作的函数。
在append中我们使用的是openfile的writeat函数
但是write函数会进行一个判断,去看新写入后文件长度是否超过文件头规定的长度,如果超过了就放弃操作
那么我们就需要一步一步来
先去定义一个可以改变文件头记载的文件长度的函数
再重写write 函数,使得可以正常写入,这就是我们做这道题的思路。
添加文件头 header的变更长度的方法
命名为extend(size)
提供扩充文件大小的作用
再在openfile中对writeat进行修改,在写入之前调用一下extend
再去fstest中对writeback和前面打开writeat方法的注释
image.png
image.png
关于writeback方法也是需要实现在openfile里面的,在实验指导书里面已经给出了
调试记录
最坑的错误
openfile.cc
在这里第一个if判断中之前是判断当前文件大小和之后文件大小进行一个比较,需要修改他的判断条件,否则无法进入我们想要的第二个if判断拓展文件大小
被这里坑了很久