操作系统课程设计报告虚拟文件系统的实现后附源代码.doc

上传人:文库蛋蛋多 文档编号:2388277 上传时间:2023-02-17 格式:DOC 页数:43 大小:242.50KB
返回 下载 相关 举报
操作系统课程设计报告虚拟文件系统的实现后附源代码.doc_第1页
第1页 / 共43页
操作系统课程设计报告虚拟文件系统的实现后附源代码.doc_第2页
第2页 / 共43页
操作系统课程设计报告虚拟文件系统的实现后附源代码.doc_第3页
第3页 / 共43页
操作系统课程设计报告虚拟文件系统的实现后附源代码.doc_第4页
第4页 / 共43页
操作系统课程设计报告虚拟文件系统的实现后附源代码.doc_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《操作系统课程设计报告虚拟文件系统的实现后附源代码.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计报告虚拟文件系统的实现后附源代码.doc(43页珍藏版)》请在三一办公上搜索。

1、甘肃政法学院计算机操作系统课程设计题 目 虚拟文件系统的实现计算机科学学院 计算机科学与技术 专业 10 级 计算科学与技术本科 班 姓 名:_ _指导教师:_ _ 成 绩:_ _完成时间:_2013 年 7 月目录第一章 课程设计简介11.1 课程设计的目的11.2 课程设计内容1第二章 数据结构的设计22.1 预定义22.2 结构体22.3 全局变量和函数42.4结构体说明5第三章 功能模块(或算法)描述53.1 format 格式化53.2 install 安装63.3 login 登陆63.4 ialloc 申请inode空间63.5 balloc 申请block空间63.6 crea

2、te 创建文本文件73.7 cdir 创建文件夹73.8 edit 读取和追加文本文件73.9 access(文件名) 权限判断73.10 cd 进入子目录 或上级目录83.11 attr(文件名)查看文件或者文件夹的属性83.12 del 删除文件或目录8第四章 程序运行结果84.1格式化 和登录界面84.2 ls命令-显示当前目录下的文件和目录94.3 logout命令-注销用户9第五章 心得体会9参考文献10附:源代码11第一章 课程设计简介1.1 课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。通过模拟文件系统的实现,深入理解

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

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

5、盘块的大样#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/文件

6、、目录名的长度(字节)#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+DINOD

7、ENUM)*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;/*磁

8、盘i节点标识*/ 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 tim

9、e */ 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 计数 *

10、/unsigned _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

11、_blocks_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 全局变量和函数/全局变量uns

12、igned _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_bufB

13、LOCKSIZ / 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);/读取存储文件夹的

14、物理块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();/显示位图

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

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

17、ck的使用状况,1表示被占用,0表示空闲。(5)inode节点:inode记录了文件或者目录在数据区存放位置,是文件还是目录,是否系统文件,属于管理员组还是普通用户组,是由谁创建的,创建时间等。如果是目录,则还记录了里面包含多少个文件或子目录。是文件则记录了文件的大样。读取文件要先通过inode然后找到block,才能读取。(6)Block数据块:存放文件的地方,如果是目录则记录了这个目录下所有的文件和子目录的名称和所占的inode,如果是文本文档,则是字节流文件。第三章 功能模块(或算法)描述3.1 format 格式化只写打开模拟文件,初始化超级快,初始化dinode位图 block位图,

18、初始化主目录,初始化etc目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd文件,写入模拟硬盘文件。3.2 install 安装读写打开模拟文件,读取dinode位图 block位图,读取主目录,读取etc目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd文件。 3.3 login 登陆用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。登录流程图3.2。3.4 ialloc 申请inode空间先检测inode位图是否加锁,是则退出。加锁,检测inode空间是否还

19、有已满,是则退出。在inode位图中顺序查找空闲的inode,找到则返回inode地址,block解锁。函数结束。流程图3.3。 登录流程图3.2 ialloc 流程图3.3balloc流程图3.43.5 balloc 申请block空间先检测block位图是否加锁,是则退出。加锁,检测block空间是否还有k个空闲,否则退出。在还有空闲block的组中查找是否有k个空闲,没有则去下一个block组中查找,找到则返回block地址,block解锁。函数结束。流程图3.4。3.6 create 创建文本文件查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以#结束。申请inod

20、e空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件内容写入inode空间和block空间。修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。如图4所示:图4 create创建文本文件3.7 cdir 创建文件夹查找当前目录下是否有同名文件,是则退出,否则,申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。将文件夹内容写入inode空间和block空间。修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。rootetcyangfxb#cdir

21、 caobinhui1已经找到空闲的block 7 它在第0组当前目录文件数33.8 edit 读取和追加文本文件Edit-调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个block则申请block空间,失败则退出,申请成功则保存文件。3.9 access(文件名) 权限判断 先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。如果是该用户创建的 则有读写权限如果当前用户是管理员组的 也具有读写权限如果该文件是用户可查看文件则都具有权限。3.10 cd 进入子目录 或上级目录查找当前目录是否有该

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

23、断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。提示用户是否删除,确认则删除文件,修改当前文件夹inode,block结构,修改该文件占有的inode和block位图为0,修改超级块,写入模拟硬盘。rootetcyangfxb#del caobinhui是否真的要删除 caobinhui ?y0 7rootetcyangfxb#cd caobinhui未找到该文件!请输入正确的文件或目录名进入目录失败!rootetcyangfxb#第四章 程序运行结果4.1格式化 和登录界面登录后显示帮助信息 ,进入到用户文件夹下,如图5所示:图5 格式化及登录界面4.2 ls命令-显示当

24、前目录下的文件和目录rootetcyangfxb#ls . inode 6 . inode 4rootetcyangfxb#4.3 logout命令-注销用户rootetc#logout用户名:普通用户无法进入admin管理员目录。第五章 心得体会 操作系统课程设计是本课程重要的实践教学环节。课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正

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

26、责任者文献题名出版地:出版者,出版年:起止页码)3 孙品一高校学报编辑工作现代化特征中国高等学校自然科学学报研究会科技编辑学论文集(2)北京:北京师范大学出版社,1998:10-22(论文集:序号 主要责任者文献题名主编论文集名出版地:出版者,出版年:起止页码)附:源代码#include #include #include #include #include #include #define BLOCKSIZ 512/磁盘块的大样#define DATABLKNUM 512/数据块的数目#define BLKGRUPNUM50/数据块组包含多少数据块#define P_N_BLOCKS15/i

27、node节点中 指向数据块的指针个数#defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1 /数据块组 组数#define DINODESIZ 512/磁盘i结点区的大样(空间32512)#define DINODENUM 32/磁盘i结点区的块数#define SYSOPENFILE 40#define DIRNUM 32/一个目录下的最多目录和文件的总和数#define DIRSIZ 14/文件、目录名的长度(字节)#define UPWDSIZ 15/秘密的长度#define UNAMSIZ 15/用户名的长度#define PWDSIZsizeof(struct

28、pwd) /密码结构的长度 #define PWDNUM BLOCKSIZ/PWDSIZ/密码数据空间的大样(pwd为单位)#define NOFILE 20/一个用户最多可以打开的文件数目#define NHINO 128#define USERNUM 10/用户名的长度#define DINODESTART 4*BLOCKSIZ/i结点区的开始地址-inodes table ,1引导 2超块 3block bitmap 4inode bitmap #define DATASTART (2+DINODENUM)*BLOCKSIZ/数据区的开始地址#defineDATASTARTNO36/数据

29、区开始指针/* di._mode */#define DIMODE_EMPTY00000/*可以用的空间*/#define DIMODE_FILE00001#define DIMODE_DIR 00002#define DIMODE_PASSWD00004#define DIMODE_SYSTEM00040/*系统文件*/#define DIMODE_READ 00010/* READ 和该数与操作后得到的是可以读该文件的用户组*/#define DIMODE_WRITE 00020/* WRITE */#define DIMODE_EXICUTE 01000/* EXICUTE */#def

30、ine DIMODE_ADMIN00100/*管理员权限*/#define DIMODE_SHARE00200/*不需要权限*/*组*/#define GRUP_00/管理员组#define GRUP_11#define GRUP_22#define GRUP_44/* 文件系统 数据结构 */*磁盘i结点结构,*/struct inode/ chardi_nameDIRSIZ; unsigned _int16 di_ino;/*磁盘i节点标识*/ unsigned _int16 di_number;/*关联文件数,当为0时表示删除文件*/ unsigned _int16 di_mode;/*

31、存取权限*/ 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 */ unsigned _int16 di_blockP_N_BLOCKS; /* 一组 block 指针 */ ;/*目录项结构*/struct direct

32、chard_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 计数 */unsigned _int16 s_free_blocks_count; / 空闲的 blocks 计数 unsigned _int16 s_free

33、_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_blocks_per_group; /* 每 block group 的 block 数量 */unsigned _int16 s_inodes_pe

34、r_group; /* 每 block group 的 inode 数量 */;/*用户密码*/struct pwdunsigned _int8 p_uid;unsigned _int8 p_gid;char usernameUNAMSIZ;/*用户名 新加的*/ char passwordUPWDSIZ;/*目录结构*/struct dirstruct direct directDIRNUM;_int16 size;/全局变量unsigned _int8 di_bitmapDINODENUM;/ 硬盘inode节点位图 1表示已使用 0表示未使用unsigned _int8bk_bitmap

35、DATABLKNUM;/ 数据块block位图 struct super_block filsys;/超级块struct pwd pwdPWDNUM;/struct user userUSERNUM;/int usernum;FILE *fd;/文件指针struct inode *cur_inode;/i节点当前目录指针/struct dinode *dinodef;/全局硬盘节点指针struct inode *inodetemp;/i节点指针/struct inode *inodetemp2;const char fsystemname20=Linux.EXT2;/模拟硬盘的文件名struc

36、t direct dir_bufBLOCKSIZ / 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_da

37、ta(int);/读取存储文件夹的物理块extern void showdir();/命令 dirint Enterdir(char);/进入某个文件夹 命令- cd 文件名int Fd_dirfile(char);/查找当前目录里的文件 没找到返回-1 找到返回inode号int Iscmd(char);/判断是否两个字符串的命令void cmd_Up(char,char);/两个字符串的命令int creat(char);/创建文件void changeinode();/交换指针char * ReadFile(char);/读取文件int cdir(char);/创建文件夹void sho

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

39、int);/申请硬盘空间void showaccess(char strname20);/内存i节点的获取与释放 /extern struct inode *iget(unsigned int);/*获取hino位置的i节点,返回i节点指针*/extern void iput(struct inode* );/*将i节点 释放或是写入磁盘*/#endifvoid main()char str10;char strname10;char c;printf(是否格式化?);scanf(%c,&c);fflush(stdin);if(c=y)if(!Format()return;printf(格式化

40、完毕!n);if(!Install()return;printf(login.n);login();showhelp();printf(%s,cmdhead);while(1)scanf(%s,&str);if(strcmp(str,exit)=0)fclose(fd);return;elseif(strcmp(str,dir)=0)showdir();else if(strcmp(str,bit)=0)showbitmap();else if(strcmp(str,help)=0)showhelp();else if(strcmp(str,logout)=0)logout();elseif(Iscmd(str)scanf(%s,&strname);cmd_Up(str,strname);elseprintf(错误命令!n);printf(%s,cmdhead);/-格式化-int Format()struct pwd passwd BLOCKSIZ/PWDSIZ;

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号