操作系统课程设计文件系统的模拟设计.docx
- 文档编号:6876784
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:15
- 大小:239.49KB
操作系统课程设计文件系统的模拟设计.docx
《操作系统课程设计文件系统的模拟设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统的模拟设计.docx(15页珍藏版)》请在冰点文库上搜索。
操作系统课程设计文件系统的模拟设计
操作系统课程设计报告
题目:
文件系统的模拟设计
一、设计目的
本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计内容
(1)概述
为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:
1.可以实现下列几条命令:
login用户登录
dir列目录
create创建文件
delete删除文件
open打开文件
close关闭文件
read读文件
write写文件
cd进出目录
2.列目录时要列出文件名,物理地址,保护码和文件长度
3.源文件可以进行读写保护
(2)设计原理和系统总体功能框架图
1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、对文件或目录的操作采用windows系统的API函数来实现。
6、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:
用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。
功能结构图如图1.0所示:
(3)详细设计及少数重要编码的说明
这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。
1、显示列表函数和目录
流程图如图1.1所示
2、文件创建函数
算法:
查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
将文件内容写入inode空间和block空间。
修改当前目录的结构,修改inode位图,block位图,写入模拟硬盘。
详细过程如流程图1.2所示:
③、打开文件函数
对文件进行关闭操作,若此时文件不存在或处于读状态或写状态,则返回关闭失败信息;若此时文件处于空闲状态,则调用Close函数进行关闭操作。
流程图如图1.3所示:
④、关闭文件系统函数
对文件进行打开操作,若此时文件不存在或已处于打开状态或读状态或写状态,则返回打开失败信息;若此时文件处于空闲状态,则调用Open函数进行打开操作。
流程图如图1.4所示:
(4)运行结果分析
程序结果如图1.5-1.7所示
图1.5
图1.6
图1.7
(5)设计小结
操作系统课程设计是本课程重要的实践教学环节。
课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。
与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。
对于本次操作系统课程设,由于Linux比较陌生,刚起步阶段花了很大时间去查阅各种资料。
当完成设计时,感觉掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识。
对二级文件系统也有了很好的了解,熟练C语言布局的使用,如何解决实现里面功能的各种问题。
(6)参考文献
[1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月
[2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月
[3]计算机操作系统教程(第3版)习题解答与实验指导,张尧学,清华大学出版社,2006年11月
(7)附源代码
12、显示列表函数dir()和目录创建函数mkdir()等(文件名dir.c)
#include"stdio.h"
#include"string.h"
#include"filesys.h"
_dir()/*dir*/
{unsignedintdi_mode;
inti,j,one;
structinode*temp_inode;
printf("\nCURRENTDIRECTORY:
\n");
for(i=0;i {if(! (strcmp(dir.direct[i].d_name,""))&&(dir.direct[i].d_ino==0)) {dir.size=i;break;}} for(i=0;i {if(dir.direct[i].d_ino! =DIEMPTY) {printf("%14s,dir.direct[%d].d_ino=%d,属性: ",dir.direct[i].d_name,i,dir.direct[i].d_ino); temp_inode=iget(dir.direct[i].d_ino); di_mode=temp_inode->di_mode; for(j=0;j<12;j++) {one=di_mode%2; di_mode=di_mode/2; if(one) printf("x"); else printf("-");} if(temp_inode->di_mode&DIFILE) {printf("%dbytes\n",temp_inode->di_size); printf("blockchainofthefile: "); for(j=0;j printf("%d--",temp_inode->di_addr[j]); printf("end\n");} else printf("
iput(temp_inode);}
}}
mkdir(dirname)/*mkdir*/
char*dirname;
{intdirid,dirpos;
structinode*inode;
structdirectbuf[BLOCKSIZ/(DIRSIZ+2)];
unsignedintblock;
memset(buf,0,(BLOCKSIZ/(DIRSIZ+2))*sizeof(structdirect));
dirid=namei(dirname);
if(dirid!
=NULL)
{inode=iget(dirid);
if(inode->di_mode&DIDIR)
printf("\ndirectoryalreadyexisted!
!
\n");
else
printf("\n%sisafilename,&can'tcreatadirthesamename",dirname);
iput(inode);
return;}
dirpos=iname(dirname);
inode=ialloc();
//inode->i_ino=dirid;
dir.direct[dirpos].d_ino=inode->i_ino;
dir.size++;
/*fillthenewdirbuf*/
strcpy(buf[0].d_name,".");
buf[0].d_ino=inode->i_ino;
strcpy(buf[1].d_name,"..");
buf[1].d_ino=cur_path_inode->i_ino;
block=balloc();
fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
fwrite(buf,1,BLOCKSIZ,fd);
inode->di_size=2*sizeof(structdirect);
inode->di_number=1;
inode->di_mode=user[user_id].u_default_mode;
inode->di_uid=user[user_id].u_uid|DIDIR;
inode->di_gid=user[user_id].u_gid;
inode->di_addr[0]=block;
iput(inode);
return;}
chdir(dirname)/*chdir*/
char*dirname;
{unsignedintdirid;
structinode*inode;
unsignedshortblock;
inti,j,low=0,high=0;
dirid=namei(dirname);
if(dirid==NULL)
{printf("\n%sdoesnotexisted\n",dirname);
return;}
inode=iget(dir.direct[dirid].d_ino);
if(!
access(user_id,inode,user[user_id].u_default_mode))
{printf("\nThedirectory%s,Permissiondeny",dirname);
iput(inode);
return;}
/*packthecurrentdirectory
for(i=0;i
{for(;j {printf("\nInchdir(%s),j=%d",dirname,j); if(dir.direct[j].d_ino==0)break;} printf("\nInchdir(%s),j2=%d",dirname,j); memcpy(&dir.direct[i],&dir.direct[j],DIRSIZ+2); dir.direct[j].d_ino=0; } */ /*writebackthecurrentdirectory*/ //for(i=0;i //bfree(cur_path_inode->di_addr[i]); for(i=0;i {if(i>0) {block=balloc(); cur_path_inode->di_addr[i]=block; fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET); fwrite(&dir.direct[i],1,BLOCKSIZ,fd);} else {fseek(fd,DATASTART+cur_path_inode->di_addr[0]*BLOCKSIZ,SEEK_SET); fwrite(&dir.direct[0],1,BLOCKSIZ,fd);}} cur_path_inode->di_size=dir.size*(sizeof(structdirect)); iput(cur_path_inode); cur_path_inode=inode; /*readthechangedirfromdisk*/ j=0; for(i=0;i {fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET); fread(&dir.direct[j],1,BLOCKSIZ,fd); j+=BLOCKSIZ/(DIRSIZ+2);} return;} 13、文件创建函数creat()(文件名creat.c) #include"stdio.h" #include"filesys.h" creat(user_id,filename,mode) unsignedintuser_id; char*filename; unsignedshortmode; {unsignedintdi_ith,di_ino; structinode*inode; inti,j,k,user_p; for(user_p=0;user_p if(user[user_p].u_uid==user_id) {k=user_p; break;} di_ino=namei(filename); if(di_ino! =NULL)/*alreadyexisted*/ {inode=iget(di_ino); if(access(user_id,inode,mode)==0) {iput(inode); printf("\ncreataccessnotallowed\n"); return;} /*freealltheblockoftheoldfile*/ for(i=0;i bfree(inode->di_addr[i]); /*todo: addcodeheretoupdatethepointerofthesys_file*/ for(i=0;i if(sys_ofile[i].f_inode==inode) sys_ofile[i].f_off=0; for(i=0;i if(user[k].u_ofile[i]=SYSOPENFILE+1) {user[k].u_uid=inode->di_uid; user[k].u_gid=inode->di_gid; for(j=0;j if(sys_ofile[j].f_count=0) {user[k].u_ofile[i]=j; sys_ofile[j].f_flag=mode;} returni;}} else/*notexistedbefore*/ {inode=ialloc(); di_ith=iname(filename); dir.size++; dir.direct[di_ith].d_ino=inode->i_ino; inode->di_mode=user[k].u_default_mode|DIFILE; inode->di_uid=user[k].u_uid; inode->di_gid=user[k].u_gid; inode->di_addr[0]=balloc(); inode->di_size=0; inode->di_number=1; for(i=0;i if(sys_ofile[i].f_count==0) break; for(j=0;j if(user[k].u_ofile[j]==SYSOPENFILE+1) break; user[k].u_ofile[j]=i; sys_ofile[i].f_flag=mode; sys_ofile[i].f_count=0; sys_ofile[i].f_off=0; sys_ofile[i].f_inode=inode; returnj;}} 14、打开文件函数open()(文件名open.c) #include"stdio.h" #include"filesys.h" unsignedshortopen(user_id,filename,openmode) intuser_id; char*filename; unsignedshortopenmode; {unsignedintdirid; structinode*inode; inti,j,k; dirid=namei(filename); if(dirid==NULL)/*nosuchfile*/ {printf("\nfiledoesnotexisted! ! ! \n"); returnNULL;} inode=iget(dir.direct[dirid].d_ino); if(! access(user_id,inode,openmode))/*accessdenied*/ {printf("\nfileopenhasnotaccess! ! ! "); iput(inode); returnNULL;} /*allocthesys_ofileitem*/ for(i=1;i if(sys_ofile[i].f_count==0)break; if(i==SYSOPENFILE) {printf("\nsystemopenfiletoomuch\n"); iput(inode); returnNULL;} sys_ofile[i].f_inode=inode; sys_ofile[i].f_flag=openmode; sys_ofile[i].f_count=1; if(openmode&FAPPEND) sys_ofile[i].f_off=inode->di_size; else sys_ofile[i].f_off=0; /*alloctheuseropenfileitem*/ for(j=0;j if(user[j].u_uid==user_id) {k=j;break;} for(j=0;j if(user[k].u_ofile[j]==SYSOPENFILE+1)break; if(j==NOFILE) {printf("\nuseropenfiletoomuch! ! ! \n"); sys_ofile[i].f_count=0; iput(inode); returnNULL;} user[k].u_ofile[j]=i;//记录用户打开的文件在sys_ofile[]中的位置 /*ifAPPEND,freetheblockofthefilebefore*/ if(openmode&FAPPEND) {for(i=0;i bfree(inode->di_addr[i]); inode->di_size=0;} returnj;} 15、关闭文件函数close()(文件名close.c) #include"stdio.h" #include"filesys.h" close(user_id,cfd)/*close*/ unsignedintuser_id; unsignedshortcfd; {structinode*inode; intj,k; for(j=0;j if(user[j].u_uid==user_id) { k=j; break;} inode=sys_ofile[user[k].u_ofile[cfd]].f_inode; iput(inode); sys_ofile[user[k].u_ofile[cfd]].f_count--; user[k].u_ofile[cfd]=SYSOPENFILE+1;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 文件系统 模拟 设计