操作系统文件系统课程设计报告后附对源代码副本.doc

上传人:本田雅阁 文档编号:2106469 上传时间:2019-02-14 格式:DOC 页数:42 大小:394.52KB
返回 下载 相关 举报
操作系统文件系统课程设计报告后附对源代码副本.doc_第1页
第1页 / 共42页
操作系统文件系统课程设计报告后附对源代码副本.doc_第2页
第2页 / 共42页
操作系统文件系统课程设计报告后附对源代码副本.doc_第3页
第3页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《操作系统文件系统课程设计报告后附对源代码副本.doc》由会员分享,可在线阅读,更多相关《操作系统文件系统课程设计报告后附对源代码副本.doc(42页珍藏版)》请在三一文库上搜索。

1、计算机操作系统 课程设计报告 设计项目名称: 文件系统设计 专 业: 网络工程 班 级: 201001 学 号: 201026340117;201026340121 姓 名: 张世波 赵流男 指 导 教 师: 张 瑞 红 目录1 课程设计简介11.1 课程设计的目的11.2 课程设计内容12 数据结构的设计22.1 预定义22.2 结构体22.3 全局变量和函数23 功能模块(或算法)描述33.1 模块划分43.2 模块流程图64 程序运行结果45心得体会5参考文献6附源代码72.1 课程设计简介1.1 课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及

2、其操作方法的特点。通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。1.2 课程设计内容课程设计内容设计一个简单的多用户文件系统。即在系统中用一个文件来模拟一个磁盘;此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。实现这个文件系统。能实际演示这个文件系统。基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行

3、用户可以打开5个文件。2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。4)因系统小,文件目录的检索使用了简单的线性搜索。5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。 2 数据结构的设计2.1 预定义#define BLOCKSIZ 512/磁盘块的

4、大小#define DATABLKNUM 512/数据块的数目#define BLKGRUPNUM50/数据块组包含多少数据块#define P_N_BLOCKS15/inode节点中 指向数据块的指针个数#defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 /数据块组 组数#define DINODESIZ 512/磁盘i结点区的大小(空间32512)#define DINODENUM 32/磁盘i结点区的块数#define SYSOPENFILE 40#define DIRNUM 32/一个目录下的最多目录和文件的总和数#define DIRSIZ 14/文件、目录

5、名的长度(字节)#define UPWDSIZ 15/密码的长度#define UNAMSIZ 15/用户名的长度#define PWDSIZsizeof(struct pwd) /密码结构的长度 #define PWDNUM BLOCKSIZ/PWDSIZ/密码数据空间的大小(pwd为单位)#define NOFILE 20/一个用户最多可以打开的文件数目#define DINODESTART 4*BLOCKSIZ/i结点区的开始地址-inodes table ,1引导 2超块 3block bitmap 4inode bitmap #define DATASTART (2+DINODENU

6、M)*BLOCKSIZ/数据区的开始地址#defineDATASTARTNO36/数据区开始指针#define DIMODE_EMPTY00000/*可以用的空间*/#define DIMODE_FILE00001#define DIMODE_DIR 00002#define DIMODE_PASSWD00004#define GRUP_00/管理员组#define GRUP_11#define GRUP_22#define GRUP_442.2 结构体/磁盘i结点结构,struct inode/ chardi_nameDIRSIZ; unsigned _int16 di_ino;/*磁盘i节

7、点标识*/ unsigned _int16 di_number;/*关联文件数,当为0时表示删除文件*/ unsigned _int16 di_mode;/*存取权限*/ unsigned _int16 di_uid;/*磁盘i节点用户id*/ unsigned _int16 di_gid;/*磁盘i节点权限组id*/ /1管理员组 2用户组 unsigned _int32 di_size;/*文件大小*/ unsigned _int32 di_ctime; /* Creation time */ unsigned _int32 di_mtime; /* Modification time *

8、/ unsigned _int16 di_blockP_N_BLOCKS; /* 一组 block 指针 */ ;/目录项结构struct directchard_nameDIRSIZ;/*目录名(14字节)*/_int16 d_ino;/*目录号*/;/超级快结构struct super_blockunsigned _int16 s_inodes_count; /* inodes 计数 */unsigned _int16 s_blocks_count; /* blocks 计数 */unsigned _int16 s_r_blocks_count; /* 保留的 blocks 计数 */un

9、signed _int16 s_free_blocks_count; / 空闲的 blocks 计数 unsigned _int16 s_free_inodes_count; /* 空闲的 inodes 计数 */unsigned _int16 s_free_blocks_groupGROUPNUM;/新增 一个数组来记录每个数据块组中的空闲数据块计数 unsigned _int16 s_first_data_block; /* 第一个数据 block */unsigned _int16 s_log_block_size; /* block 的大小 */unsigned _int16 s_bl

10、ocks_per_group; /* 每 block group 的 block 数量 */unsigned _int16 s_inodes_per_group; /* 每 block group 的 inode 数量 */;/用户密码struct pwdunsigned _int8 p_uid;unsigned _int8 p_gid;char usernameUNAMSIZ;/*用户名 新加的*/ char passwordUPWDSIZ;/目录结构struct dirstruct direct directDIRNUM;_int16 size;2.3 全局变量和函数/全局变量unsign

11、ed _int8 di_bitmapDINODENUM;/ 硬盘inode节点位图1表示已使用 0表示未使用unsigned _int8bk_bitmapDATABLKNUM;/ 数据块block位图 struct super_block filsys;/超级块struct pwd pwdPWDNUM;FILE *fd;/文件指针struct inode *cur_inode;/i节点当前目录指针struct inode *inodetemp;/i节点指针const char fsystemname20=Linux.EXT2;/模拟硬盘的文件名struct direct dir_bufBLOC

12、KSIZ / sizeof(struct direct);/目录数组char cmdhead20;/cmd 的头 表示所在哪个文件夹、int i_lock=0;/inode位图锁 可能会多线程int b_lock=0;/block位图锁struct pwd *cur_user;/*全局函数*/extern intFormat();/格式化磁盘extern intInstall();/启动,安装文件系统struct inode * read_inode(int);/install里面读取文件dinodestruct direct * read_dir_data(int);/读取存储文件夹的物理块

13、extern void showdir();/命令 dirint Enterdir(char);/进入某个文件夹 命令- cd 文件名int Fd_dirfile(char);/查找当前目录里的文件 没找到返回-1 找到返回inode号int Iscmd(char);/判断是否两个字符串的命令void two_cmd(char,char);/两个字符串的命令int creat(char);/创建文件void changeinode();/交换指针char * ReadFile(char);/读取文件int mkdir(char);/创建文件夹void showbitmap();/显示位图int

14、 deletefd(char);/删除文件int editfile(char);/编辑文件int rename(char);/重命名void showhelp();/命令帮助void login();void logout();int access();/权限判断/*磁盘i节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之前,应为该文件分配存放该文件说明信息的磁盘i节点,当从文件系统中删除某个文件时,应首先删除它的磁盘i节点项。)*/ intialloc();/*开辟一个空闲的i节点,返回i节点*/磁盘块分配与释放函数intballoc(int);/申请硬盘空间结构体说明:

15、硬盘模拟文件:每个数据块512字节,第一个数据块空闲备用,第2块是超级块,第3块是inode位图,第4块是block位图,第5块开始有32块是inode节点,然后是数据区block,512块。超级块:存放整个文件系统的基本状态,如:inode块数,block总块数,空闲的block计数,空闲的inode计数,每个数据块组中的空闲块数(为block分组,便于读取),每个block的大小(512字节),每个数据块组的block块数。Inode位图:用一个数组来描述每个inode的使用状况,1表示被占用,0表示空闲。Block位图:用一个数组来描述每个数据区的block的使用状况,1表示被占用,0表

16、示空闲。inode节点:inode记录了文件或者目录在数据区存放位置,是文件还是目录,是否系统文件,属于管理员组还是普通用户组,是由谁创建的,创建时间等。如果是目录,则还记录了里面包含多少个文件或子目录。是文件则记录了文件的大小。读取文件要先通过inode然后找到block,才能读取。Block数据块:存放文件的地方,如果是目录则记录了这个目录下所有的文件和子目录的名称和所占的inode如果是文本文档,则是字节流文件。3 功能模块(或算法)描述我负责整体设计,实现底层具体设计,format格式化,install安装,login登录,ialloc申请inode空间,balloc申请block空间

17、。3.1 format 格式化只写打开模拟文件,初始化超级快,初始化dinode位图 block位图,初始化主目录,初始化etc目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd文件,写入模拟硬盘文件。3.2 install 安装读写打开模拟文件,读取dinode位图 block位图,读取主目录,读取etc目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd文件。 3.3 login 登陆用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。登录流程图3.4 iall

18、oc 申请inode空间先检测inode位图是否加锁,是则退出。加锁,检测inode空间是否还有已满,是则退出。在inode位图中顺序查找空闲的inode,找到则返回inode地址,block解锁。函数结束。流程图3.3登录流程图ialloc 流程图3.3balloc流程图3.43.5 balloc 申请block空间先检测block位图是否加锁,是则退出。加锁,检测block空间是否还有k个空闲,否则退出。在还有空闲block的组中查找是否有k个空闲,没有则去下一个block组中查找,找到则返回block地址,block解锁。函数结束。流程图3.43.5 create 创建文本文件查找当前目

19、录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以#结束。申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。流程图3.53.7 cdir 创建文件夹查找当前目录下是否有同名文件,是则退出,否则,申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件夹内容写入inode空间和block空间。修改当前目录的结构,修改超级快,修改inode位图,block位图,写

20、入模拟硬盘。3.7 read edit 读取和追加文本文件Read-查找当前目录下是否该文件,没有则退出,否则调用access()权限判断,有权限则判断是不是文件,不是则退出,是文件则读取文件并显示。Edit-调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个block则申请block空间,失败则退出,申请成功则保存文件。3.8 access(文件名) 权限判断先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权限如果该文件是用

21、户可查看文件则都具有权限。3.9 cd 进入子目录 或上级目录查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的inode,将当前目录指向该目录。3.10 attr(文件名)查看文件或者文件夹的属性先查找当前目录下是否有该文件或目录,有则判断文件是否系统文件,是否文本文件,是否目录,由谁创建,属于什么组,占用的block,和inode。将其全部显示出来。3.9 del 删除文件或目录查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接

22、删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。提示用户是否删除,确认则删除文件,修改当前文件夹inode,block结构,修改该文件占有的inode和block位图为0,修改超级块,写入模拟硬盘。流程图3.93.8 access(文件名) 权限判断先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权限如果该文件是用户可查看文件则都具有权限。4 程序运行结果1格式化 和登录界面 登录后显示帮助信息 ,进入到用户文件

23、夹下2 dir命令-显示当前目录下的文件和目录3 logout命令-注销用户普通用户无法进入admin管理员目录。5心得体会操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在

24、设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不过设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我学得到很多实用的知识,再次我表示感谢!同时,对给过我们帮助的所有同学和各位指导老师再次表示忠心的感谢!参考文献1 袁庆龙,候文义Ni-P合金镀层组织形貌及显微硬度研究太原理工大学学报,2001,32(1):51-53.(连续出版物:序号 主要责任者文献题名J刊名,出版年份,卷号(期号):起止页码)2刘国钧,王连成图书馆史研究北京:高等教育出版社,1979:15-18,31(专著:序号 主要责任者文献题名

25、出版地:出版者,出版年:起止页码)3 孙品一高校学报编辑工作现代化特征中国高等学校自然科学学报研究会科技编辑学论文集(2)北京:北京师范大学出版社,1998:10-22(论文集:序号 主要责任者文献题名主编论文集名出版地:出版者,出版年:起止页码)附:源代码/*makefile*/filsys:main.o igetput.o iallfre.o ballfre.o name.o acess.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.occ -o filsys ma

26、in.o igetput.o iallfre.o ballfre.o name.o acess.o log.o close.o create.o delete.o dir.o dirlt.o open.o rdwt.o format.o install.o halt.o main.o:main.c filesys.h cc -c main.cigetput.o:igetput.c filesys.h cc -c igetput.ciallfre.o:iallfre.c filesys.h cc -iallfre.cballfre.o:ballfre.c filesys.h cc -c ame.

27、o:name.c filesys.h cc -c name.caccess.o:access.c filesys.h cc -c access.clog.o:log.c filesys.h cc -c log.cclose.o:close.c filesys.h cc -c close.ccreate.o:create.c filesys.h cc -c create.cdelete.o:delete.c filesys.h cc -c delete.c dir.o:dir.c filesys.h cc -c dir.c dirlt.o:dirlt.c filesys.h cc -c dirl

28、t.copen.o:open.c filesys.h cc -c open.crdwt.o:rdwt.c filesys.h cc -c rdwt.cformat.o:format.c filesys.h cc -c format.c install.o:install.c filesys.h cc -c install.c halt.o:halt.c cc -c halt.c/*filesys.h*/#define BLOCKSIZ 512#define SYSOPENFILE 40#define DIRNUM 128#define DIRSIZ 14#define PWDSIZ 12#de

29、fine PWDNUM 32#define NOFILE 20#define NADDR 10#define NHINO 128#define USERNUM 10#define DINODESIZ 32/*filesys*/#define DINODEBLK 32 #define FILEBLK 512#define NICFREE 50#define NICINOD 50#define DINODESTART 2*BLOCKSIZ#define DATASTART(2+DINODEBLK)*BLOCKSIZ/*di_mode*/#define DIEMPTY 0000#define DIF

30、ILE 01000#define DIDIR 02000#define UDIREAD 00001#define UDIWAITE 00002#define UDIEXICUTE 00004#define GDIREAD 00010#define GDIWRITE 00020#define GDIEXICUTE 00040#define ODIREAD 00100#define ODIWRITE 00200#define ODIEXICUTE 00400#define READ 1#define WRITE2#define EXICUTE 4#define DEFAULTMODE 00777/

31、*i_flag*/#define IUPDATE 00002/*s_fmod*/#define SUPDATE 00001/*f_flag*/#define FREAD 00001#define FWRITE 00002#define FAPPEND 00004/*error*/#define DISKFULL 65535/*fseek origin*/#define SEEK_SET 0sruct inodestruct inode *i_forw;struct inode*i_back;char i_flag;unsigned int i_ino;unsigned int i_count;

32、unsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned int di_size;unsigned int di_addrNADDR; ; struct dinodeunsigned short di_number;unsigned short di_mode;unsigned short di_uid;unsigned short di_gid;unsigned long di_size;unsigned int di_addrNADDR;struc

33、t directunsigned d_nameDIRSIZ;unsigned int d_ino;struct filsysunsigned short s_isize;unsigned long s_fsize;unsigned int s_nfree;unsigned short s_pfree;unsigned int s_freeNICFREE;unsigned int s_ninode;unsigned short s_pinode;unsigned int s_inodeNICINOD;unsigned int s_finode;char s_fmod; struct pwduns

34、igned short p_uid;unsigned short p_gid;unsigned passwordPWOSIZ;struct dirstruct direct directDIRNUM;int size;struct hinodestruct inode* i_forw;struct filechar f_flag;unsigned int f_count;struct inode *f_inode;unsigned long f_off;struct userunsigned short u_default_mode;unsigned short u_uid;unsigned

35、short u_gid;unsigned short u_ofileNOFILE;extern struct hinode hinodeNHINO;extern struct dir dir;extern struct file sys_ofileSYSOPENFILE;extern struct filsys filsys;extern struct pwd pwdPWDNUM;extern struct user userUSERNUM;extern FILE *fd;extern struct inode *cur_path_inode;extern int user_id,file_b

36、lock;extern struct inode *iget();extern iput();extern unsigned int balloc();extern bfree();extern struct inode *ialloc();extern ifree();extern unsigned int namei(); extern unsigned int iname();extern unsigned int access();extern _dir();extern mkdir();extern chdir();extern dirlt();extern unsigned sho

37、rt open(); extern create();extern unsigned int read();extern unsigned write();extern int login();extern logout();extern install();extern format();extern close();extern halt();#include#include#includefilesys.hstruct hinode hinodeNHINO;struct dir dir;struct file sys_ofileSYSOPENFILE;struct filsys fils

38、ys;struct pwd pwdPWDNUM;struct user userPWDNUM;FILE *fd;struct inode* cur_path_inode;int user_id,file_block;main() unsigned short ab_fd1,ab_fd2,ab_fd3,ab_fd4;unsigned short bhy_fd1;char *buf;printf(nDo you want to format the diskn);if(getchat()=y)printf(Format will erase all context on the disk.Are

39、you sure?n);getchar();elsereturn;if(getchar()=y)formar();elseretrun;install();_dir();login(2118,abcd);user_id=0;mkdir(a2118);chdir(a2118);ab_fd1=creat(user_id,file0.c,01777);file_block=BLOCKSIZ*6+5;buf=(char*)malloc(BLOCKSIZ*6+5);write(ab_fd1,buf,BLOCKSIZ*6+5);close(user_id,ab_fd1);free(buf);mkdir(s

40、ubdir);chdir(subdir);ab_fd2=creat(user_id,file1.c,01777);file_block=BLOCKSIZ*4+20;buf=(char*)malloc(BLOCKSIZ*4+20);write(ab_fd2,buf,BLOCKSIZ*4+20);close(user_id,ab_fd2);free(buf);chdir(.);ab_fd3=creat(user_id,file2.c,01777);file_block=BLOCKSIZ*3+255;buf=(char*)malloc(BLOCKSIZ*3+255);write(ab_fd3,buf

41、,BLOCKSIZ*3+255);close(user_id,ab_fd3);free(buf);_dir();delete(ab_file0.c);ab_fd4=creat(user_id,file3.c,01777);file_block=BLOCKSIZ*8+300;buf=(char*)malloc(BLOCKSIZ*8+300);write(ab_fd4,buf,BLOCKSIZ*8+300);close(user_id,ab_fd4);free(buf);_dir();ab_fd3=open(user_id,file2.c,FAPPEND);file_block=BLOCKSIZ*

42、3+100;buf=(char*)malloc(BLOCKSIZ*3+100);write(ab_fd3,buf,BLOCKSIZ*3+100);close(user_id,ab_fd3);free(buf);_dir();chdir(.);logout();halt();#include#includefilesys.hformat()struct inode *inode;struct direct dir_bufBLOCKSIZ/(DIRSIZ+2);struct files;unsigned int block_bufBLOCKSIZ/sizeof(int);char *buf;int

43、 i,j;fd=fopen(filesystem,r+w+b);buf=(char*)malloc(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char);if(buf=NULL)printf(nfile system file creat failed! n);exit(0);fseek(fd,0,SEEK_SET);fwrite(buf,1,(DINODEBLK+FILEBLK+2)*BLOCKSIZ*sizeof(char),fd);pwd0.p_uid=2116;pwd0.p_gid=03;strcpy(pwd0.password,dddd);pwd1.p_uid=2117;pwd1.p_gid=03;strcp

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1