模拟unix系统说明书.doc_第1页
模拟unix系统说明书.doc_第2页
模拟unix系统说明书.doc_第3页
模拟unix系统说明书.doc_第4页
模拟unix系统说明书.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

*实践教学* 兰州理工大学计算机与通信学院2013年秋季学期 操作系统原理 课程设计题 目: 模拟UNIX文件系统 专业班级:计算机科学与技术基地班姓 名: 冯辉 学 号: 11250306 指导教师: 王旭阳 成 绩: 目录1.摘要.32.问题描述.4 2.1 设计环境.4 2.2 设计思想.43. 详细设计.6 3.1 数据结构.64.设计总结.85.参考文献.96. 附录.10 摘要本次课程设计是设计并实现一个多用户多级目录结构的文件系统。我们在内存中开辟一个虚拟磁盘空间(1MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。该虚拟文件系统实现目录的创建及删除,文件的创建,打开,写,读,文件的删除,关闭,这些功能都是通过功能函数在其中实现其功能。 关键词:多用户多级目录,文件的访问权限,文件系统操作 第2章 问题描述 2.1 设计环境: 课程设计的环境是Linux操作系统。 设计时可利用Linux 提供的文件管理的功能调用,建立一个模拟的文件系统。基本思想是,在Linux 系统中创建一个较大容量的文件,作为所设计的文件系统的“文件卷”,并利用Linux系统的功能调用,编写各程序模块。NIX采用树型目录结构,每个目录表称为一个目录文件。一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。 以 1M的内存空间作为文件空间,空间“分块”,编号为 0(BLKMAX-1)。“分块”就是规定对文件卷的读/写以块为单位,每次读/写的起点为块大小的整倍数。分块主要体现在文件卷的读/写模块上。 # define BSIZE 512 /* 512bytes/块 */# define BLKMAX 2048 /* 共2048块 */ 块是专用块(超级块)。前半部用于存放文件卷空间的位示图(bitmap),位状态=0表示对应块空闲,状态=1表示已分配。后半部的最后32 个字节用于存放根目录的目录结构。0#块不参与文件空间的动态分配。1(BLKMAX-1)块用于存放文件(普通文件和子目录文件)的信息。2.2 设计思想: 本课程设计是要求我们模拟UNIX文件系统功能设计一个虚拟文件系统,依据UNIX文件系统的特点,其设计思想是:申请1M的内存空间来虚拟文件系统,将其以512B每块划分2048块,采用位示图管理文件系统的方法,利用其原理将第1块作为位图区(512B),共有对i节点区和数据块区分别建立位图;每个i节点占16B,每块有512/16=32个i节点,用2、3共两块作为i节点,总共有64个i节点,在位图区占用8B;其余2045块作为数据区(本课设要求只用到512块),在位图区占用接近256B(2045位)。位图:用0表示未使用,1表示使用;i节点:文件控制块(FCB),描述文件信息的一个数据结构;数据区:存放用户数据,包括目录文件。位示图用以反映整个存储空间的分配情况,由若干字节构成,每个字节中的每一位对应文件存储器中的一块,“1”状态表示相应块已占用,“0”状态表示该块为空闲。存储块分配时,只要把找到的空闲块所对应的位由 0 改为 1, 而在释放时,只要把被释放的物理块所对应的位由 1 改为 0 即可。分配和释放都可以在内存的位示 图上完成,而且速度较快。磁盘 i 节点利用在内存中生成链表或者数组的方法来生成,并且限制磁盘节点数的最大值。同样内存 i 节点利用链表的方法在内存中生成。同时在往文件中 写或者读的时候我们都是对内存中有内容进行读写。在该文件系统中,规定一个文件最多只能占用2个数据块,这两个数据块可以是不连续的,其块号记录在一个索引块中,该索引块称为inode结构。读入一个文件时,先根据目录找到相应的i节点号,将i节点读入主存i节点,建立打开文件表指向该主存i节点,再将文件内容读入主存数据区。 第3章 详细设计3.1 数据结构:包括文件目录结构、文件控制块结构、文件结构、用户结构如下:1) 文件目录结构 struct dir unsigned short d-mode; /* 文件属性及访问权限 */ char d-uid; /* 文件主标识 */ char d-gid; /* 文件主同组用户标识 */ int d-fsize; /* 文件大小(字节) */ char d-name8; /* 文件名 */ int d-add10; /* 存放文件信息的空间地址(块号) */ # define DSIZE 32 /* 以上目录结构占用32字节 */ 按以上述定义,每一块可存放16个目录结构。 2) 文件控制块结构 struct fcb char f-count; /* 文件访问计数 */ char f-flag; /* 标志字 */ int f-blkno; /* 存放本文件目录结构的块号 */ int f-number; /* 文件目录结构所在块内偏移序号 */ unsigned short f-mode; /* 文件属性 */ char f-uid; char f-gid; int f-fsize; char f-name8; int f-add10; 3) 文件结构 struct ofile char o-flag; /* 标志字 */ char o-count; /* 访问计数 */ struct fcb *o-fcbp; /* 对应打开文件FCB结构指针 */ int o-offset; /* 文件当前读/写指针 */ ; # define FILENO 10 /* 文件系统允许打开文件数量 */ struct ofile ofileFILENO; /* 系统打开文件表ofile */ 标志字 o-flag 表示的标志定义为: 4) 用户结构 struct user char u-name12; /* 用户名,登录时使用 */ char u-uid; /* 用户标识,即文件创建时的文件主 */ char u-gid /* 同组用户标识 */ struct fcb *u-cdir; /* 现行工作目录的FCB指针 */ char u-error; /* 执行文件管理函数时返回的错误代码 */ char *u-base; /* 读/写文件时信息存储区始址 */ int u-count; /* 读/写文件的信息字节数 */ int u-offset; /* 读/写文件的相对位移量 */ char u-obuf8; /* 文件路径名分量暂存区(查找文件时用) */ struct fcb *u-pdir; /* 新文件父目录FCB指针(文件创建时用) */ struct ofile *u-ofile5; /* 本用户打开文件表 */;32 第4章 设计总结模拟实现了UNIX文件系统,较好地实现了课程设计的任务和要求及各个功能。本系统实现了文件系统的初始建立,格式化操作,用户的切换,用户权限管理,删除目录树等新增加的功能(改进),完整地实现了课程设计所要求的基本功能:新建用户、文件、目录,删除文件、目录,进入、退出目录,文件的打开、读、写、关闭等。实现了完整地删除目录树的功能,命令提示符中能显示当前的用户和路径,用dir命令查看时能查看文件类型、长度,能统计当前目录下的文件个数及总大小、剩余空间和目录个数,还实现了切换用户的功能、格式化文件系统的功能。总之通过本次课程设计,加深了对操作系统的认识,不仅对理论。由于本次的模拟unix文件系统是在windows下运行,也引进了一些windowsAPI,当然本次课程仍然有一些实现和设计任务书有一定的出入。本次的unix文件系统是最多容纳5名用户,并且不是固定的5名用户,当输入用户名错误时,可以创建新的用户,并进入文件系统,但是退出后用户名和密码并不保存,只保存初始的用户名和密码,还有一个写文件功能并未实现,可以创建文件,可以读文件但不能往文件里写入内容,该功能后续我会继续做。 第5章 参考文献1. 汤子瀛,哲凤屏.计算机操作系统.西安电子科技大学学出版社.2. 王清,李光明.计算机操作系统.冶金工业出版社.3. 孙钟秀等. 操作系统教程. 高等教育出版社4.曾明. Linux操作系统应用教程. 陕西科学技术出版社. 5. 张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.6. 孟静,操作系统教程原理和实例分析. 高等教育出版社7. 周长林,计算机操作系统教程. 高等教育出版社8. 张尧学,计算机操作系统教程,清华大学出版社 第6章 附录(伪代码)FILE *vp;char buffer2048/8;int block,blk_offset;struct dir *dir_struct=new struct dir;char filebufferBSIZE*8;/-/第一层 balloc() 块分配函数 brelse() 块释放函数 bread() 读一块函数 bwrite() 写一块函数*/-/初始化文件系统void init()int i, flag=1,*k=new int;char p12=fh, pass4=fh2;if(vp=fopen(buffer,rb+)=NULL)vp=fopen(buffer,wb+);/初始化超级块fputc(128,vp);for(i=1;icur_dir0=F;cur_dir1=I;cur_dir2=L;cur_dir3=E; cur_dir4=:;for (i=5;i;/init struct fcbfor(i=0;iu_uid=HOST;u-u_gid=HOST;fseek(vp,DSIZE*15,0);/vp 指向根目录block=0;blk_offset=15;iget();/ printf(%d ,u-u_cdir-f_add0);u-u_base=NULL;u-u_count=0;u-u_error=NOERROR; for(int j=0;ju_ofilej=NULL;for(i=0;iBSIZE*8;i+)filebufferi=0; /init struct ofile*/for(i=0;iu_error=READERR; /* u为当前用户的 user 结构指针 */* 待读写块的块号*/void bwrite(int bno,char *buf)int nbyte; fseek(vp,bno*BSIZE,0); nbyte=fwrite(buf,BSIZE,1,vp); if(nbyte!=BSIZE)u-u_error=WRITEERR;/*块分配函数*/int balloc()FILE *f=vp;int i,j,k,t=1;for(i=0;iBLKMAX/8;i+)if(bufferi!=-1) for(j=1;jBLKMAX/8;j*=2)if (bufferi=(bufferi&(bufferi+j)bufferi+=j;for(k=1;k=8;k+)if(t=j) break;t*=2;vp=f; return i*8+8-k; /分配的块号if(i=BLKMAX/8)vp=f;return 0;/没有块分配/* 块释放函数*/void brelse(int blk)char zeroBSIZE+1;int bitno,bit_offset,xor=1,i;bitno=blk/8; bit_offset=blk%8;for(i=1;i8-bit_offset;i+)xor*=2;if(bufferbitno=(bufferbitno|xor)bufferbitno-=xor;for(i=0;if-addu-offset/BSIZE)和块内位移(即: u-offset%BSIZE),然后再调用笫一层的 bread()或 bwrite()实现真正的读/写;如 u-count较大(大于 BSIZE-u-offset%BSIZE),必须分多次读/写。*/-/ 文件查找函数void namei(char *route) FILE *f=vp;int i,oprtype=DIR;char *name=new char; fp-f_mode=u-u_cdir-f_mode;fp-f_blkno=u-u_cdir-f_blkno;fp-f_number=u-u_cdir-f_number;for(i=0;if_addi=u-u_cdir-f_addi;u-u_cdir=fp; if(*route=/|*route=)while(*route!=0)route+; for(i=0;iu_error=NOTFOUND)/没找到fp-;u-u_cdir=fp;fp+;fp-f_mode=0;return;return;if(*route!=/&*route!=)for(i=0;iu_cdir-f_addi=fcb-f_addi;while(*route!=0) for(i=0;iu_error=NOTFOUND)/没找到fp-;u-u_cdir=fp;fp+;fp-f_mode=0;return;/取目录结构函数(从文件中读出一指定的目录结构,建立相应fcb)void iget()/need block and blk_offset int i;fread(dir_struct,DSIZE,1,vp);fp-f_count+; fp-f_flag=ofile-o_flag;fp-f_blkno=block;fp-f_number=blk_offset;fp-f_mode=dir_struct-d_mode;fp-f_uid=dir_struct-d_uid;fp-f_gid=dir_struct-d_gid;fp-f_fsize=dir_struct-d_fsize;for(i=0;if_namei=dir_struct-d_namei;for(i=0;if_addi=dir_struct-d_addi;u-u_cdir=fp;fp+;/存目录结构函数(将一指定fcb结构写回文件卷的目录结构位置内)void iput()int i;fseek(vp,BSIZE*u-u_cdir-f_blkno+DSIZE*u-u_cdir-f_number,0);for(i=0;id_addi=(unsigned short)u-u_cdir-f_addi;dir_struct-d_fsize=(unsigned short)u-u_cdir-f_fsize; dir_struct-d_gid=u-u_cdir-f_gid; dir_struct-d_mode=u-u_cdir-f_mode; for(i=0;id_namei=u-u_cdir-f_namei; dir_struct-d_uid=u-u_cdir-f_uid;fwrite(dir_struct,DSIZE,1,vp); fp-;if(fp=fcb) u-u_cdir=fp;fp+;elsefp-;u-u_cdir=fp;fp+;fp-f_mode=0;for(i=0;if_addi)fp-f_addi=0;/-/第三层/*(3) 打开文件管理层。功能为涉及 ofile 结构的操作,设下列主要函数: openf() 为打开文件建立对应的ofile结构的函数 closef() 为关闭文件建立对应的ofile结构的函数*/-/为打开文件建立对应ofile结构的函数void openf(char *fname,int type)int i;namei(fname);iget();u-u_cdir-f_flag=type;for(i=0;iu_ofilei=NULL)u-u_ofilei-o_fcbp=u-u_cdir;u-u_ofilei-o_count+;return;if(i=FILES)printf(more files are opened, you should close one of themn);iput();/为关闭文件建立对应ofile结构的函数*/void closef(char *fname)iput();for(int i=0;iu_ofilei-o_fcbp-f_name,fname)u-u_ofilei-o_count-;u-u_ofilei=NULL;return;/-/第四层/* (4) 命令解释层。功能为接受来自用户的命令,并解释、执行用户提出的文件访问操作。按系统的功能要求,可以设置一系列的函数,如 fcreat()、fopen( )、fread()、fwrite()和 fclose() 等。*/-/ 列出文件系统的所有文件目录及文件void dir(char *route)int oprtype=DIR,i,j,num,tag=0;if(u-u_cdir-f_mode!=IFDIR)printf(you are operating on a file!n);return;if(route!=NULL)namei(route); if(u-u_error=NOTFOUND) printf(impossible routen); u-u_error=NOERROR; printcdir(oprtype,NULL); return;tag=1;printf(.n.n);for(i=0;i8;i+)for(j=0;ju_cdir-f_addi*BSIZE+DSIZE*j,0);fread(dir_struct,DSIZE,1,vp); if(dir_struct-d_mode=0) printf(n); printcdir(oprtype,NULL);if(tag) fp-f_mode=0;u-u_cdir=fp-1;return;/已经列完该目录下的文件if(dir_struct-d_mode=EMPTY)continue; if(dir_struct-d_mode=IFDIR)printf(); for(num=0;dir_struct-d_namenum!=0;num+) printf(%c,dir_struct-d_namenum);printf();printf(n);if(dir_struct-d_mode=IFREG)for(num=0;dir_struct-d_namenum!=0;num+) printf(%c,dir_struct-d_namenum);printf(n);/创建文件目录void md(char *route)int oprtype=MD,i,j,k;if(route=NULL)printf(dir name missingn); printcdir(oprtype,NULL);return;for(i=0;i8;i+)for(j=0;ju_cdir-f_addi*BSIZE+DSIZE*j,0);fread(dir_struct,DSIZE,1,vp);if(dir_struct-d_mode=IFDIR)if(!strcmp(dir_struct-d_name,route)printf(文件夹重名n); printcdir(oprtype,NULL);return;for(i=0;iu_cdir-f_addi=0)u-u_cdir-f_addi=balloc();for(j=0;ju_cdir-f_addi;blk_offset=j;fseek(vp,block*BSIZE+blk_offset*DSIZE,0);iget();if(u-u_cdir-f_mode=IFREG|u-u_cdir-f_mode=IFDIR)iput();continue; if(u-u_cdir-f_mode=0|u-u_cdir-f_mode=EMPTY)for(k=0;ku_cdir-f_addk=0;u-u_cdir-f_fsize=0; u-u_cdir-f_gid=u-u_gid; u-u_cdir-f_uid=u-u_uid; u-u_cdir-f_mode=IFDIR;u-u_cdir-f_fsize=0;u-u_cdir-f_blkno=(u-u_cdir-1)-f_addi;u-u_cdir-f_number=j; for(k=0;ku_cdir-f_namek=routek;else u-u_cdir-f_namek=0; iput(); u-u_cdir-f_fsize+; cdirstruct();fseek(vp,u-u_cdir-f_blkno*BSIZE+u-u_cdir-f_number*DSIZE,0);fwrite(dir_struct,DSIZE,1,vp);printcdir(oprtype,NULL);return;/删除目录void rd(char *route)FILE *f=vp;int oprtype=RD,j,i,bk=0,number;if(route=NULL)rdwholedir();u-u_cdir-f_fsize=0;cdirstruct();fseek(vp,u-u_cdir-f_blkno*BSIZE+u-u_cdir-f_number*DSIZE,0);fwrite(dir_struct,DSIZE,1,vp);printcdir(oprtype,NULL);return; for(i=0;i8;i+)number=0;for(j=0;ju_cdir-f_addi*BSIZE+j*DSIZE,0);block=u-u_cdir-f_addi;blk_offset=j;iget();if(u-u_cdir-f_mode!=IFDIR)if(u-u_cdir-f_mode=IFREG)number+;iput();continue; elsenumber+; if(!strcmp(u-u_cdir-f_name,route)bk=1;else iput();if(bk)break;if(i=8)printf(impossible dir namenn); printcdir(oprtype,NULL);return;rdwholedir();number-;u-u_cdir-f_mode=EMPTY;iput(); u-u_cdir-f_fsize-;if(number=0|u-u_cdir-f_fsize=0)brelse(u-u_cdir-f_addi); u-u_cdir-f_addi=0; cdirstruct();fseek(vp,u-u_cdir-f_blkno*BSIZE+u-u_cdir-f_number*DSIZE,0);fwrite(dir_struct,DSIZE,1,vp);printcdir(oprtype,NULL);/设置要打开的目录void cd(char *route) int oprtype=DIR,i; if(route=NULL)printf(need routen);printcdir(oprtype,NULL);return;for(i=0;i8;i+)for(int j=0;ju_cdir-f_addi*BSIZE+DSIZE*j,0);fread(dir_struct,DSIZE,1,vp);if(dir_struct-d_mode=IFREG)continue;if(dir_struct-d_mode=0)break;if(!strcmp(dir_struct-d_name,route)fseek(vp,u-u_cdir-f_addi*BSIZE+DSIZE*j,0);block=u-u_cdir-f_addi;blk_offset=j;iget(); oprtype=CD;printf(n);printcdir(oprt

温馨提示

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

评论

0/150

提交评论