教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

山大操作系统课程设计报告(全套)(2)

来源:网络收集 时间:2026-05-20
导读: 计算机科学与技术学院实验报告:5 实验题目:扩展Nachos的文件系统 日期:2010-11-10 Email: 实验目的: Nachos的文件系统的文件的大小是不可扩展的:文件被创建后,文件的大小就不能再改变。 本次实验的目的即是

计算机科学与技术学院实验报告:5

实验题目:扩展Nachos的文件系统 日期:2010-11-10 Email: 实验目的:

Nachos的文件系统的文件的大小是不可扩展的:文件被创建后,文件的大小就不能再改变。 本次实验的目的即是设计扩展Nachos的文件系统,使得文件的大小是可以被扩展的。 这样就可以实现在一个文件尾部或者中间追加文件。

硬件环境:

软件环境:

Linux操作系统,Nachos操作系统

实验步骤:

1, 了解Nachos文件系统的结构,为一级目录结构,

其中目录结构以及目录的使用记录保存在文件中。使用BitMap来获取空闲的扇区号。 class DirectoryEntry { public: bool inUse; int sector;

// Is this directory entry in use?

// Location on disk to find the

// FileHeader for this file

char name[FileNameMaxLen + 1]; // Text name for file, with +1 for };

这个是DirectoryEntry类,也就是目录项。 Directory::Directory(int size)

// the trailing '\\0'

{

table = new DirectoryEntry[size]; tableSize = size;

for (int i = 0; i < tableSize; i++) table[i].inUse = FALSE; }

这个是目录类,也就是一级目录结构的定义。 bool

Directory::Add(char *name, int newSector) {

if (FindIndex(name) != -1) return FALSE;

for (int i = 0; i < tableSize; i++) if (!table[i].inUse) { table[i].inUse = TRUE;

strncpy(table[i].name, name, FileNameMaxLen); table[i].sector = newSector; return TRUE; }

return FALSE; // no space. Fix when we have extensible files. }

这个是添加一个目录项的方法,当创建一个新文件的时候使用。 bool

FileSystem::Create(char *name, int initialSize)

这个是创建一个新的文件,其中主要工作是新建一个FileHeader, 作为一个目录项中保存的 int sector;

FileHeader,即文件头,中保存了这个文件的大小,所占的扇区的数目, 以及所占用的全部的扇区号。即:

int numBytes; // Number of bytes in the file

int numSectors; // Number of data sectors in the file

int dataSectors[NumDirect]; // Disk sector numbers for each data // block in the file

因此,为了实现对文件的追加工作,首先对FileHeader类里面加入新的方法

bool AppSectors(BitMap *freeMap, int fileSize);,为了改变一个文件的文件头的大小。

2, 实现在一个已有的文件尾部追加新的内容。首先写改变文件头中对文件所在扇区的描述,

由AppSectors来实现;该方法将在OpenFile类的对象执行Append File 时被调用。 对FileHeader类里面加入新的方法

bool AppSectors(BitMap *freeMap, int fileSize);

bool

FileHeader::AppSectors(BitMap *freeMap, int appFileSize) {

//如果要追加的文件大小小于等于0,则直接函数返回

if(appFileSize<=0)return true;

int restFileSize = SectorSize * numSectors - numBytes; /*如果要追加的文件的大小小于一个扇区的文件头可以表示的文件的大小, 则返回成功追加文件,即TRUE,否则返回FALSE*/ if(restFileSize >= appFileSize) {

numBytes += appFileSize; return true; } else {

int needFileSize = appFileSize - restFileSize;

if(freeMap->NumClear()< divRoundUp(needFileSize, SectorSize)) return false;

int i = numSectors;

numBytes += appFileSize;

numSectors += divRoundUp(needFileSize, SectorSize); for( ; i < numSectors; i++)

dataSectors[i] = freeMap -> Find(); return true; }

printf(\} 3,

在openfile.cc文件中,OpenFile类中加入方法,用于追加文件的AppFileSize(int numByte)。 这个方法首先从文件系统中获取空闲的扇区的位试图文件,构造BitMap对象, 传给FileHeader类的对象(也就是这个OpenFile的文件头),

执行AppSectors(BitMap *freeMap, int fileSize)方法,扩大文件的长度。

bool

OpenFile::AppFileSize(int numBytes) {

//fetch the bitmap

OpenFile *freeMapFile= new OpenFile(FreeMapSector); BitMap *freeMap = new BitMap(NumSectors); freeMap->FetchFrom(freeMapFile); //ask for new space

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

printf(\ //write back the bitmap

freeMap->WriteBack(freeMapFile);

delete freeMapFile; delete freeMap; return true; } 4,

在fstest.cc文件中的修改Append方法,也就是在Nachos运行的时候执行命令, 例如:Nachos –x ap ../test/small small

这个方法是Nachos系统中本来就提供好的一个方法,只需要在局部修改一下语句, 就可以正确的运行。

void

Append(char *from, char *to, int half) {

/*fileLength 是计算出来的Linux文件中的文件的大小

fileLengthBefore是指追加之前的Nachos系统的文件的大小 start是文件开始追加的位置 */

FILE *fp;

OpenFile* openFile;

int amountRead, fileLength; char *buffer;

// start position for appending int start;

// Open UNIX file

if ((fp = fopen(from, \

printf(\ return; }

// Figure out length of UNIX file fseek(fp, 0, 2); fileLength = ftell(fp); fseek(fp, 0, 0);

if (fileLength == 0) {

printf(\ return; }

if ( (openFile = fileSystem->Open(to)) == NULL) {

// file \ if (!fileSystem->Create(to, 0)) {

printf(\ fclose(fp); return; } …… 此处隐藏:1520字,全部文档内容请下载后查看。喜欢就下载吧 ……

山大操作系统课程设计报告(全套)(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/598633.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)