操作系统模拟UNIX文件系统的设计及实现共33页

上传人:仙*** 文档编号:34975113 上传时间:2021-10-24 格式:DOC 页数:33 大小:283.01KB
收藏 版权申诉 举报 下载
操作系统模拟UNIX文件系统的设计及实现共33页_第1页
第1页 / 共33页
操作系统模拟UNIX文件系统的设计及实现共33页_第2页
第2页 / 共33页
操作系统模拟UNIX文件系统的设计及实现共33页_第3页
第3页 / 共33页
资源描述:

《操作系统模拟UNIX文件系统的设计及实现共33页》由会员分享,可在线阅读,更多相关《操作系统模拟UNIX文件系统的设计及实现共33页(33页珍藏版)》请在装配图网上搜索。

1、操作系统课程设计 模拟UNIX文件系统的设计及实现 院 系: 计算机学院二系 班 级: 计07 2班 姓 名: 2009 年 6 月 10 日操作系统课程设计任务书一、题目:银行家算法二、设计要求(1)吴勇克(组长)、刘胜光组成设计小组。(2)小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。(3)查阅相关资料,自学具体课题中涉及到的新知识。(4)采用结构化、模块化程序设计方法设计,功能要完善,界面美观。(5)所设计的系统应有菜单、动画和音乐。(6)按要求写出课程设计报告,并于设计结束后1周内提交。其主要内容包括:封皮、课程设计任务书,指导教师评语与成绩、目

2、录、概述、软件总体设计、详细设计、软件的调试、总结、谢启、附录:带中文注释的程序清单、参考文献。报告一律用A4纸打印,中文字体为宋体,西文字体用Time New Roma,一律用小四号字,行距采用“固定值”18磅,首行缩进2字符。总体设计应配合软件总体模块结构图来说明软件应具有的功能。详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的。三、课程设计工作量由于是设计小组团结协作完成设计任务,一般每人的程序量在200行有效程序行左右,不得抄袭。四、课程设计工作计划2009年6月15日,指导教师讲课,学生根据题目准备资料;2009年6月16日

3、,设计小组进行总体方案设计和任务分工;2009年16月16日2009年6月23日,每人完成自己承担的程序模块并通过独立编译;2009年6月23日2009年6月29日,将各模块集成为一个完整的系统,并录入足够的数据进行调试运行;2009年6月30日,验收、撰写报告;2009年7月2日,验收或总结。 指导教师签章 教研室主任签章 目录1. 概述12. 总体设计.23. 详细设计34. 代码调试95. 总结116. 附录127. 参考文献. 30一概述【课设原理】UNIX采用树型目录结构,每个目录表称为一个目录文件。一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含3

4、2个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下:0#1#2#K#K+1#K+2#K+3#n#i节点区文件存储区引导区管理区本次课程设计是要实现一个简单的模拟UNIX文件系统。我们在磁盘中申请一个二进制文件模拟UNIX内存,依次初始化建

5、立位示图区,I节点区,数据块区。并给已打开的文件建立文件打开表。【课设内容】1.设计任务多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令login 用户登录logout退出当前用户dir列文件目录creat创建文件delet删除文件及目录树open打开文件close关闭文件read读文件write 写文件mkdir创建目录cd改变文件目录format格式化文件系统quit退出文件系统2 文件系统应具有的基本功能 (1)多用户 :usr1,usr2,usr3,usr8 (1-8个用户) (2)多级目录:可有多级子目录; (3)具有login (用户登录) (4)系统初始化(建文件卷

6、、提供登录模块) (5)文件的创建: create (6)文件的打开:open (7)文件的读:read (8)文件的写:write (9)文件关闭:close (10)删除文件或目录:delet (11)创建目录(建立子目录):mkdir (12)改变当前目录:cd (13)列出文件目录:dir (14)退出:logout 二总体设计【算法思想】先建立512个块,每个块对应512个字节,在建立一个有512个元素的字符数组,每个元素对应相应的块号,不管是文件或是目录都有I节点,建立自己设定数目元素的I节点表,并依次把位图区,I节点表,数据块区每个元素映射到一个二进制文件上。在每一次的操作中如果

7、相应元素有变动,则对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据。【系统总体框架图】【系统总体流程图】开始文件系统是否建立?在内存中申请内存空间将磁盘上的文件读入内存YN用户登录模块,输入用户名和密码,可以在程序中设定,不用保存在文件系统中用户名、密码对吗?执行init(),进行初始化操作,进入用户子目录执行command(),对用户输入的命令进行解析和执行。若数据被修改或新建立,则保存主存i节点和数据块的内容到内存的文件系统,并写回磁盘,保存修改。若输入错误命令则显示出错信息。退出用户(logout)吗?用户输入quit吗?结束执行format(),建立文件系

8、统NNNYYY三详细设计【各模块功能说明】1.format模块功能:格式化文件系统,即初始化文件系统,相当于硬盘的格式化。将其中原有的用户及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。2. get_blknum和release_blk模块功能:get_blknum找到一个空闲数据块,并修改对应位图号元素为1。release_blk修改对应的位图元素,并把文件系统中对应的数据块清零。3. init()模块功能: 读入文件系统 4.quit()模块功能:退出系统5 .creat()模块功能: 创建文件,分配一空目录项,分配磁盘块。可用位

9、示图。填写该空目录 项。如文件长度(0),文件名,类型等。6. open()模块功能:打开文件,并判断文件类型和打开方式。 如果文件没有在文件打开表中就在文件打开表中建立该文件项。7. close()模块功能:关闭文件,删除该文件的用户打开文件表目。8. write()模块功能:写文件,需要先打开文件。并判断文件权限。写完后修改文件系统中的对应数据区。9. read()模块功能:读文件。需先打开文件。读入相应数据块的内容到缓冲区,然后输出。10.delet()模块功能: 如果参数是文件则删除文件,如果是目录则删除该目录下的所有文件和目录。 11.mkdir() 功能:建立新的目录,先在I节点表

10、中找到一个未使用的,并初始化该I节点,并在文件系统中对应更新输出。 12.cd() 功能:将当前目录切换到当前目录的一个子目录下或当前目录的父目录。 程序流程图各功能模块流程图是否否是提示输入用户名和密码用户名是否存在创建新用户读入用户信息到内存开始密码是否正确结束用户登陆login() 读入位示图信息到内存读入i节点信息到内存当前目录为根目录初始化打开文件表结束开始初始化函数init()是是否否遍历i节点区argv1=”.”目录是否存在找到的目录i节点号送当前目录inum_cur当前目录的父i节点号送当前目录inum_cur开始结束改变当前目录cd() 是是否否遍历i节点区i节点的父节点是否

11、为当前目录i节点区是否遍历完输出文件名或目录名开始结束显示目录dir()是是否否遍历i节点区要创建的目录是否存在是否有空的i节点遍历i节点区分配一个目录i节点开始结束创建目录mkdir() 是是否否遍历i节点区要创建的文件是否存在是否有空的i节点遍历i节点区分配一个文件i节点开始结束创建文件creat()是否是否是否遍历i节点区要打开的文件是否存在提示输入打开模式将打开文件信息写入打开文件信息表file_array遍历打开文件表file_array文件是否已经打开提示输入开始位置和读字节数调用读块操作,读出块内字符模式是否为可读开始结束开始结束打开文件open()读文件read()是否是否遍历

12、打开文件表file_array文件是否已经打开提示输入写入字节数调用写块操作,写入块内字符模式是否为可写是否遍历打开文件表file_array文件是否已经打开将打开文件表项标志位置-1file_arrayi.inum = -1开始结束写文件write()开始结束关闭文件close()是否遍历i节点区要删除的文件是否存在释放文件对应的i节点区inode_arrayi.inum = -1释放两个磁盘块文件是否大于的一块释放一个磁盘块是否开始结束删除文件delet() 四.代码调试1. 初始化和登陆文件系统第一次运行程序2. 建立新目录,显示当前目录下的文件和目录,并转到新目录下3. 建立新的文件,

13、打开,写,读。4. clear清屏后,dir查看当前目录下文件信息5.返回根目录下,并删除根目录下所有子目录和文件6. logout退出登录或quit退出程序。 五. 总结开始第一天构思,不断的筛选证明模拟UNIX下的内存方法,并在网络上查找相应的UNIX环境资料。接下来几天开始实践动手,从整体框架开始构思,到各个细节端口的实现。操作系统是计算机科学与技术专业中的一门重要基础课,目的是让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操

14、作系统的支持下建立自己的应用系统。操作系统课程设计,对于训练我们掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。重点培养我们的思维能力、创新能力和排错能力。通过课程设计,进一步融会贯通教材内容,掌握程序各功能模块的工作原理,相互联系和来龙去脉,完整地建立系统的概念。激发我的学习热情和主动性,培养我的独立工作能力,在实践活动中,将所学知识综合运用,增长才干,并积累经验。对编程语言又有了更深一层次的认识,并对编程能力有所加强,但还是很多的不足有待改进,对于编程来说还需要大量的实践,才能在发现问题和解决问题中前进与提高。 六附录源代码:/ head.h文件#include #include #

15、include #include #includeusing namespace std;#define BLKSIZE 512/ 数据块的大小 #define BLKNUM 512/ 数据块的块数#define INODESIZE 32/ i节点的大小#define INODENUM 32/ i节点的数目#define FILENUM 8/ 打开文件表的数目/用户 typedef structchar user_name10; / 用户名char password10; / 密码 User;/i节点 typedef structshort inum; / 文件i节点号char file_na

16、me10; / 文件名char type; / 文件类型char user_name10; / 文件所有者short iparent; / 父目录的i节点号 short length; / 文件长度short address2; / 存放文件的地址 Inode;/打开文件表 typedef structshort inum; / i节点号char file_name10; / 文件名short mode; / 读写模式(1:read, 2:write, / 3:read and write) File_table;/ 申明函数void login(void);void init(void);i

17、nt analyse(char *);void save_inode(int);int get_blknum(void);void read_blk(int);void write_blk(int);void release_blk(int);void pathset();void del(int);/ 用户命令处理函数 void help(void);void cd(void);void dir(void);void mkdir(void);void creat(void);void open(void);void read(void);void write(void);void close

18、(void);void delet(void);void logout(void);void command(void);void quit();/main.cpp文件#include head.h/定义全局变量 charchoice;intargc;/ 用户命令的参数个数char*argv5;/ 用户命令的参数intinum_cur;/ 当前目录chartemp2*BLKSIZE;/ 缓冲区Useruser;/ 当前的用户charbitmapBLKNUM;/ 位图数组Inodeinode_arrayINODENUM;/ i节点数组File_table file_arrayFILENUM;/

19、打开文件表数组charimage_name10 = data.dat;/ 文件系统名称FILE*fp;/ 打开文件指针/创建映像hd,并将所有用户和文件清除void format(void)int i;Inode inode;printf(Will be to format filesystem.n);printf(WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!n);printf(Proceed with Format(Y/N)?);scanf(%c, &choice); getchar(); if(choice = y) | (choice

20、 = Y) if(fp=fopen(image_name, w+b) = NULL) printf(Cant create file %sn, image_name); exit(-1); for(i = 0; i BLKSIZE; i+) fputc(0, fp); inode.inum = 0; strcpy(inode.file_name, /); inode.type = d; strcpy(inode.user_name, /); inode.iparent = 0; inode.length = 0; inode.address0 = -1; inode.address1 = -1

21、; fwrite(&inode, sizeof(Inode), 1, fp); inode.inum = -1; for(i = 0; i 31; i+) fwrite(&inode, sizeof(Inode), 1, fp); for(i = 0; i BLKNUM*BLKSIZE; i+) fputc(0, fp); fclose(fp); / 打开文件user.txt if(fp=fopen(user.txt, w+) = NULL) printf(Cant create file %sn, user.txt); exit(-1); fclose(fp); printf(Filesys

22、tem created successful.Please first login!n);return ;/ 功能: 用户登陆,如果是新用户则创建用户void login(void)char *p;int flag;char user_name10;char password10;char file_name10 = user.txt;do printf(login:); gets(user_name); printf(password:); p=password; while(*p=getch() if(*p = 0x0d) *p=0; /将输入的回车键转换成空格 break; printf

23、(*); /将输入的密码以*号显示 p+; flag = 0; if(fp = fopen(file_name, r+) = NULL) printf(nCant open file %s.n, file_name); printf(This filesystem not exist, it will be create!n); format(); login(); while(!feof(fp) fread(&user, sizeof(User), 1, fp); / 已经存在的用户, 且密码正确 if(!strcmp(user.user_name, user_name) & !strcmp

24、(user.password, password) fclose(fp); printf(n); return ; / 已经存在的用户, 但密码错误 else if(!strcmp(user.user_name, user_name) printf(nThis user is exist, but password is incorrect.n); flag = 1; fclose(fp); break; if(flag = 0) break;while(flag);/ 创建新用户if(flag = 0) printf(nDo you want to creat a new user?(y/n

25、):); scanf(%c, &choice); gets(temp); if(choice = y) | (choice = Y) strcpy(user.user_name, user_name); strcpy(user.password, password); fwrite(&user, sizeof(User), 1, fp); fclose(fp); return ; if(choice = n) | (choice = N) login();/ 功能: 将所有i节点读入内存void init(void)int i;if(fp = fopen(image_name, r+b) =

26、NULL) printf(Cant open file %s.n, image_name); exit(-1);/ 读入位图for(i = 0; i BLKNUM; i+) bitmapi = fgetc(fp);/ 显示位图/ 读入i节点信息for(i = 0; i INODENUM; i+) fread(&inode_arrayi, sizeof(Inode), 1, fp);/ 显示i节点/ 当前目录为根目录inum_cur = 0;/ 初始化打开文件表for(i = 0; i FILENUM; i+)file_arrayi.inum = -1;/ 功能: 分析用户命令, 将分析结果填充

27、argc和argv/ 结果: 0-13为系统命令, 14为命令错误int analyse(char *str)int i;char temp20;char *ptr_char;char *syscmd=help, cd, dir, mkdir, create, open, read, write, close, delet, logout, clear,format,quit;argc = 0;for(i = 0, ptr_char = str; *ptr_char != 0; ptr_char+) if(*ptr_char != ) while(*ptr_char != & (*ptr_ch

28、ar != 0) tempi+ = *ptr_char+; argvargc = (char *)malloc(i+1); strncpy(argvargc, temp, i); argvargci = 0; argc+; i = 0; if(*ptr_char = 0) break; if(argc != 0) for(i = 0; (i 14) & strcmp(argv0, syscmdi); i+); return i;else return 14;/ 功能: 将num号i节点保存到hd.datvoid save_inode(int num)if(fp=fopen(image_name

29、, r+b) = NULL) printf(Cant open file %sn, image_name); exit(-1);fseek(fp, BLKNUM +num*sizeof(Inode), SEEK_SET);fwrite(&inode_arraynum, sizeof(Inode), 1, fp);fclose(fp);/ 功能: 申请一个数据块int get_blknum(void)int i;for(i = 0; i 512) add1 = inode_arraynum.address1;if(fp = fopen(image_name, r+b) = NULL) print

30、f(Cant open file %s.n, image_name); exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM +add0*BLKSIZE, SEEK_SET);ch = fgetc(fp);for(i=0; (i len) & (ch != 0) & (i = 512) fseek(fp,BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); ch = fgetc(fp); for(; (i len) & (ch != 0); i+) tempi = ch; ch = fgetc(fp); t

31、empi = 0;fclose(fp);/ 功能: 将temp的内容输入hd的数据区void write_blk(int num)int i, len;int add0, add1;add0 = inode_arraynum.address0;len = inode_arraynum.length;if(fp = fopen(image_name, r+b) = NULL) printf(Cant open file %s.n, image_name); exit(-1);fseek(fp, BLKSIZE+INODESIZE*INODENUM+add0*BLKSIZE, SEEK_SET);

32、for(i=0; (ilen)&(tempi!=0)&(i 512); i+) fputc(tempi, fp);if(i = 512) add1 = inode_arraynum.address1; fseek(fp, BLKSIZE+INODESIZE*INODENUM+add1*BLKSIZE, SEEK_SET); for(; (i len) & (tempi != 0); i+) fputc(tempi, fp);fputc(0, fp);fclose(fp);/ 功能: 释放文件块号为num的文件占用的空间void release_blk(int num)FILE *fp;if(f

33、p=fopen(image_name, r+b) = NULL) printf(Cant open file %sn, image_name); exit(-1);bitmapnum = 0;fseek(fp, num, SEEK_SET);fputc(0, fp);fclose(fp);/ 功能: 显示帮助命令void help(void)printf(command: n help - show help menu nclear - clear the screen ncd - change directory nmkdir - make directory ncreate - creat

34、e a new file nopen - open a exist file nread - read a file nwrite - write something to a file nclose - close a file ndelet - delete a exist file or directory nformat - format a exist filesystem nlogout - exit user nquit - exit this systemn);/设置文件路径void pathset()char path50;int m,n;if(inode_arrayinum

35、_cur.inum = 0) strcpy(path,user.user_name);else strcpy(path,user.user_name); m=0; n=inum_cur; while(m != inum_cur) while(inode_arrayn.iparent != m) n = inode_arrayn.iparent; strcat(path,/); strcat(path,inode_arrayn.file_name); m = n; n = inum_cur; printf(%s$,path);/ 功能: 切换目录(cd . 或者 cd dir1)void cd(

36、void)int i;if(argc != 2) printf(Command cd must have two args. n); return ;if(!strcmp(argv1, .) inum_cur = inode_arrayinum_cur.iparent;else for(i = 0; i 0)& (inode_arrayi.type=d)& (inode_arrayi.iparent=inum_cur)& !strcmp(inode_arrayi.file_name,argv1)& !strcmp(inode_arrayi.user_name,user.user_name) b

37、reak; if(i = INODENUM) printf(This directory isnt exsited.n); else inum_cur = i;/ 功能: 显示当前目录下的子目录和文件(dir)void dir(void)int i;int dcount=0,fcount=0;short bcount=0;if(argc != 1) printf(Command dir must have one args. n); return ;/ 遍历i节点数组, 显示当前目录下的子目录和文件名for(i = 0; i 0) & (inode_arrayi.iparent = inum_

38、cur)& !strcmp(inode_arrayi.user_name,user.user_name) if(inode_arrayi.type = d) dcount+; printf(%-20sn, inode_arrayi.file_name); else fcount+; bcount+=inode_arrayi.length; printf(%-20s%12d bytesn, inode_arrayi.file_name,inode_arrayi.length); printf(n %d file(s)%11d bytesn,fcount,bcount);printf( %d di

39、r(s) %11d bytes FreeSpacen,dcount,1024*1024-bcount);/ 功能: 在当前目录下创建子目录(mkdir dir1)void mkdir(void)int i;if(argc != 2)printf(command mkdir must have two args. n);return ;/ 遍历i节点数组, 查找未用的i节点for(i = 0; i INODENUM; i+) if(inode_arrayi.inum 0) break; if(i = INODENUM) printf(Inode is full.n); exit(-1);inod

40、e_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1);inode_arrayi.type = d;strcpy(inode_arrayi.user_name,user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 在当前目录下创建文件(creat file)void create(void)int i;if(argc != 2) printf(command creat must have two args.

41、n); return ;for(i = 0; i 0) & (inode_arrayi.type = f) & !strcmp(inode_arrayi.file_name, argv1) printf(This file is exsit.n); return ; for(i = 0; i INODENUM; i+) if(inode_arrayi.inum 0) break;if(i = INODENUM) printf(Inode is full.n); exit(-1);inode_arrayi.inum = i;strcpy(inode_arrayi.file_name, argv1

42、);inode_arrayi.type = f;strcpy(inode_arrayi.user_name, user.user_name);inode_arrayi.iparent = inum_cur;inode_arrayi.length = 0;save_inode(i);/ 功能: 打开当前目录下的文件(open file1)void open()int i, inum, mode, filenum;if(argc != 2) printf(command open must have two args. n); return ;for(i = 0; i 0) & (inode_ar

43、rayi.type = f) & !strcmp(inode_arrayi.file_name,argv1)& !strcmp(inode_arrayi.user_name,user.user_name) break;if(i = INODENUM) printf(The file you want to open doesnt exsited.n); return ;inum = i;printf(Please input open mode:(1: read, 2: write, 3: read and write):);scanf(%d, &mode);getchar();if(mode

44、 3) printf(Open mode is wrong.n); return;for(i = 0; i FILENUM; i+) if(file_arrayi.inum 0) break;if(i = FILENUM) printf(The file table is full, please close some file.n); return ;filenum = i;file_arrayfilenum.inum = inum; strcpy(file_arrayfilenum.file_name, inode_arrayinum.file_name);file_arrayfilenum.mode = mode; printf(Open file %s by , file_arrayfilenum.file_name);if(mode = 1) printf(

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!