操作系统课程设计文件系统的实现.docx
《操作系统课程设计文件系统的实现.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统的实现.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统课程设计文件系统的实现
课程设计报告
(20--20年度第学期)
课程名称:
操作系统实验
课设题目:
文件系统的实现
院系:
控制与计算机工程学院
班级:
姓名:
指导教师:
设计周数:
一周
成绩:
20年月日
设计报告内容
1、需求分析
用C或C++编写和调试一个文件系统,功能使用命令行的方式实现。
模拟文件管理的工作过程。
加深理解文件系统的内部功能和内部实现。
用内存模拟磁盘用结构体数组描述个不同的磁盘区域。
磁盘的存取单元是磁盘块,一个盘块的大小是64字节。
每个目录项16个字节,目录项下只允许建立4个子目录或者文件。
i-node位图1块64个字节,共512位,可以描述512个i-node的使用情况。
i-node的长度是16字节。
文件超过两个盘块会用到一级索引。
每个以及索引盘块(64字节)可以包含16个盘块号。
文件包含目录文件和文本文件。
实现Format,Mkfile,Mkdir,Cd,Delfile,Deldir,Dir,Copy,Open,Viewinodebitmap,Viewblockbitmap等功能。
二、整体功能及设计(功能划分及流程图)
1、数据结构:
structDirectoryEntry{//目录项
charname[8];//文件或目录名
intdirid;//目录标志(0为文件,1为目录)
intinodenumber;//i-node编号
};
structDirectoryEntryInBlock{
DirectoryEntryde[4];//每个目录项大小为16字节,64字节空间最多可以存储4个目录项
intnum;//磁盘块存储的目录项数目
};
structindexaddressstruct{
intindexaddress[16];//每个索引块大小为4字节,64字节空间最多可以存储16个索引块号
intnum;//索引块存储的索引数目
};
unionBlock{//单个盘块64个字节大小可以存储文件内容或者存储目录项或者存储索引块号
charspace[64];//空间大小为64个字节用于存储文件内容
DirectoryEntryInBlockdeib;
indexaddressstructias;
};
structinodeStruct{//i-node结构
intblockamount;//盘块数
intdirectblockaddress1,directblockaddress2;//直接盘块地址*2
intstairindexaddress;//一级索引地址
};
structDiskBlock{//磁盘布局
DirectoryEntryrootdirectory[4];//根目录,最多4个目录项
charinodebitmap[512];//512个i-node状态
charblockbitmap[1024];//1024个磁盘块状态
inodeStructinode[512];//512个i-node存储区
Blockdatablock[1024];//数据块存储区
};
staticDiskBlockdb;//全局磁盘变量
introotdirectoryamount;//用于记录根目录的使用数目,最大为4
intinodeamount;//用于记录i-node的使用数目,最大为512
intdatablockamount;//用于记录数据块的使用数目,最大为1024
intspaceamount;//用于记录数据块中64位字节的使用数目,最大为64
DirectoryEntryfilelist[500];//用于记录文件方便遍历检索
DirectoryEntrydirectorylist[500];//用于记录目录方便
intfileamount;//用于记录文件数目
intdirectoryamount;//用于记录目录的数目
charlocalposition[8];//用于记录当前位置
2、文件系统相关图
(1)文件系统简单结构图如图1所示。
图1文件系统简单结构图
(2)磁盘构成示意图如图2所示
图2磁盘构成示意图
(3)文件构成图如图3所示。
文件或目录名
目录标志
I-node编号
图3文件构成图
(4)I-node构成图如图4所示。
图4I-node构成图
三、编程实现:
(主要功能代码及解释)
voidFormat(){//初始化
inti,j;
for(i=0;i<4;i++){
memset(db.rootdirectory[i].name,0,8);//给文件或目录名初始化
db.rootdirectory[i].dirid=-1;
db.rootdirectory[i].inodenumber=-1;
}
for(i=0;i<512;i++){
db.inodebitmap[i]=0;
db.inode[i].blockamount=0;
db.inode[i].directblockaddress1=-1;
db.inode[i].directblockaddress2=-1;
db.inode[i].stairindexaddress=-1;
}
for(i=0;i<1024;i++)
{
db.blockbitmap[i]=0;
memset(db.datablock[i].space,0,64);//给单个盘块的64字节空间初始化
db.datablock[i].deib.num=0;
db.datablock[i].ias.num=0;
for(j=0;j<4;j++)
db.datablock[i].deib.de[j].inodenumber=-1;
for(j=0;j<4;j++)
db.datablock[i].ias.indexaddress[j]=-1;
}
for(i=0;i<500;i++){
memset(filelist[i].name,0,8);
filelist[i].dirid=-1;
filelist[i].inodenumber=-1;
memset(directorylist[i].name,0,8);
directorylist[i].dirid=-1;
directorylist[i].inodenumber=-1;
}
rootdirectoryamount=0;
inodeamount=0;
datablockamount=0;
spaceamount=0;
fileamount=0;
directoryamount=0;
strcpy(localposition,"Root");
}
voidMkfile(){//创建文件
charfilename[8],path[10];
printf("文件名称:
");
scanf("%s",filename);
printf("文件路径:
");
scanf("%s",path);
if(strcmp(path,"Root")==0){
if(rootdirectoryamount<4){
strcpy(db.rootdirectory[rootdirectoryamount].name,filename);
db.rootdirectory[rootdirectoryamount].dirid=0;
db.rootdirectory[rootdirectoryamount].inodenumber=inodeamount;
db.inode[inodeamount].blockamount=1;
db.inode[inodeamount].directblockaddress1=datablockamount;
db.inodebitmap[inodeamount]=1;
db.blockbitmap[datablockamount]=1;
filelist[fileamount]=db.rootdirectory[rootdirectoryamount];
rootdirectoryamount++;
inodeamount++;
datablockamount++;
fileamount++;
printf("文件创建成功\n");
}
else
printf("创建失败,根目录已满\n");
}
else{
for(inti=0;iif(strcmp(path,directorylist[i].name)==0){
inttnum=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num;
if(tnum>4){
printf("创建失败,该目录已满\n");
break;
}
else{strcpy(db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].name,filename);db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].dirid=0;
db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].inodenumber=inodeamount;
db.inode[inodeamount].blockamount=1;
db.inode[inodeamount].directblockaddress1=datablockamount;
db.inodebitmap[inodeamount]=1;
db.blockbitmap[datablockamount]=1;
filelist[fileamount]=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum];
inodeamount++;
datablockamount++;
fileamount++;
db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num++;
printf("文件创建成功\n");
break;
}
}
}
if(i>=directoryamount)
printf("创建失败,路径有误\n");
}
}
voidMkdir(){//创建目录
chardirectoryname[8],path[10];
printf("目录名称:
");
scanf("%s",directoryname);
printf("目录路径:
");
scanf("%s",path);
if(strcmp(path,"Root")==0){
if(rootdirectoryamount<4){
strcpy(db.rootdirectory[rootdirectoryamount].name,directoryname);
db.rootdirectory[rootdirectoryamount].dirid=1;
db.rootdirectory[rootdirectoryamount].inodenumber=inodeamount;
db.inode[inodeamount].blockamount=1;
db.inode[inodeamount].directblockaddress1=datablockamount;
db.inodebitmap[inodeamount]=1;
db.blockbitmap[datablockamount]=1;
directorylist[directoryamount]=db.rootdirectory[rootdirectoryamount];
rootdirectoryamount++;
inodeamount++;
datablockamount++;
directoryamount++;
printf("目录创建成功\n");
}
else
printf("创建失败,根目录已满\n");
}
else{
for(inti=0;iif(strcmp(path,directorylist[i].name)==0){
inttnum=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num;
if(tnum>4){
printf("创建失败,该目录已满\n");
break;
}
else{
strcpy(db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].name,directoryname);
db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].dirid=1;
db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum].inodenumber=inodeamount;
db.inode[inodeamount].blockamount=1;
db.inode[inodeamount].directblockaddress1=datablockamount;
db.inodebitmap[inodeamount]=1;
db.blockbitmap[datablockamount]=1;
directorylist[directoryamount]=db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.de[tnum];
inodeamount++;
datablockamount++;
directoryamount++;
db.datablock[db.inode[directorylist[i].inodenumber].directblockaddress1].deib.num++;
printf("目录创建成功\n");
break;
}
}
}
if(i>=directoryamount)
printf("创建失败,路径有误\n");
}
}
voidCd(){//更改当前目录项
printf("请输入当前目录为:
");
scanf("%s",localposition);
printf("当前目录位置修改成功\n");
}
voidDelfile(){//删除文件
charfilename[8];
inti,j,k,flag;
printf("请输入要删除的文件的名称:
");
scanf("%s",filename);
for(k=0;kif(strcmp(db.rootdirectory[k].name,filename)==0){
memset(db.rootdirectory[k].name,0,8);
db.rootdirectory[k].dirid=-1;
db.rootdirectory[k].inodenumber=-1;
break;
}
}
for(k=0;kfor(j=0;jif(strcmp(db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].name,filename)==0){
memset(db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].name,0,8);
db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].dirid=-1;
db.datablock[db.inode[directorylist[k].inodenumber].directblockaddress1].deib.de[j].inodenumber=-1;
break;
}
}
}
for(i=0;iif(strcmp(filename,filelist[i].name)==0){
flag=i;
if(db.inode[filelist[i].inodenumber].blockamount==1){
memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress1].space,0,64);
db.inode[filelist[i].inodenumber].blockamount=0;
db.inodebitmap[filelist[i].inodenumber]=0;
db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress1]=0;
db.inode[filelist[i].inodenumber].directblockaddress1=-1;
printf("文件删除成功\n");
break;
}
elseif(db.inode[filelist[i].inodenumber].blockamount==2){
memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress1].space,0,64);
memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress2].space,0,64);
db.inode[filelist[i].inodenumber].blockamount=0;
db.inodebitmap[filelist[i].inodenumber]=0;
db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress1]=0;
db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress2]=0;
db.inode[filelist[i].inodenumber].directblockaddress1=-1;
db.inode[filelist[i].inodenumber].directblockaddress2=-1;
printf("文件删除成功\n");
break;
}
else{
inttemp=db.inode[filelist[i].inodenumber].blockamount-2;
memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress1].space,0,64);
memset(db.datablock[db.inode[filelist[i].inodenumber].directblockaddress2].space,0,64);
db.inode[filelist[i].inodenumber].blockamount=0;
db.inodebitmap[filelist[i].inodenumber]=0;
db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress1]=0;
db.blockbitmap[db.inode[filelist[i].inodenumber].directblockaddress2]=0;
db.blockbitmap[db.inode[filelist[i].inodenumber].stairindexaddress]=0;
db.inode[filelist[i].inodenumber].directblockaddress1=-1;
db.inode[filelist[i].inodenumber].directblockaddress2=-1;
for(intj=0;jinttemp1=db.data