nachos 实验5 - 图文
更新时间:2023-10-28 00:16:01 阅读量: 综合文库 文档下载
- nachos推荐度:
- 相关推荐
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 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 -
正在阅读:
nachos 实验5 - 图文10-28
关于皖江烈士陵园建设五年规划09-05
2016年秋季学期新版华东师大版八年级数学上册《利用统计图表传递信息》专题练习题含答案12-14
32葡萄是酸的05-03
捷达CNG系统(Dream XXI)维修手册(电器部分)03-28
克里姆特绘画中的中国艺术元素06-11
有机化学复习(人卫第八版)01-12
山东省青岛市崂山区2021届九年级上学期期末考试语文试题(答案不全)04-30
医院环境管理制度09-21
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 实验
- 图文
- nachos
- 四年级语文下册试卷
- 微生物学题库
- 生物化学-酶(习题附答案)
- 经典商标侵权调查终结报告
- 2018届高考第三次诊断性考试数学试题(文)含答案
- 行程专题提高版
- PY-2220在线PH监测仪说明书新(1)
- 07-11电工基础高考试卷
- 病理学期末考试题
- 南京地铁电客车司机安全管理与思考
- 2015年高三高考(文科)数学复习专题七:概率与统计 - 图文
- 2018年公司年会主持词与颁奖词
- 尔雅期末古代名剧鉴赏答案
- 传统绘画
- 2015年上半年河南省电机装配工:水电自动装置检修工模拟试题
- 2015-2016学年度牛津译林英语六年级下册英语第一次月考试卷(含听力材料)
- (青岛版)小学三年级上册全册科学教案
- 毛邓三考试大题
- 筒仓滑模施工方案
- 资产评估习题集-不含答案