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

下载本文档

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

文档简介

1、学号*学院课 程 设 计课程名称 操作系统课程设计题目 为LINUX 设计一个简单的二级文件系统专 业 * 班 级 * 姓 名 * 成 绩 指导教师 * 2011年1月17日 至 2011年1月21日课程设计任务书设计题目:为LINUX 设计一个简单的二级文件系统设计目的:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。2、提高学生的程序设计能力、 提高算法设计质量与程序设计素质 。设计任务:(在规定的时间内完成下列任务)为LINUX 设计一个简单的二级文件系统。要求做到以下几点:1、可以实现下列几条命令(至少4条)Login用户登录Dir列文件目录Create创建

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

3、 11年 1月 7 日目录一 项目概述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的源代码是开放的,阅读Li

4、nux源代码,无疑是深入学习Linux的最好方法。 文件系统是Linux操作系统的重要组成部分,Linux文件具有强大的功能。文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。二. 课程设计设计题目课程设计题目:Linux二级文件系统设计三. 开发语言及实现平台或实验环境开发语言:C+/VC+实现平台(环境):visual C+、window xp、VMware Workstation(虚拟机) V6.0.2、Red Hat Enterprise Linux os、office 2

5、003四. 设计目的(1)本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。(3)通过分对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力五. 设计内容5.1. 任务为Linux系统设计一个简单的二级文件系统。要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2列目录时要列出文件名,物理地址,保护

6、码和文件长度3源文件可以进行读写保护5.2. 主程序流程图结束初始化文件目录表初始化已打开文件表输入用户名主文件目录中又该用户?输入文件操作命令分析命令建立子程序打开子程序关闭子程序读子程序写子程序删除子程序开始无此用户名否是createopenclosereadwritedelete图1 主程序流程图六. 程序设计6.1. 设计思想本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这

7、样便于查找和修改。用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2并以编号作为物理地址,在目录中进行登记。6.2. 设计要求理解Linux的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。要求:1、 对程序的每一部分要有详细的设计分析说明 2、 程序执行的每个步骤要有具体的提示内容或输出3、 源代码格式规范,注释不少于三分之一4、 设

8、计合适的测试用例,对得到的运行结果要有分析,5、 设计中遇到的问题,设计的心得体会6、 提交完整程序代码、课程设计报告及相关文档七. 设计原理7.1. 外存管理文件系统是一个含有大量的文件及其属性,对文件进行操作、管理的软件,以及向用户提供使用文件的接口的一个集合。在逻辑上它的层次结构是这样的:文件系统接口对对象的操作和管理的软件集合逻辑文件系统基本I/O管理程序(文件组织模块)基本文件系统(物理I/O层)I/O控制层(设备驱动程序)对象及其属性说明 作为产品的操作系统有各自的文件系统。比如MS的WINDOWS系列使用的是FAT16、FAT32或NTFS的文件系统、LINUX使用的是EXT2、

9、EXT3文件系统等等。7.2. linux的EXT2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而EXT2是linux自己的文件系统。它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。inode也是一个重要的数据结构。文件系统中的每个目录和文件均由一个inode描述。它包含:文件模式(类型和存取权限)、数据块位置等信息。如果希望详细学习EXT2文件系统可以参看linux内核代码include/linux/ext2_fs.h、include/linux/ext2_fs_sb.h等文件。一个文件系统除了重要的数

10、据结构之外,还必须为用户提供有效的接口操作。比如EXT2提供的OPEN/CLOSE接口操作。7.3. 用内存来模拟外存真正的文件系统对外存进行管理,涉及到许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免造成实验者顾此失彼,所以这里推荐一种使用内存来模拟外存的方式,可以跳过这些硬件技术而直接把精力放在数据结构设计和操作算法设计上面。 假定pInode是一个指向inode结构的指针,而且它已经放入的需要放入的数值了,现在需要将其写入到特定位置。可用如下代码:fd=fopen(“filesystem”,”w+b”); /fd是FILE指针类型,w便是写方式

11、,b表示二进制fseek(fd, specific_area,SEEK_SET);/ fd是文件指针;specific_area为整形,/ 为需要入pInode的位置fwrite(pInode,1,sizeof(inode),fd); / 写入pInode信息7.4. 编码#include #include #include #define DIR_LENGTH 1024 /*路径最长可达100字节*/ #define MAX_WRITE 1024*128 /*写入文字可达128k字节*/ #define MEM_D_SIZE 1024*1024 /*1M磁盘空间*/ #define DISK

12、SIZE 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*/ #define ROOT_DISK_SIZE sizeof(st

13、ruct direct)/*根目录大小 196*/ /*-FAT表项结构-*/ struct fatitem /* size 8*/ int item; /*存放文件下一个磁盘的指针*/ char em_disk; /*磁盘块是否空闲标志位 0 空闲*/ ; /*-目录项结构-*/ struct direct /*-文件控制快信息-*/ struct FCB char name9; /*文件/目录名 8位*/ char property; /*属性 1位目录 0位普通文件*/ int size; /*文件/目录字节数、盘块数)*/ int firstdisk; /*文件/目录 起始盘块号*/

14、int next; /*子目录起始盘块号*/ int sign; /*1是根目录 0不是根目录*/ directitemMSD+2; ; /*-文件打开表项结构-*/ struct opentable struct openttableitem char name9; /*文件名*/ int firstdisk; /*起始盘块号*/ int size; /*文件的大小*/ openitemMOFN; int cur_size; /*当前打文件的数目*/ ; /*-*/ struct fatitem *fat; /*FAT表*/ struct direct *root; /*根目录*/ stru

15、ct 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 *na

16、me); 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); for(j=2;,name) break; if(jMSD+2) /*文件已经存在*/ return(-4); for(i=2;idirectitemi.firstdisk=-1) break; if(i=MSD+2) /*无空

17、目录项*/ return(-2); if(u_opentable.cur_size=MOFN) /*打开文件太多*/ return(-3); for(j=ROOT_DISK_NO+1;j=DISK_NUM) return(-5); fatj.em_disk = 1; /*将空闲块置为已经分配*/ /*-填写目录项-*/ strcpy(cur_,name); cur_dir-directitemi.firstdisk = j; cur_dir-directitemi.size = 0; cur_dir-directitemi.next = j; cur_d

18、perty = 0; /*-*/ fd = open(name); return 0; /*-打开文件-*/ int open(char *name) int i, j; for(i=2;,name) break; if(i=MSD+2) return(-1); /*-是文件还是目录-*/ if(cur_perty=1) return(-4); /*-文件是否打开-*/ for(j=0;jMOFN;j+) if(!strcmp(u_,nam

19、e) break; if(j=MOFN) /*文件打开太多*/ return(-3); /*-查找一个空闲用户打开表项-*/ for(j=0;jdirectitemi.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;i=MOFN)

20、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, temp; /*-用 $ 字符作为空格

21、# 字符作为换行符-*/ 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;idirectitemi.firstdisk=item) break; temp = i; /*-存放当前目录项的下标-*/ /*-找到的item 是该文件的最后一块

22、磁盘块-*/ 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 = u_opentable.open

23、itemfd.size+len; cur_dir-directitemtemp.size = cur_dir-directitemtemp.size+len; else for(i=0;i0) ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/ for(j=0;jilen2;j+) for(i=ROOT_DISK_NO+1;i=DISK_NUM) /*-如果磁盘块已经分配完了-*/ return(-1); first = fdisk+i*DISKSIZE; /*-找到的那块空闲磁盘块的起始地址-*/ if(j=ilen2-1) /*-如果是最后要分配的一块-*/ for(k=0;

24、klen-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+) firstk = bufk; else/*-如果不是要最后分配的一块-*/ for(k=0;kdirectitemtemp.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, mod

25、len; item = u_opentable.openitemfd.firstdisk; ilen1 = len/DISKSIZE; modlen = 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 /*-不在最

26、后一块磁盘块-*/ for(j=0;jlen-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj; item = fatitem.item; /*-查找下一盘块-*/ first = fdisk+item*DISKSIZE; return 0; /*-删除文件-*/ int del(char *name) int i,cur_item,item,temp; for(i=2;,name) break; cur_item = i; /*-用来保存目录项的序号,供释放目录中-*/ if(i=MSD+2) /*-如果不在当前目录中-*/ r

27、eturn(-1); if(cur_dir-directitemcur_perty!=0) /*-如果删除的(不)是目录-*/ return(-3); for(i=0;idirectitemcur_item.firstdisk; while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/ temp = fatitem.item; fatitem.item = -1; fatitem.em_disk = 0; item = temp; /*-释放目录项-*/ cur_dir-directitemcur_item.sign = 0; cur_dir-direct

28、itemcur_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; if(!strcmp(name,.) return(-4); i

29、f(!strcmp(name,.) return(-4); if(strlen(name)8) /*-如果目录名长度大于 8位-*/ return(-1); for(i=2;idirectitemi.firstdisk=-1) break; if(i=MSD+2) /*-目录/文件 已满-*/ return(-2); for(j=2;,name) break; if(jMSD+2) /*-如果有重名-*/ return(-3); for(j=ROOT_DISK_NO+1;j=DISK_NUM) return(-5); fatj.em_disk=1; /*-将该

30、空闲块设置为已分配-*/ /*-填写目录项-*/ strcpy(cur_,name); cur_dir-directitemi.firstdisk=j; cur_dir-directitemi.size=ROOT_DISK_SIZE; cur_dir-directitemi.next=j; cur_perty=1; /*-所创目录在虚拟磁盘上的地址(内存物理地址)-*/ cur_mkdir=(struct direct *)(fdisk+cur_dir-directitemi.firstdisk*DISKSIZE);

31、 /*-初始化目录-*/ /*-指向当前目录的目录项-*/ cur_mkdir-directitem0.sign=0; cur_mkdir-directitem0.firstdisk=cur_dir-directitemi.firstdisk; strcpy(cur_,.); cur_mkdir-directitem0.next=cur_mkdir-directitem0.firstdisk; cur_perty=1; cur_mkdir-directitem0.size=ROOT_DISK_SIZE; /*

32、-指向上一级目录的目录项-*/ 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-directitem1.size=ROOT_DISK

33、_SIZE; for(i=2;idirectitemi.sign=0; cur_mkdir-directitemi.firstdisk=-1; strcpy(cur_,); cur_mkdir-directitemi.next=-1; cur_perty=0; cur_mkdir-directitemi.size=0; return 0; /*-显示当前目录的子目录-*/ void dir() int i; for(i=2;idirectitemi.firstdisk!=-1) /*-如果存在子目录-*/ printf(%st,cur_); if(cur_perty=0) /*-文件-*/ printf(%dttn,cur_dir-directitemi.size); else printf(ttn); 八. 测试界面a.主界面见图2图2b.创建文件见图3图3c.关闭、打开文件见图4图44.创建与列出子目录见图5图55.写文件、读文件见图6图66.关

温馨提示

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

评论

0/150

提交评论