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

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

作者: 林木木_f297 | 来源:发表于2019-11-23 19:23 被阅读0次

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/reuhwctx.html