操作系统课程设计文件系统_第1页
操作系统课程设计文件系统_第2页
操作系统课程设计文件系统_第3页
操作系统课程设计文件系统_第4页
操作系统课程设计文件系统_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

年4月19日操作系统课程设计文件系统文档仅供参考,不当之处,请联系改正。学号*************学院课程设计课程名称操作系统课程设计题目为LINUX设计一个简单的二级文件系统专业*********班级*******姓名********成绩指导教师***************1月17日至1月21日课程设计任务书设计题目:为LINUX设计一个简单的二级文件系统设计目的:1、经过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。2、提高学生的程序设计能力、提高算法设计质量与程序设计素质。设计任务:(在规定的时间内完成下列任务)为LINUX设计一个简单的二级文件系统。要求做到以下几点:1、能够实现下列几条命令(至少4条)Login用户登录Dir列文件目录Create创立文件Delete删除文件Open打开文件Close关闭文件Read读文件Write写文件2、列目录时要列出文件名、物理地址、保护码和文件长度。3、源文件能够进行读写保护。时间安排:1月17日布置课程设计任务;分配题目后,查阅资料、准备程序;1月18日~1月20日上机调试程序、书写课程设计报告;1月21日上午提交课程设计报告及相关文档。地点:学校机房(具体见现代教育中心大屏幕安排)具体要求:1、课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅2、每位学生应独立完成各自的任务且每天至少在设计室工作半天指导教师签名:1月7日教研室主任(或责任教师)签名:1月7日目录TOC\o"1-2"\h\z\u一.项目概述 4二. 课程设计设计题目 4三. 开发语言及实现平台或实验环境 4四. 设计目的 4五. 设计内容 45.1. 任务 45.2. 主程序流程图 5六. 程序设计 56.1. 设计思想 56.2. 设计要求 5七. 设计原理 67.1. 外存管理 67.2. linux的EXT2文件系统 67.3. 用内存来模拟外存 67.4. 编码 7八. 测试界面 15九. 参考文献 17十. 设计心得体会 17十一. 设计过程中的疑问 18十二. 指导教师评语 18一.项目概述Linux是一个性能稳定、功能强大、效率高的操作系统。它在功能特性方面与Unix系统相似,同时又具有多任务、多用户、多平台等若干特性。Linux的源代码是开放的,阅读Linux源代码,无疑是深入学习Linux的最好方法。文件系统是Linux操作系统的重要组成部分,Linux文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不但包含着文件中的数据而且还有文件系统的结构,所有Linux用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。课程设计设计题目课程设计题目:Linux二级文件系统设计开发语言及实现平台或实验环境开发语言:C++/VC++实现平台(环境):visualC++、windowxp、VMwareWorkstation(虚拟机)V6.0.2、RedHatEnterpriseLinuxos、office设计目的(1)本实验的目的是经过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。(3)经过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力设计内容任务为Linux系统设计一个简单的二级文件系统。要求做到以下几点:1.能够实现下列几条命令: login用户登录 dir列目录 create创立文件 delete删除文件open打开文件 close关闭文件 read读文件 write写文件 cd进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件能够进行读写保护主程序流程图结束初始化文件目录表结束初始化文件目录表初始化已打开文件表输入用户名主文件目录中又该用户?输入文件操作命令分析命令建立子程序打开子程序关闭子程序读子程序写子程序删除子程序开始无此用户名否是createopenclosereadwritedelete图1主程序流程图程序设计设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。用户创立的文件,能够编号存储于磁盘上。如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。设计要求理解Linux的文件系统的组织;掌握常见的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。要求:对程序的每一部分要有详细的设计分析说明程序执行的每个步骤要有具体的提示内容或输出源代码格式规范,注释不少于三分之一设计合适的测试用例,对得到的运行结果要有分析,设计中遇到的问题,设计的心得体会提交完整程序代码、课程设计报告及相关文档设计原理外存管理文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。在逻辑上它的层次结构是这样的:文件系统接口对对象的操作和管理的软件集合逻辑文件系统基本I/O管理程序(文件组织模块)基本文件系统(物理I/O层)I/O控制层(设备驱动程序)对象及其属性说明作为产品的操作系统有各自的文件系统。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、EXT3文件系统等等。linux的EXT2文件系统linux使用一个叫虚拟文件系统的技术从而能够支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。inode也是一个重要的数据结构。文件系统中的每个目录和文件均由一个inode描述。它包含:文件模式(类型和存取权限)、数据块位置等信息。如果希望详细学习EXT2文件系统能够参看linux内核代码include/linux/ext2_fs.h、include/linux/ext2_fs_sb.h等文件。 一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。用内存来模拟外存真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,因此这里推荐一种使用内存来模拟外存的方式,能够跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。假定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信息编码#include<stdio.h>#include<string.h>#include<stdlib.h>#defineDIR_LENGTH1024/*路径最长可达100字节*/#defineMAX_WRITE1024*128/*写入文字可达128k字节*/#defineMEM_D_SIZE1024*1024/*1M磁盘空间*/#defineDISKSIZE1024/*磁盘块的大小1K*/#defineMSD5/*最大子目录数5*/#defineDISK_NUMMEM_D_SIZE/DISKSIZE/*磁盘块数目1024=1M/1K*/#defineFATSIZEDISK_NUM*sizeof(structfatitem)/*FAT表大小*/#defineMOFN5/*最大文件打开数5(即除根以外最大深度为5)*/#defineROOT_DISK_NOFATSIZE/DISKSIZE+1/*根目录起始盘快号9*/#defineROOT_DISK_SIZEsizeof(structdirect)/*根目录大小196*//*FAT表项结构*/structfatitem/*size8*/{intitem;/*存放文件下一个磁盘的指针*/charem_disk;/*磁盘块是否空闲标志位0空闲*/};/*目录项结构*/structdirect{/*文件控制快信息*/structFCB{charname[9];/*文件/目录名8位*/charproperty;/*属性1位目录0位普通文件*/intsize;/*文件/目录字节数、盘块数)*/intfirstdisk;/*文件/目录起始盘块号*/intnext;/*子目录起始盘块号*/intsign;/*1是根目录0不是根目录*/}directitem[MSD+2];};/*文件打开表项结构*/structopentable{structopenttableitem{charname[9];/*文件名*/intfirstdisk;/*起始盘块号*/intsize;/*文件的大小*/}openitem[MOFN];intcur_size;/*当前打文件的数目*/};/**/structfatitem*fat;/*FAT表*/structdirect*root;/*根目录*/structdirect*cur_dir;/*当前目录*/structopentableu_opentable;/*文件打开表*/intfd=-1;/*文件打开表的序号*/char*bufferdir;/*记录当前路径的名称*/char*fdisk;/*虚拟磁盘起始地址*/intcreate(char*name);intopen(char*name);intclose(char*name);intwrite(intfd,char*buf,intlen);intread(intfd,char*buf);intdel(char*name);intmkdir(char*name);intrmdir(char*name);voiddir();intcd(char*name);/*创立文件*/intcreate(char*name){inti,j;if(strlen(name)>8)/*文件名大于8位*/return(-1);for(j=2;j<MSD+2;j++)/*检查创立文件是否与已存在的文件重名*/{if(!strcmp(cur_dir->directitem[j].name,name))break;} if(j<MSD+2)/*文件已经存在*/return(-4);for(i=2;i<MSD+2;i++)/*找到第一个空闲子目录*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2)/*无空目录项*/return(-2);if(u_opentable.cur_size>=MOFN)/*打开文件太多*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++)/*找到空闲盘块j后退出*/{if(fat[j].em_disk=='0')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;cur_dir->directitem[i].next=j;cur_dir->directitem[i].property='0';/**/fd=open(name);return0;/*打开文件*/intopen(char*name){inti,j;for(i=2;i<MSD+2;i++)/*文件是否存在*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)return(-1);/*是文件还是目录*/if(cur_dir->directitem[i].property=='1')return(-4);/*文件是否打开*/for(j=0;j<MOFN;j++){if(!strcmp(u_opentable.openitem[j].name,name))break;}if(j<MOFN)/*文件已经打开*/return(-2);if(u_opentable.cur_size>=MOFN)/*文件打开太多*/return(-3);/*查找一个空闲用户打开表项*/for(j=0;j<MOFN;j++){if(u_opentable.openitem[j].firstdisk==-1)break;}/*填写表项的相关信息*/u_opentable.openitem[j].firstdisk=cur_dir->directitem[i].firstdisk;strcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].size=cur_dir->directitem[i].size;u_opentable.cur_size++;/*返回用户打开表表项的序号*/return(j);}/*关闭文件*/intclose(char*name){inti;for(i=0;i<MOFN;i++){if(!strcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)return(-1);/*清空该文件的用户打开表项的内容*/strcpy(u_opentable.openitem[i].name,"");u_opentable.openitem[i].firstdisk=-1;u_opentable.openitem[i].size=0;u_opentable.cur_size--;return0;}/*写文件*/intwrite(intfd,char*buf,intlen){char*first;intitem,i,j,k;intilen1,ilen2,modlen,temp;/*用$字符作为空格#字符作为换行符*/charSpace=32;charEndter='\n';for(i=0;i<len;i++){if(buf[i]=='$')buf[i]=Space;elseif(buf[i]=='#')buf[i]=Endter;}/*读取用户打开表对应表项第一个盘块号*/item=u_opentable.openitem[fd].firstdisk;/*--找到当前目录所对应表项的序号*/for(i=2;i<MSD+2;i++){if(cur_dir->directitem[i].firstdisk==item)break;}temp=i;/*-存放当前目录项的下标-*//*找到的item是该文件的最后一块磁盘块*/while(fat[item].item!=-1){item=fat[item].item;/*-查找该文件的下一盘块--*/}/*计算出该文件的最末地址*/first=fdisk+item*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->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);ilen2=ilen1/DISKSIZE;modlen=ilen1%DISKSIZE;if(modlen>0)ilen2=ilen2+1;/*--还需要多少块磁盘块-*/for(j=0;j<ilen2;j++){for(i=ROOT_DISK_NO+1;i<DISK_NUM;i++)/*寻找空闲磁盘块*/{if(fat[i].em_disk=='0')break;}if(i>=DISK_NUM)/*--如果磁盘块已经分配完了-*/return(-1);first=fdisk+i*DISKSIZE;/*--找到的那块空闲磁盘块的起始地址-*/if(j==ilen2-1)/*--如果是最后要分配的一块-*/{for(k=0;k<len-(DISKSIZE-u_opentable.openitem[fd].size%DISKSIZE)-j*DISKSIZE;k++)first[k]=buf[k];}else/*-如果不是要最后分配的一块--*/{for(k=0;k<DISKSIZE;k++)first[k]=buf[k];}fat[item].item=i;/*--找到一块后将它的序号存放在上一块的指针中-*/fat[i].em_disk='1';/*--置找到的磁盘快的空闲标志位为已分配-*/fat[i].item=-1;/*--它的指针为-1(即没有下一块)-*/}/*--修改长度-*/u_opentable.openitem[fd].size=u_opentable.openitem[fd].size+len;cur_dir->directitem[temp].size=cur_dir->directitem[temp].size+len;}return0;}/*读文件*/intread(intfd,char*buf){intlen=u_opentable.openitem[fd].size;char*first;inti,j,item;intilen1,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<ilen1;i++){if(i==ilen1-1)/*--如果在最后一个磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j]=first[j];}else/*--不在最后一块磁盘块-*/{for(j=0;j<len-i*DISKSIZE;j++)buf[i*DISKSIZE+j]=first[j];item=fat[item].item;/*-查找下一盘块-*/first=fdisk+item*DISKSIZE;}}return0;}/*删除文件*/intdel(char*name){inti,cur_item,item,temp;for(i=2;i<MSD+2;i++)/*--查找要删除文件是否在当前目录中-*/{if(!strcmp(cur_dir->directitem[i].name,name))break;}cur_item=i;/*--用来保存目录项的序号,供释放目录中-*/if(i>=MSD+2)/*--如果不在当前目录中-*/return(-1);if(cur_dir->directitem[cur_item].property!='0')/*--如果删除的(不)是目录-*/return(-3);for(i=0;i<MOFN;i++)/*--如果文件打开,则不能删除,退出-*/{if(!strcmp(u_opentable.openitem[i].name,name))return(-2);}item=cur_dir->directitem[cur_item].firstdisk;while(item!=-1)/*--释放空间,将FAT表对应项进行修改-*/{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,"");cur_dir->directitem[cur_item].next=-1;cur_dir->directitem[cur_item].property='0';cur_dir->directitem[cur_item].size=0;return0;}/*创立子目录*/intmkdir(char*name){inti,j;structdirect*cur_mkdir;if(!strcmp(name,"."))return(-4);if(!strcmp(name,".."))return(-4);if(strlen(name)>8)/*-如果目录名长度大于8位-*/return(-1);for(i=2;i<MSD+2;i++)/*-如果有空闲目录项退出-*/{if(cur_dir->directitem[i].firstdisk==-1)break;}if(i>=MSD+2)/*-目录/文件已满-*/return(-2);for(j=2;j<MSD+2;j++)/*-判断是否有重名-*/{if(!strcmp(cur_dir->directitem[j].name,name))break;}if(j<MSD+2)/*-如果有重名-*/return(-3);for(j=ROOT_DISK_NO+1;j<DISK_NUM;j++)/*-找到空闲磁盘块j后退出-*/{if(fat[j].em_disk=='0')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=ROOT_DISK_SIZE;cur_dir->directitem[i].next=j;cur_dir->directitem[i].property='1';/*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/cur_mkdir=(structdirect*)(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=cur_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_mkdir->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;i<MSD+2;i++)/*-子目录都初始化为空-*/{cur_mkdir->directitem[i].sign=0;cur_mkdir->directitem[i].firstdisk=-1;strcpy(cur_mkdir->directitem[i].name,"");cur_mkdir->directitem[i].next=-1;cur_mkdir->directitem[i].property='0';cur_mkdir->directitem[i].size=0;}return0;}/*--显示当前目录的子目录*/voiddir(){inti;for(i=2;i<MSD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论