ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:239.49KB ,
资源ID:11697870      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11697870.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计文件系统的模拟设计.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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

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

3、录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。功能结构图如图1.0所示:(3)详细设计及少数重要编码的说明这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。1、 显示列表函数和目录 流程图如图1.1所示2、 文件创建函数算法:查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以#结束。申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改inode位

4、图,block位图,写入模拟硬盘。详细过程如流程图1.2所示:、打开文件函数 对文件进行关闭操作,若此时文件不存在或处于读状态或写状态,则返回关闭失败信息;若此时文件处于空闲状态,则调用Close函数进行关闭操作。流程图如图1.3所示: 、关闭文件系统函数 对文件进行打开操作,若此时文件不存在或已处于打开状态或读状态或写状态,则返回打开失败信息;若此时文件处于空闲状态,则调用Open函数进行打开操作。流程图如图1.4所示:(4)运行结果分析 程序结果如图1.5-1.7所示 图1.5 图1.6 图1.7(5)设计小结操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地

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

6、(第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 DIRE

7、CTORY: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)

8、; 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_mo

9、de&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_i

10、no=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_gi

11、d=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);i

12、f(!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,dirnam

13、e,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,B

14、LOCKSIZ,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,DATASTA

15、RT+ 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 *ino

16、de; 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

17、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_default

18、_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.

19、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

20、(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=0

21、;/*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 中的位置 /*if

22、 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;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1