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

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(操作系统课程设计文件系统.doc)为本站上传会员【丰****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

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

1、 操作系统课程设计文件系统 35 2020年4月19日 文档仅供参考,不当之处,请联系改正。 学号 *************学院 课 程 设 计 课程名称 操作系统课程设计 题目 为LINUX 设计一个简单的二级文件系统 专 业 ********* 班 级 ******* 姓 名 ******** 成 绩 指导教师 *****

2、 1月17日 至 1月21日 课程设计任务书 设计题目:为LINUX 设计一个简单的二级文件系统 设计目的: 1、经过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。 2、提高学生的程序设计能力、 提高算法设计质量与程序设计素质 。 设计任务:(在规定的时间内完成下列任务) 为LINUX 设计一个简单的二级文件系统。要求做到以下几点: 1、能够实现下列几条命令(至少4条) Login 用户登录 Dir 列文件目录 Create 创立文件 Delete 删除文件 Open 打

3、开文件 Close 关闭文件 Read 读文件 Write 写文件 2、列目录时要列出文件名、物理地址、保护码和文件长度。 3、源文件能够进行读写保护。 时间安排: 1月 17日 布置课程设计任务;分配题目后,查阅资料、 准备程序; 1月 18日~1月20 日上机调试程序、书写课程设计报告; 1月21 日上午提交课程设计报告及相关文档。 地点:学校机房(具体见现代教育中心大屏幕安排) 具体要求: 1、课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅 2、每位学生应独立完成各自的任务且每天至少在设计室工作

4、半天 指 导 教 师 签 名: 1月 7日 教研室主任(或责任教师)签名: 1月 7 日 目录 一. 项目概述 4 二. 课程设计设计题目 4 三. 开发语言及实现平台或实验环境 4 四. 设计目的 4 五. 设计内容 4 5.1. 任务 4 5.2. 主程序流程图 5 六. 程序设计 5 6.1. 设计思想 5 6.2. 设计要求 5 七. 设计原理 6 7.1. 外存管理 6 7.2. linux的EXT2文件系统 6 7.3. 用内存来模拟外存 6 7.4. 编码 7 八.

5、 测试界面 15 九. 参考文献 17 十. 设计心得体会 17 十一. 设计过程中的疑问 18 十二. 指导教师评语 18 一.项目概述 Linux是一个性能稳定、功能强大、效率高的操作系统。它在功能特性方面与Unix系统相似,同时又具有多任务、多用户、多平台等若干特性。Linux的源代码是开放的,阅读Linux源代码,无疑是深入学习Linux的最好方法。   文件系统是Linux操作系统的重要组成部分,Linux文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不但包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、

6、软连接及文件保护信息等都存储在其中。 二. 课程设计设计题目 课程设计题目:Linux二级文件系统设计 三. 开发语言及实现平台或实验环境 开发语言:C++/VC++ 实现平台(环境):visual C++、window xp、VMware Workstation(虚拟机) V6.0.2、Red Hat Enterprise Linux os、office 四. 设计目的 (1)本实验的目的是经过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 (2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。

7、3)经过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力 五. 设计内容 5.1. 任务 为Linux系统设计一个简单的二级文件系统。要求做到以下几点: 1.能够实现下列几条命令: login 用户登录 dir 列目录 create 创立文件 delete 删除文件 open 打开文件 close 关闭文件 read 读文件 write 写文件 cd 进出目录 2.列目录时要列出

8、文件名,物理地址,保护码和文件长度 3.源文件能够进行读写保护 5.2. 主程序流程图 结束 初始化文件目录表 初始化已打开文件表 输入用户名 主文件目录中又该用户? 输入文件操作命令 分析命令 建立子程序 打开子程序 关闭子程序 读子程序 写子程序 删除子程序 开始 无 此用 户 名 否 是 create open close read write delete 图1 主程序流程图 六. 程序设计 6.1. 设计思想 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未

9、考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。 首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。 用户创立的文件,能够编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。 6.2. 设计要求 理解Linux的文件系统的组织;掌握常见的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管

10、道文件与设备文件等特殊内容)。要求: 1、 对程序的每一部分要有详细的设计分析说明 2、 程序执行的每个步骤要有具体的提示内容或输出 3、 源代码格式规范,注释不少于三分之一 4、 设计合适的测试用例,对得到的运行结果要有分析, 5、 设计中遇到的问题,设计的心得体会 6、 提交完整程序代码、课程设计报告及相关文档 七. 设计原理 7.1. 外存管理 文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。在逻辑上它的层次结构是这样的: 文件系统接口 对对象的操作和管理的软件集合 逻辑文件系统 基本I/O管理程序

11、文件组织模块) 基本文件系统(物理I/O层) I/O控制层(设备驱动程序) 对象及其属性说明 作为产品的操作系统有各自的文件系统。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。 7.2. linux的EXT2文件系统 linux使用一个叫虚拟文件系统的技术从而能够支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。inode也是一个重要的数据结构。文件系统中的每个目录和文件均由

12、一个inode描述。它包含:文件模式(类型和存取权限)、数据块位置等信息。如果希望详细学习EXT2文件系统能够参看linux内核代码include/linux/ext2_fs.h、include/linux/ext2_fs_sb.h等文件。 一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。 7.3. 用内存来模拟外存 真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,因此这里推荐一种使用内存来模拟外存的方式,能够跳过这些硬

13、件技术而直接把精力放在数据结构设计和操作算法设计上面。 假定pInode是一个指向inode结构的指针,而且它已经放入的需要放入的数值了,现在需要将其写入到特定位置。可用如下代码: …… fd=fopen(“filesystem”,”w+b”); //fd是FILE指针类型,w便是写方式,b表示二进制 fseek(fd, specific_area,SEEK_SET);// fd是文件指针;specific_area为整形, // 为需要入pInode的位置 fwrite(pInode,1,sizeof(inode),fd); // 写入pInode信息

14、 7.4. 编码 #include #include #include #define DIR_LENGTH 1024 /*路径最长可达100字节*/ #define MAX_WRITE 1024*128 /*写入文字可达128k字节*/ #define MEM_D_SIZE 1024*1024 /*1M磁盘空间*/ #define DISKSIZE 1024 /*磁盘块的大小 1K*/ #define MSD 5 /*最大子目录数 5 */ #d

15、efine DISK_NUM MEM_D_SIZE/DISKSIZE /*磁盘块数目 1024=1M/1K*/ #define FATSIZE DISK_NUM*sizeof(struct fatitem) /*FAT表大小 */ #define MOFN 5 /*最大文件打开数 5 (即除根以外最大深度为5)*/ #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 /*根目录起始盘快号 9*/ #define ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/ /*------

16、FAT表项结构-----------------------*/ struct fatitem /* size 8*/ { int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ }; /*-------------------目录项结构------------------------*/ struct direct { /*-----文件控制快信息-----*/ struct FCB { char name[9]; /*文件/目录名 8位

17、/ char property; /*属性 1位目录 0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录 起始盘块号*/ int next; /*子目录起始盘块号*/ int sign; /*1是根目录 0不是根目录*/ }directitem[MSD+2]; }; /*------------------文件打开表项结构--------------------------*/ struct opentable { struct

18、openttableitem { char name[9]; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ }openitem[MOFN]; int cur_size; /*当前打文件的数目*/ }; /*-------------------------------------------------------------------*/ struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/

19、 struct direct *cur_dir; /*当前目录*/ struct opentable u_opentable; /*文件打开表*/ int fd=-1; /*文件打开表的序号*/ char *bufferdir; /*记录当前路径的名称*/ char *fdisk; /*虚拟磁盘起始地址*/ int create(char *name); int open(char *name); int close(char *name); int write(int fd,char *buf,int len); int

20、 read(int fd,char *buf); int del(char *name); int mkdir(char *name); int rmdir(char *name); void dir(); int cd(char *name); /*-----------创立文件---------------------------------*/ int create(char *name) { int i,j; if(strlen(name)>8) /*文件名大于 8位*/ return(-1);

21、 for(j=2;jdirectitem[j].name,name)) break; } if(jdirectitem[i].

22、firstdisk==-1) break; } if(i>=MSD+2) /*无空目录项*/ return(-2); if(u_opentable.cur_size>=MOFN) /*打开文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;j

23、) break; } if(j>=DISK_NUM) return(-5); fat[j].em_disk = '1'; /*将空闲块置为已经分配*/ /*-----------填写目录项-----------------*/ strcpy(cur_dir->directitem[i].name,name); cur_dir->directitem[i].firstdisk = j; cur_dir->directitem[i].size = 0;

24、cur_dir->directitem[i].next = j; cur_dir->directitem[i].property = '0'; /*---------------------------------*/ fd = open(name); return 0; /*---------打开文件---------------------------*/ int open(char *name) { int i, j; for(i=2;i

25、 if(!strcmp(cur_dir->directitem[i].name,name)) break; } if(i>=MSD+2) return(-1); /*--------是文件还是目录-----------------------*/ if(cur_dir->directitem[i].property=='1') return(-4); /*--------文件是否打开-----------------------*/

26、 for(j=0;j=MOFN) /*文件打开太多*/ return(-3); /*--------查找一个空闲用户打开表项----------------

27、/ for(j=0;jdirectitem[i].firstdisk; strcpy(u_openta

28、ble.openitem[j].name,name); u_opentable.openitem[j].size = cur_dir->directitem[i].size; u_opentable.cur_size++; /*----------返回用户打开表表项的序号--------------------------*/ return(j); } /*-----------关闭文件------------------------*/ int close(char *name) { int i; for

29、i=0;i=MOFN) return(-1); /*----清空该文件的用户打开表项的内容---------------------*/ strcpy(u_opentable.openitem[i].name,""); u_opentable.openitem[i].firstdisk = -1;

30、 u_opentable.openitem[i].size = 0; u_opentable.cur_size--; return 0; } /*---------写文件---------------------------*/ int write(int fd, char *buf, int len) { char *first; int item, i, j, k; int ilen1, ilen2, modlen, temp; /*---用 $ 字符作为空格 # 字符作为换行符------------------*/

31、 char Space = 32; char Endter= '\n'; for(i=0;i

32、SD+2;i++) { if(cur_dir->directitem[i].firstdisk==item) break; } temp = i; /*-存放当前目录项的下标-*/ /*------找到的item 是该文件的最后一块磁盘块-------------------*/ while(fat[item].item!=-1) { item =fat[item].item; /*-查找该文件的下一盘块--*/ } /*-----计算出该文件的最末地址-------*/ first = fdisk+it

33、em*DISKSIZE+u_opentable.openitem[fd].size%DISKSIZE; /*-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------*/ if(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE>len) { strcpy(first,buf); u_opentable.openitem[fd].size = u_opentable.openitem[fd].size+len; cur_dir->directitem[temp].size = cur_dir

34、>directitem[temp].size+len; } else { for(i=0;i<(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE);i++) {/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/ first[i] = buf [i]; } /*计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储*/ ilen1 = len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE); i

35、len2 = ilen1/DISKSIZE; modlen = ilen1%DISKSIZE; if(modlen>0) ilen2 = ilen2+1; /*--还需要多少块磁盘块-*/ for(j=0;j=DISK_NUM) /

36、如果磁盘块已经分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*--找到的那块空闲磁盘块的起始地址-*/ if(j==ilen2-1) /*--如果是最后要分配的一块-*/ { for(k=0;k

37、 { for(k=0;k

38、 u_opentable.openitem[fd].size+len; cur_dir->directitem[temp].size = cur_dir->directitem[temp].size+len; } return 0; } /*----------读文件--------------------*/ int read(int fd, char *buf) { int len = u_opentable.openitem[fd].size; char *first; int i, j, item; int ilen1,

39、modlen; item = u_opentable.openitem[fd].firstdisk; ilen1 = len/DISKSIZE; modlen = len%DISKSIZE; if(modlen!=0) ilen1 = ilen1+1; /*--计算文件所占磁盘的块数-*/ first = fdisk+item*DISKSIZE; /*--计算文件的起始位置-*/ for(i=0;i

40、n-i*DISKSIZE;j++) buf[i*DISKSIZE+j] = first[j]; } else /*--不在最后一块磁盘块-*/ { for(j=0;j

41、 int del(char *name) { int i,cur_item,item,temp; for(i=2;idirectitem[i].name,name)) break; } cur_item = i; /*--用来保存目录项的序号,供释放目录中-*/ if(i>=MSD+2) /*--如果不在当前目录中-*/ return(-1); if(cur_dir->direct

42、item[cur_item].property!='0') /*--如果删除的(不)是目录-*/ return(-3); for(i=0;idirectitem[cur_item].firstdisk; while(item!=-1) /*--释放空间,将FAT表对应项进行修改-*/

43、{ temp = fat[item].item; fat[item].item = -1; fat[item].em_disk = '0'; item = temp; } /*-----------------释放目录项-----------------------*/ cur_dir->directitem[cur_item].sign = 0; cur_dir->directitem[cur_item].firstdisk = -1; strcpy(u_opentable.openitem[cur_item].name,"");

44、 cur_dir->directitem[cur_item].next = -1; cur_dir->directitem[cur_item].property = '0'; cur_dir->directitem[cur_item].size = 0; return 0; } /*---------创立子目录---------------------*/ int mkdir(char *name) { int i,j; struct direct *cur_mkdir; if(!strcmp(name,"."))

45、 return(-4); if(!strcmp(name,"..")) return(-4); if(strlen(name)>8) /*-如果目录名长度大于 8位-*/ return(-1); for(i=2;idirectitem[i].firstdisk==-1) break; } if(i>=MSD+2) /*-目录/文件 已满-*/ return(-2); for(j=2;j

46、有重名-*/ { if(!strcmp(cur_dir->directitem[j].name,name)) break; } if(j=DISK_NUM) return(-5); fat[j].em_disk='1'; /*-将该空闲块

47、设置为已分配-*/ /*-------------填写目录项----------*/ strcpy(cur_dir->directitem[i].name,name); cur_dir->directitem[i].firstdisk=j; cur_dir->directitem[i].size=ROOT_DISK_SIZE; cur_dir->directitem[i].next=j; cur_dir->directitem[i].property='1'; /*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/ cur_mkd

48、ir=(struct direct *)(fdisk+cur_dir->directitem[i].firstdisk*DISKSIZE); /*-初始化目录-*/ /*-指向当前目录的目录项-*/ cur_mkdir->directitem[0].sign=0; cur_mkdir->directitem[0].firstdisk=cur_dir->directitem[i].firstdisk; strcpy(cur_mkdir->directitem[0].name,"."); cur_mkdir->directitem[0].next=c

49、ur_mkdir->directitem[0].firstdisk; cur_mkdir->directitem[0].property='1'; cur_mkdir->directitem[0].size=ROOT_DISK_SIZE; /*-指向上一级目录的目录项-*/ cur_mkdir->directitem[1].sign=cur_dir->directitem[0].sign; cur_mkdir->directitem[1].firstdisk=cur_dir->directitem[0].firstdisk; strcpy(cur_mkd

50、ir->directitem[1].name,".."); cur_mkdir->directitem[1].next=cur_mkdir->directitem[1].firstdisk; cur_mkdir->directitem[1].property='1'; cur_mkdir->directitem[1].size=ROOT_DISK_SIZE; for(i=2;idirectitem[i].sign=0; cur_mkdir->direct

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服