山东大学操作系统课程设计实验四——文件系统扩充

2019-11-23  本文已影响0人  林木木_f297

实验四 扩展文件系统(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判断拓展文件大小
被这里坑了很久

上一篇下一篇

猜你喜欢

热点阅读