nachos 实验5 - 图文

更新时间:2023-10-28 00:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Lab5 - Extendable Files Lab5 Extendable Files

实验目标

Nachos的文件系统是一个简单并且能力有限的系统,限制之一就是文件的大小是不可扩展的:一旦我们在创建一个文件时规定了它的大小,文件的大小就不能再改变。本次实验的目的即是设计扩展Nachos的文件系统,使得文件的大小是可以被扩展的。完成以下要求:

当一个文件被创建的时候,它的初始大小可以为0。

如果更多的数据被写入到一个文件中,它的大小可以随之增加。 实验环境 ubuntu操作系统 关键源代码及注释

Nachos的文件系统主要包含Disk, SynchDisk, BitMap, FileHeader, OpenFile, Directory, FileSystem这几个类。其中,Disk, SynchDisk, BitMap, Directory, FileSystem是文件系统的底层类,里面描述了Nachos的文件系统的基本文件信息以及和磁盘操作的结合。FileSystem中描述的是文件的创建、打开、删除等操作。FileHeader定义操作是文件头的初始化、为数据在磁盘上分配空间、磁盘上文件的读取和写回。OpenFile 中主要涉及文件的读、写、读写指针的重定位等操作。

根据filesys.cc中的create函数,可以看到,在创建文件时,需要给定该文件初始大小。再看openfile里的ReadAt和WriteAt函数,如果要读出或者要写入的字节数太多,文件系统就会自动将多出来的部分舍弃掉。

if ((position + numBytes) > fileLength)

numBytes = fileLength - position;

如果文件的大小(fileLength)一直不变,那么必然无法实现文件的扩展。

Directory为文件的索引,存放DirectoryEntry,DirectoryEntry给出了文件的名字,以及在磁盘上的位置,Fig.1为未进行任何操作时Directory中各个DirectoryEntry存放的内容。

Bitmap 头 directory头 Bitmap内容 文件头指针信息 文件头指针信息 nachos-3.4 gcc-2.8.1-mips编译器

Fig. 1 Directory 的各个entry内容示意图

再看FileSystem的各个函数。 create:

- 6 -

Lab5 - Extendable Files 当一个文件被创建时,Directory会根据1号DirectoryEntry里的内容(0号为BitMap的索引),找到空闲的扇区,然后为文件头分配扇区,接下来,在磁盘上为分配空间,最后将索引,BitMap,以及磁盘更新。 Open:

当打开一个文件时,Directory会根据文件名找到该文件的文件头所在的扇区,然后返回一个openfile。

所以,如果要扩展文件系统,可以先改变文件的大小(原文件大小+追加文件的大小),算出需要多分配的磁盘,然后找到该文件的文件头所在的扇区,为该文件重新分配空间,将追加的内容写入磁盘,最后更新文件头和索引块中的信息。

在fileheader里增加AppendSector方法: //根据要追加的文件的大小来分配要追加的sector bool

FileHeader::AppendSector(BitMap *bitMap, int fileSize) {

int totalLength=numSectors*SectorSize; int restLength=totalLength-numBytes; if(restLength

int appendLength=fileSize-restLength;

int appendSectors = divRoundUp(appendLength, SectorSize); if (bitMap->NumClear() < appendSectors)

return FALSE;

// not enough space

numBytes=numBytes+fileSize;

numSectors=numSectors+appendSectors;

for(int i=numSectors-appendSectors;i Find(); return true; }

else{//最后一个扇区未写满且要追加的大小小于余下的扇区 numBytes=numBytes+fileSize; return true; } }

在openfile里增加AppendSize和WriteBack方法 //给追加的文件分配扇区

- 7 -

Lab5 - Extendable Files bool

OpenFile:: AppendSize(int numBytes) {

//计算需要多少扇区

/*int firstSector, lastSector, numSectors;

firstSector = divRoundDown(seekPosition, SectorSize);

lastSector = divRoundDown(seekPosition + numBytes - 1, SectorSize); numSectors = 1 + lastSector - firstSector;*/

OpenFile *newFile= new OpenFile(0);//第0块指向存放bitmap的sector BitMap *freeMap = new BitMap(NumSectors); freeMap->FetchFrom(newFile);

if(!(hdr->AppendSector(freeMap, numBytes))) return false;

freeMap->WriteBack(newFile); delete newFile; delete freeMap; return true; }

WriteBack方法: void

OpenFile::WriteBack(char *name) {

OpenFile *file = new OpenFile(1);//第一块指向存放filehdr索引的sector Directory *directory = new Directory(10);//directory里共有10块sector directory->FetchFrom(file);

//把文件的内容重新写入sector

int sector = directory ->Find(name); hdr->WriteBack(sector); delete file; delete directory; }

修改fstest里的Append方法: 修改部分:

ASSERT(openFile != NULL);

- 8 -

Lab5 - Extendable Files // append from position \ start = openFile->Length(); if (half) start = start / 2; openFile->Seek(start);

if(!(openFile->AppendSize(fileLength))) {

printf(\ return; }

// Append the data in TransferSize chunks buffer = new char[TransferSize];

while ((amountRead = fread(buffer, sizeof(char), TransferSize, fp)) > 0) {

int result;

printf(\ amountRead %d, \result = openFile->WriteAt(buffer, amountRead, start); result = openFile->Write(buffer, amountRead); printf(\//ASSERT(result == amountRead); start += amountRead; // }

// Write the inode back to the disk, because we have changed it openFile->WriteBack(to);

ASSERT(start == openFile->Length());

调试记录

本次实验需要改动的地方较多,采用分步调试的方法,一部分一部分的进行修改和

调试,最终实现文件拓展功能。 运行分析

进入lab5目录,在终端输入make 编译后./nachos –f 生成磁盘 输入./nachos –D 查看磁盘内容

- 9 -

Lab5 - Extendable Files

Fig. 2 生成的磁盘内容示意图

由Fig.2 可知Directory的前五个已经被占用,与Fig.1 相对应,从bitmap和dirctory的content中可以看出,0号为bitmap头、1号为directory头,bitmap占用2号存储单元存储具体内容,dirctory占用3、4号存储文件头指针信息,这与程序中的定义是一样的,从5号开始放追加的内容。。

输入 ./nachos –cp test/small small 将linux中的文件small拷贝到nachos 系统中。./nachos –D 查看磁盘内容,如图Fig.3所示。

- 10 -

Lab5 - Extendable Files

Fig. 3 文件拷贝结果示意图

输入 ./nachos –ap test/big small 将linux文件big拷贝到small 文件中,为了检验文件的长度是否扩展,需要查看磁盘内容。

输入./nachos –D 结果如图Fig.4所示。

- 11 -

Lab5 - Extendable Files

Fig. 4 文件长度扩展示意图

输入 ./nachos –l 查看文件列表,如图Fig.5 所示,文件系统中只有一个文件small,从Fig.4中可以看出small 文件中的内容得到了扩展,从而实现了文件内容扩展的功能。

Fig. 5 查看文件列表

结论与体会

本次实验的要求是对nachos的文件系统进行升级,以完成文件长度的扩展功能。在

实际做实验的过程中遇到了诸多问题,包括对文件系统的理解、对源代码的查看以及修

- 12 -

Lab5 - Extendable Files 改过程等等。通过本次实验,对nachos文件系统的实现有了大致的了解。理解了位矢图、目录和文件头的作用,以及他们之间的联系。对如何实现一个文件系统有了肤浅的认识。

本次实验虽然实现了文件的长度扩展,但还是有限的扩展。因为当前的nachos只支持一级索引,要想真正实现拓展还需对文件的Fileheader进行修改,以拓展文件允许的长度。

- 13 -

本文来源:https://www.bwwdw.com/article/0hq2.html

Top