山大操作系统课程设计报告(全套)(2)
计算机科学与技术学院实验报告: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [学前教育]MC9S12XS256RMV1 xs128芯片手册4
- [学前教育]安东尼语录经典语录
- [学前教育]e级gps控制测量技术设计书
- [学前教育]苏教版2022-2022学年八年级下学期期末
- [学前教育]装修公司推广 营销
- [学前教育]家政服务合同(完整版)
- [学前教育]湖北省2016届高三联考语文试题
- [学前教育]爱立信无涯学习系统LTE题库1-LTE基础知
- [学前教育]揭秘大众柴油车作弊软件原理
- [学前教育]人才流失原因及对策分析
- [学前教育]房屋建筑施工工程劳务分包合同
- [学前教育]国际贸易实务试卷A卷09.6
- [学前教育]校园废品回收活动计划方案书范文格
- [学前教育]电大成本会计试题及答案
- [学前教育]大学物理实验 华南理工出版社 绪论答案
- [学前教育]爱丁堡产后抑郁量表
- [学前教育]液压冲击的危害、产生原因与防止方法(
- [学前教育]学生工作总结高一学生期中考试总结_020
- [学前教育]人民医院医疗废物管理规章制度大全
- [学前教育]阳光维生素的巨大抗癌潜能阅读题答案.d
- 马云在云锋基金江苏论坛闭幕式的发言
- 试论小学体育教育中的心理健康教育-教
- 语文A版一年级下册《语文乐园一》教学
- 2021四川大学物理化学考研真题经验参考
- [人教A版]2015-2016学年高中数学 第二
- 终端网点销售返利协议书
- 江苏省2015年眼科学主治医师青光眼考试
- 2017年部编人教版八年级语文上册教案
- 十一中学七年级英语上册Unit7Howmuchar
- 以赛促教的创新性实验教学机制建设实践
- 平凉市崆峒区2015七年级下生物期末试题
- 琶洲(地块五)A、B塔楼1、2#塔吊基础
- 一级医院工作制度与人员岗位职责
- 2018北京西城区高三二模理科数学试题及
- 炒股密码线技术 - 图文
- 职高学生生涯发展辅导教案
- 语文人教版四年级上册8 世界地图引出的
- 最新最新人教版二年级上册全册数学教案
- 2017高考英语全国2卷精彩试题(有问题
- 普通心理学笔记




