山東大學操作系統(tǒng)課程設(shè)計實驗四——文件系統(tǒng)擴充

實驗四 擴展文件系統(tǒng)(lab4)

實驗目的:

擴展Nachos的文件系統(tǒng)。Nachos的文件系統(tǒng)是一個簡單并且能力有限的系統(tǒng),限制之一就是文件的大小是不可擴展的。通過擴展,使得文件的大小是靈活可變的。

實驗環(huán)境:

虛擬機下Ubuntu Linux 16.04 LTS系統(tǒng),nachos-3.4內(nèi)核管理模塊和MIPS CPU軟件模擬模塊,文件系統(tǒng)模塊,代碼在lab4文件夾下面實現(xiàn)。

實驗思路:

第一步

1.創(chuàng)建lab4,并將lab5拷貝進來,再把filesys文件夾下的拷貝進來
2.閱讀源碼,找主要任務(wù)

那我們先開始看文件:

根據(jù)實驗指導書上面講的,disk和synchdisk是文件系統(tǒng)的最底層,負責將指定數(shù)據(jù)寫入指定扇區(qū),在我們的任務(wù)中不需要修改。Bitmap儲存磁盤狀況,Directory儲存文件頭位置,也不需要修改。main.cc和fstest.cc也是完整的調(diào)試文件,不需要修改。
那么本次實驗主要需要改動的就是openfile文件,fileHeader保存了文件的大小、數(shù)據(jù)扇區(qū),所以也要被修改。

openfile

openfile.h

發(fā)現(xiàn)主要是打開文件的讀寫操作之類的

fileheader

.h

發(fā)現(xiàn)在這里對文件的長度有了定義,那么想要自由改變文件長度就要在這里修改

第二步 開始操作

1.添加文件長度拓展的接口,名命名為extend
2.在openfile內(nèi)添加可以返回文件頭位置的方法
3makefile修改


makefile.local

makefile

4.fstest修改
按照實驗指導,在Append方法和NAppend方法中去掉openfile->WriteBack()一句的注釋。

關(guān)鍵源代碼注釋以及程序說明:

長度拓展接口代碼:

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);
}

調(diào)試記錄及實驗結(jié)果:


make命令成功

創(chuàng)建磁盤命令

cp新文件

ap對文件進行加長

同上

同上

使用-d命令

empty文件和small文件大小都在

因為之前寫的比較亂,因此重新寫了一遍方便整理,對代碼進行了重構(gòu)

實驗原理

為什么初始條件下不能增加文件長度

因為在fstest中,append是我們在main中調(diào)用的實際對文件進行操作的函數(shù)。
在append中我們使用的是openfile的writeat函數(shù)
但是write函數(shù)會進行一個判斷,去看新寫入后文件長度是否超過文件頭規(guī)定的長度,如果超過了就放棄操作
那么我們就需要一步一步來
先去定義一個可以改變文件頭記載的文件長度的函數(shù)
再重寫write 函數(shù),使得可以正常寫入,這就是我們做這道題的思路。

添加文件頭 header的變更長度的方法

命名為extend(size)
提供擴充文件大小的作用
再在openfile中對writeat進行修改,在寫入之前調(diào)用一下extend
再去fstest中對writeback和前面打開writeat方法的注釋


image.png

image.png

關(guān)于writeback方法也是需要實現(xiàn)在openfile里面的,在實驗指導書里面已經(jīng)給出了

調(diào)試記錄

最坑的錯誤


openfile.cc

在這里第一個if判斷中之前是判斷當前文件大小和之后文件大小進行一個比較,需要修改他的判斷條件,否則無法進入我們想要的第二個if判斷拓展文件大小
被這里坑了很久

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容