操作系统课程设计文件系统的模拟设计.doc

上传人:仙人指路1688 文档编号:4079701 上传时间:2023-04-03 格式:DOC 页数:16 大小:194KB
返回 下载 相关 举报
操作系统课程设计文件系统的模拟设计.doc_第1页
第1页 / 共16页
操作系统课程设计文件系统的模拟设计.doc_第2页
第2页 / 共16页
操作系统课程设计文件系统的模拟设计.doc_第3页
第3页 / 共16页
操作系统课程设计文件系统的模拟设计.doc_第4页
第4页 / 共16页
操作系统课程设计文件系统的模拟设计.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《操作系统课程设计文件系统的模拟设计.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计文件系统的模拟设计.doc(16页珍藏版)》请在三一办公上搜索。

1、操作系统课程设计报告题 目: 文件系统的模拟设计 一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。二、设计内容(1)概述为Linux系统设计一个简单的二级文件系统。要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2列目录时要列出文件名,物理地址,保护码和文件长度3源文件可以进行读写保护(2)设计原理

2、和系统总体功能框架图1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。2、文件物理结构可采用显式链接或其他方法。3、磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。5、对文件或目录的操作采用windows系统的API函数来实现。6、设计一个较实用的用户界面,方便用户使用。要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、

3、写文件、复制文件、移动文件、返回根目录、退出。功能结构图如图1.0所示:开始 format列目录选择操作退出 停止 登录改变目录创建文件创建目录t写文件关闭文件删除文件e打开文件ne 结束图1.0安装(3)详细设计及少数重要编码的说明这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。、 显示列表函数和目录 流程图如图1.1所示模拟文件系统创建目录删除目录创建文件删除文件读文件写文件复制文件移动文件返回根目录图1.1、 文件创建函数算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以#结束。申请inode空间(

4、ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改inode位图,block位图,写入模拟硬盘。详细过程如流程图1.2所示:开始k=1或k=2创建文件夹创建文件有同名文件夹有同名文件返回创建失败信息当前目录为空返回创建失败信息把节点连接到该目录下把节点连接到该目录下的最后一个子节点之后创建成功结束12Y N N Y Y N 图1.2、打开文件函数 对文件进行关闭操作,若此时文件不存在或处于读状态或写状态,则返回关闭失败信息;若此时文件处于空闲状态,则调用Close函数进行关闭操作。流程图如图1.

5、3所示: 开始打开文件文件是否存在?是文件存在则调用OpenFile函数打开文件文件不存在则返回错误信息显示文件内容结束图1.3 、关闭文件系统函数 对文件进行打开操作,若此时文件不存在或已处于打开状态或读状态或写状态,则返回打开失败信息;若此时文件处于空闲状态,则调用Open函数进行打开操作。流程图如图1.4所示:开始打开文件文件是否存在?是文件存在则调用CloseFile函数关闭开文件文件不存在则返回错误信息结束图1.4(4)运行结果分析 程序结果如图1.5-1.7所示 图1.5 图1.6 图1.7(5)设计小结操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻

6、地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。对于本次操作系统课程设,由于Linux比较陌生,刚起步阶段花了很大时间去查阅各种资料。当完成设计时,感觉掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识。对二级文件系统也有了很好的了解,熟练C语言布局的使用,如何解决实现里面功能的各种问题。(6)参考文献 1计算机操作系

7、统(第3版),汤小丹,西安电子科技大学出版社,2007年7月2C语言程序设计,孟庆昌,人民邮电出版社,2006年4月3计算机操作系统教程(第3版)习题解答与实验指导,张尧学,清华大学出版社,2006年11月 (7)附源代码 12、显示列表函数dir( )和目录创建函数mkdir( )等(文件名dir.c)#include stdio.h#include string.h#include filesys.h_dir( ) /*dir*/ unsigned int di_mode; int i,j,one; struct inode *temp_inode; printf(nCURRENT DIR

8、ECTORY:n); for(i=0;iDIRNUM;i+) if(!(strcmp(dir.directi.d_name,)&(dir.directi.d_ino=0) dir.size = i;break; for(i=0;idi_mode; for(j=0;jdi_mode & DIFILE) printf( %d bytesn,temp_inode-di_size); printf(block chain of the file:); for(j=0;jdi_size/BLOCKSIZ+1;j+) printf(%d-,temp_inode-di_addrj); printf(endn

9、); else printf(n);iput(temp_inode); mkdir(dirname) /*mkdir*/char *dirname; int dirid,dirpos; struct inode *inode; struct direct bufBLOCKSIZ/(DIRSIZ+2); unsigned int block; memset(buf,0,(BLOCKSIZ/(DIRSIZ+2)*sizeof(struct direct); dirid=namei(dirname); if(dirid!=NULL) inode=iget(dirid); if (inode-di_m

10、ode&DIDIR) printf(n directory already existed!n); else printf(n%s is a file name,&cant creat a dir the same name,dirname); iput(inode); return;dirpos=iname(dirname);inode=ialloc( );/ inode-i_ino=dirid;dir.directdirpos.d_ino=inode-i_ino;dir.size+;/* fill the new dir buf*/strcpy(buf0.d_name,.);buf0.d_

11、ino=inode-i_ino;strcpy(buf1.d_name,.);buf1.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(struct direct);inode-di_number=1;inode-di_mode=useruser_id.u_default_mode;inode-di_uid=useruser_id.u_uid|DIDIR;inode-di_g

12、id=useruser_id.u_gid;inode-di_addr0=block;iput(inode);return;chdir(dirname) /*chdir*/char *dirname; unsigned int dirid; struct inode *inode;unsigned short block;int i,j,low=0,high=0;dirid=namei(dirname);if(dirid=NULL) printf(n %s does not existedn,dirname); return ;inode=iget(dir.directdirid.d_ino);

13、if(!access(user_id,inode,useruser_id.u_default_mode) printf(nThe directory %s ,Permission deny,dirname); iput(inode); return ;/*pack the current directoryfor(i=0;idir.size;i+) for (;jDIRNUM;j+) printf(nIn chdir(%s),j = %d,dirname,j); if (dir.directj.d_ino=0) break; printf(nIn chdir(%s),j2 = %d,dirna

14、me,j); memcpy(&dir.directi,&dir.directj,DIRSIZ+2);dir.directj.d_ino=0;*/* write back the current directory */for(i=0;idi_size/BLOCKSIZ+1;i+)/ bfree(cur_path_inode-di_addri);for(i=0;i0) block=balloc( ); cur_path_inode-di_addri=block; fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET); fwrite(&dir.directi,1,

15、BLOCKSIZ,fd); else fseek(fd,DATASTART+cur_path_inode-di_addr0*BLOCKSIZ,SEEK_SET); fwrite(&dir.direct0,1,BLOCKSIZ,fd);cur_path_inode-di_size=dir.size*(sizeof(struct direct);iput(cur_path_inode);cur_path_inode=inode;/* read the change dir from disk */j=0;for(i=0;idi_size/BLOCKSIZ+1;i+) fseek(fd,DATAST

16、ART+ inode-di_addri*BLOCKSIZ,SEEK_SET); fread(&dir.directj,1,BLOCKSIZ,fd); j+=BLOCKSIZ/(DIRSIZ+2); return;13、文件创建函数 creat( ) ( 文件名creat.c)#include stdio.h#include filesys.hcreat(user_id,filename,mode)unsigned int user_id;char *filename;unsigned short mode;unsigned int di_ith,di_ino; struct inode *in

17、ode; int i,j,k,user_p; for(user_p=0;user_pUSERNUM;user_p+) if(useruser_p.u_uid = user_id) k=user_p; break; di_ino=namei(filename); if (di_ino!=NULL) /*already existed*/ inode=iget(di_ino); if(access(user_id,inode,mode)=0) iput(inode); printf(ncreat access not allowedn); return ; /*free all the block

18、 of the old file */ for(i=0;idi_size/BLOCKSIZ+1;i+) bfree(inode-di_addri); /*to do: add code here to update the pointer of the sys_file*/ for(i=0;iSYSOPENFILE;i+) if (sys_ofilei.f_inode=inode) sys_ofilei.f_off=0; for(i=0;idi_uid; userk.u_gid=inode-di_gid; for(j=0;ji_ino; inode-di_mode=userk.u_defaul

19、t_mode|DIFILE; inode-di_uid=userk.u_uid; inode-di_gid=userk.u_gid; inode-di_addr0=balloc(); inode-di_size=0; inode-di_number=1; for (i=0;iSYSOPENFILE;i+) if (sys_ofilei.f_count=0) break; for(j=0;jNOFILE;j+) if (userk.u_ofilej=SYSOPENFILE+1) break; userk.u_ofilej=i; sys_ofilei.f_flag=mode; sys_ofilei

20、.f_count=0; sys_ofilei.f_off=0; sys_ofilei.f_inode=inode; return j;14、打开文件函数open( ) (文件名open.c)#include stdio.h#include filesys.hunsigned short open(user_id,filename,openmode)int user_id;char *filename;unsigned short openmode; unsigned int dirid;struct inode *inode;int i,j,k;dirid=namei(filename);if

21、 (dirid=NULL) /*no such file */ printf(n file does not existed!n); return NULL; inode=iget(dir.directdirid.d_ino);if (!access(user_id,inode,openmode) /*access denied*/ printf(n file open has not access!); iput(inode); return NULL; /* alloc the sys_ofile item*/for(i=1;idi_size; else sys_ofilei.f_off=

22、0;/*alloc the user open file item*/ for(j=0;jUSERNUM;j+) if(userj.u_uid = user_id) k=j; break; for(j=0;jNOFILE;j+) if (userk.u_ofilej=SYSOPENFILE+1) break;if (j=NOFILE) printf(n user open file too much!n); sys_ofilei.f_count=0; iput(inode); return NULL; userk.u_ofilej=i;/记录用户打开的文件在sys_ofile 中的位置 /*i

23、f APPEND,free the block of the file before*/if (openmode &FAPPEND) for(i=0;idi_size/BLOCKSIZ+1;i+) bfree(inode-di_addri); inode-di_size=0; return j;15、关闭文件函数close( ) ( 文件名close.c) #include stdio.h#include filesys.hclose(user_id,cfd) /*close*/ unsigned int user_id; unsigned short cfd; struct inode *inode; int j,k; for(j=0;jUSERNUM;j+) if(userj.u_uid = user_id) k=j; break; inode=sys_ofileuserk.u_ofilecfd.f_inode;iput(inode);sys_ofileuserk.u_ofilecfd.f_count-;userk.u_ofilecfd=SYSOPENFILE+1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号