實驗四 擴展文件系統(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

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

發(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é)果:








因為之前寫的比較亂,因此重新寫了一遍方便整理,對代碼進行了重構(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方法的注釋


關(guān)于writeback方法也是需要實現(xiàn)在openfile里面的,在實驗指導書里面已經(jīng)給出了
調(diào)試記錄
最坑的錯誤

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

