版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计为linux设计一个简单的二级文件系统设计题目:为LINUX 设计一个简单的二级文件系统设计目的:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。2、提高学生的程序设计能力、提高算法设计质量与程序设计素质。设计任务:(在规定的时间内完成下列任务)为LINUX 设计一个简单的二级文件系统。要求做到以下几点:1、可以实现下列几条命令(至少4条)2、列目录时要列出文件名、物理地址、保护码和文件长度。3、源文件可以进行读写保护。时间安排:1月 17日布置课程设计任务;分配题目后,查阅资料、准备程序;1月 18日1月20 日上机调试程序、书写课程设计报告;1月
2、21 日上午提交课程设计报告及相关文档。地点:学校机房(具体见现代教育中心大屏幕安排)具体要求:1、课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅2、每位学生应独立完成各自的任务且每天至少在设计室工作半天指导教师签名:11年1月7日教研室主任(或责任教师)签名:11年1月7 日Login 用户登录Dir 列文件目录Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件目录一.项目概述 (2)二.课程设计设计题目 (3)三.开发语言及实现平台或实验环境 (3)四.设计目的 (3)五.设计内容 (3)5.1.任务 (3)5.
3、2.主程序流程图 (3)六.程序设计 (4)6.1.设计思想 (4)6.2.设计要求 (4)七.设计原理 (5)7.1.外存管理 (5)7.2.linux的EXT2文件系统 (5)7.3.用内存来模拟外存 (5)7.4.编码 (5)八.测试界面 (14)九.参考文献 (16)十.设计心得体会 (16)十一.设计过程中的疑问 (17)十二.指导教师评语 (17)一.项目概述Linux是一个性能稳定、功能强大、效率高的操作系统。它在功能特性方面与Unix系统相似,同时又具有多任务、多用户、多平台等若干特性。Linux 的源代码是开放的,阅读Linux源代码,无疑是深入学习Linux的最好方法。文件
4、系统是Linux操作系统的重要组成部分,Linux文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。二.课程设计设计题目课程设计题目:Linux二级文件系统设计三.开发语言及实现平台或实验环境开发语言:C+/VC+实现平台(环境):visual C+、window xp、VMware Workstation(虚拟机) V6.0.2、Red Hat Enterprise Linux os、office 2003四.设计目的(1)本实验的目的是通过一个简单多用户文件
5、系统的设计,加深理解文件系统的内部功能和内部实现。(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力五.设计内容5.1.任务为Linux系统设计一个简单的二级文件系统。要求做到以下几点:1.可以实现下列几条命令:login用户登录dir 列目录create创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护5.2.主程序流程图六.程序设
6、计6.1.设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2并以编号作为物理地址,在目录中进行登记。6.2.设计要求理解Linux的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作
7、算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。要求:1、对程序的每一部分要有详细的设计分析说明2、程序执行的每个步骤要有具体的提示内容或输出3、源代码格式规范,注释不少于三分之一4、设计合适的测试用例,对得到的运行结果要有分析,5、设计中遇到的问题,设计的心得体会6、提交完整程序代码、课程设计报告及相关文档七.设计原理7.1.外存管理文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户作为产品的操作系统有各自的文件系统。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTF
8、S的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。7.2.linux的EXT2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。inode也是一个重要的数据结构。文件系统中的每个目录和文件均由一个inode描述。它包含:文件模式(类型和存取权限)、数据块位置等信息。如果希望详细学习EXT2文件系统可以参看linux内核代码include/linux/ext2_fs.h、include/linux/ext2_fs_
9、sb.h等文件。一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。7.3.用内存来模拟外存真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,所以这里推荐一种使用内存来模拟外存的方式,可以跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。假定pInode是一个指向inode结构的指针,而且它已经放入的需要放入的数值了,现在需要将其写入到特定位置。可用如下代码:fd=fopen(“filesystem”,”w+b”); /
10、fd是FILE指针类型,w便是写方式,b表示二进制fseek(fd,specific_area,SEEK_SET);/ fd是文件指针;specific_area为整形,/ 为需要入pInode的位置fwrite(pInode,1,sizeof(inode),fd); / 写入pInode信息7.4.编码#includestdio.h#includestring.h#includestdlib.h#define DIR_LENGTH 1024 /*路径最长可达100字节*/#define MAX_WRITE 1024*128 /*写入文字可达128k字节*/#define MEM_D_SIZE
11、 1024*1024 /*1M磁盘空间*/#define DISKSIZE 1024 /*磁盘块的大小 1K*/#define MSD 5 /*最大子目录数 5 */#define 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*/#de
12、fine ROOT_DISK_SIZE sizeof(struct direct)/*根目录大小 196*/*-FAT表项结构-*/struct fatitem /* size 8*/int item; /*存放文件下一个磁盘的指针*/char em_disk; /*磁盘块是否空闲标志位 0 空闲*/;/*-目录项结构-*/struct direct/*-文件控制快信息-*/struct FCBchar name9; /*文件/目录名 8位*/char property; /*属性 1位目录 0位普通文件*/int size; /*文件/目录字节数、盘块数)*/int firstdisk; /
13、*文件/目录起始盘块号*/int next; /*子目录起始盘块号*/int sign; /*1是根目录 0不是根目录*/directitemMSD+2;/*-文件打开表项结构-*/ struct opentablestruct openttableitemchar name9; /*文件名*/int firstdisk; /*起始盘块号*/int size; /*文件的大小*/openitemMOFN;int cur_size; /*当前打文件的数目*/;/*-*/struct fatitem *fat; /*FAT表*/struct direct *root; /*根目录*/struct
14、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 read(int fd,char *buf);int del(char *name);int mkdir
15、(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);for(j=2;jMSD+2;j+) /*检查创建文件是否与已存在的文件重名*/if(!strcmp(cur_,name)break;if(jMSD+2) /*文件已经存在*/return(-4);for(i=2;iMSD+2;i+) /*找到第一个空闲子目录*/if
16、(cur_dir-directitemi.firstdisk=-1)break;if(i=MSD+2) /*无空目录项*/return(-2);if(u_opentable.cur_size=MOFN) /*打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;jDISK_NUM;j+) /*找到空闲盘块 j 后退出*/ if(fatj.em_disk=0)break;if(j=DISK_NUM)return(-5);fatj.em_disk = 1; /*将空闲块置为已经分配*/*-填写目录项-*/strcpy(cur_,na
17、me);cur_dir-directitemi.firstdisk = j;cur_dir-directitemi.size = 0;cur_dir-directitemi.next = j;cur_perty = 0;/*-*/fd = open(name);return 0;/*-打开文件-*/int open(char *name)int i, j;for(i=2;iMSD+2;i+) /*文件是否存在*/if(!strcmp(cur_,name)break;if(i=MSD+2)return(-1);/*-是
18、文件还是目录-*/if(cur_perty=1)return(-4);/*-文件是否打开-*/for(j=0;jMOFN;j+)if(!strcmp(u_,name)break;if(jMOFN) /*文件已经打开*/return(-2);if(u_opentable.cur_size=MOFN) /*文件打开太多*/return(-3);/*-查找一个空闲用户打开表项-*/ for(j=0;jMOFN;j+)if(u_opentable.openitemj.firstdisk=-1)break;/*-填写表
19、项的相关信息-*/u_opentable.openitemj.firstdisk = cur_dir-directitemi.firstdisk;strcpy(u_,name);u_opentable.openitemj.size = cur_dir-directitemi.size;u_opentable.cur_size+;/*-返回用户打开表表项的序号-*/ return(j);/*-关闭文件-*/int close(char *name)int i;for(i=0;iMOFN;i+) if(!strcmp(u_opentable.open
20、,name)break;if(i=MOFN) return(-1);/*-清空该文件的用户打开表项的内容-*/strcpy(u_,);u_opentable.openitemi.firstdisk = -1;u_opentable.openitemi.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
21、, temp;/*-用 $ 字符作为空格 # 字符作为换行符-*/char Space = 32;char Endter= n;for(i=0;ilen;i+) if(bufi = $)bufi = Space;else if(bufi = #)bufi = Endter;/*-读取用户打开表对应表项第一个盘块号-*/item = u_opentable.openitemfd.firstdisk;/*-找到当前目录所对应表项的序号-*/for(i=2;iMSD+2;i+)if(cur_dir-directitemi.firstdisk=item)break;temp = i; /*-存放当前目
22、录项的下标-*/*-找到的item 是该文件的最后一块磁盘块-*/while(fatitem.item!=-1)item =fatitem.item; /*-查找该文件的下一盘块-*/*-计算出该文件的最末地址-*/first = fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE;/*-如果最后磁盘块剩余的大小大于要写入的文件的大小-*/if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZElen)strcpy(first,buf);u_opentable.openitemfd.size
23、= u_opentable.openitemfd.size+len; cur_dir-directitemtemp.size = cur_dir-directitemtemp.size+len;elsefor(i=0;i(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE);i+)/*写一部分内容到最后一块磁盘块的剩余空间(字节)*/firsti = buf i;/*计算分配完最后一块磁盘的剩余空间(字节) 还剩下多少字节未存储*/ilen1 = len-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE);il
24、en2 = ilen1/DISKSIZE;modlen = ilen1%DISKSIZE;if(modlen0)ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/for(j=0;jilen2;j+)for(i=ROOT_DISK_NO+1;iDISK_NUM;i+)/*寻找空闲磁盘块*/if(fati.em_disk=0)break;if(i=DISK_NUM) /*-如果磁盘块已经分配完了-*/return(-1);first = fdisk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一块-*/ fo
25、r(k=0;klen-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+)firstk = bufk;else/*-如果不是要最后分配的一块-*/for(k=0;kDISKSIZE;k+)firstk =bufk;fatitem.item = i; /*-找到一块后将它的序号存放在上一块的指针中-*/fati.em_disk = 1; /*-置找到的磁盘快的空闲标志位为已分配-*/ fati.item = -1; /*-它的指针为 -1 (即没有下一块)-*/*-修改长度-*/u_opentable.openitemfd.
26、size = u_opentable.openitemfd.size+len; cur_dir-directitemtemp.size = cur_dir-directitemtemp.size+len;return 0;/*-读文件-*/int read(int fd, char *buf)int len = u_opentable.openitemfd.size;char *first;int i, j, item;int ilen1, modlen;item = u_opentable.openitemfd.firstdisk;ilen1 = len/DISKSIZE;modlen =
27、len%DISKSIZE;if(modlen!=0)ilen1 = ilen1+1; /*-计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/for(i=0;iilen1;i+)if(i=ilen1-1) /*-如果在最后一个磁盘块-*/for(j=0;jlen-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;else /*-不在最后一块磁盘块-*/for(j=0;jlen-i*DISKSIZE;j+)bufi*DISKSIZE+j = firstj;item = fatitem.item; /*-
28、查找下一盘块-*/first = fdisk+item*DISKSIZE;return 0;/*-删除文件-*/int del(char *name)int i,cur_item,item,temp;for(i=2;iMSD+2;i+) /*-查找要删除文件是否在当前目录中-*/if(!strcmp(cur_,name)break;cur_item = i; /*-用来保存目录项的序号,供释放目录中-*/if(i=MSD+2) /*-如果不在当前目录中-*/return(-1);if(cur_dir-directitemcur_perty
29、!=0) /*-如果删除的(不)是目录-*/return(-3);for(i=0;iMOFN;i+) /*-如果文件打开,则不能删除,退出-*/ if(!strcmp(u_,name)return(-2); item = cur_dir-directitemcur_item.firstdisk;while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/temp = fatitem.item;fatitem.item = -1;fatitem.em_disk = 0;item = temp;/*-释放目录项-*/cur_dir-
30、directitemcur_item.sign = 0;cur_dir-directitemcur_item.firstdisk = -1;strcpy(u_opentable.openitemcur_,);cur_dir-directitemcur_item.next = -1;cur_dir-directitemcur_perty = 0;cur_dir-directitemcur_item.size = 0;return 0;/*-创建子目录-*/int mkdir(char *name)int i,j;struct direct *cur_mkdir;
31、if(!strcmp(name,.)return(-4);if(!strcmp(name,.)return(-4);if(strlen(name)8) /*-如果目录名长度大于 8位-*/return(-1);for(i=2;iMSD+2;i+) /*-如果有空闲目录项退出-*/if(cur_dir-directitemi.firstdisk=-1)break;if(i=MSD+2) /*-目录/文件已满-*/return(-2);for(j=2;jMSD+2;j+) /*-判断是否有重名-*/if(!strcmp(cur_,name)break;if(
32、jMSD+2) /*-如果有重名-*/return(-3);for(j=ROOT_DISK_NO+1;jDISK_NUM;j+) /*-找到空闲磁盘块 j 后退出-*/ if(fatj.em_disk=0)break;if(j=DISK_NUM)return(-5);fatj.em_disk=1; /*-将该空闲块设置为已分配-*/*-填写目录项-*/strcpy(cur_,name);cur_dir-directitemi.firstdisk=j;cur_dir-directitemi.size=ROOT_DISK_SIZE;cur_dir-direc
33、titemi.next=j;cur_perty=1;/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/cur_mkdir=(struct direct *)(fdisk+cur_dir-directitemi.firstdisk*DISKSIZE);/*-初始化目录-*/*-指向当前目录的目录项-*/cur_mkdir-directitem0.sign=0;cur_mkdir-directitem0.firstdisk=cur_dir-directitemi.firstdisk;strcpy(cur_,.);
34、cur_mkdir-directitem0.next=cur_mkdir-directitem0.firstdisk; cur_perty=1;cur_mkdir-directitem0.size=ROOT_DISK_SIZE;/*-指向上一级目录的目录项-*/cur_mkdir-directitem1.sign=cur_dir-directitem0.sign;cur_mkdir-directitem1.firstdisk=cur_dir-directitem0.firstdisk; strcpy(cur_,.);cur_mkdir-directitem1.next=cur_mkdir-directitem1.firstdisk; cur_perty=1;cur_mkdir-dire
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中级育婴师考试试题及答案
- 职业卫生技术服务专业技术人员考试(职业卫生评价)例题及答案(湖南省)
- 内蒙古自治区乌兰察布市集宁区第二中学2025-2026学年高二下学期7月期末地理试题(文字版含答案)
- 下肢静脉血栓预防及护理考核试题及答案
- 龋病预防试题及答案
- 纠正预防措施培训试题及答案
- 河北单招职业素养考试题及答案
- 多重耐药菌医院感染预防与控制培训考核试题及答案
- 保山医专单招专业试题及答案
- 2026年自考真题自考试题及答案
- 2026年ikun测试题有答案
- 2025年GRE《语文》真题及答案解析
- 模具定期保养维护计划
- 2025-2026学年湖北省武汉市江岸区八年级(下)期中道德与法治试卷(含答案)
- 《DL-T 1482-2023架空输电线路无人机巡检作业技术导则》2025实施指南(完整版)
- 2024年浙江宁波海关缉私局辅警招聘笔试参考题库附带答案详解
- 《无人机维护技术》 课件 项目3 维护典型作业无人机
- 译林版八年级英语上册(全套)精品课件
- 新视野商务英语视听说第二版上Unit答案公开课一等奖市赛课获奖课件
- 甘肃省基础教育教学成果奖申报表【模板】
- GB/T 23561.16-2010煤和岩石物理力学性质测定方法第16部分:岩石耐崩解性指数测定方法
评论
0/150
提交评论