操作系统文件系统课程设计报告后附源代码.docx
《操作系统文件系统课程设计报告后附源代码.docx》由会员分享,可在线阅读,更多相关《操作系统文件系统课程设计报告后附源代码.docx(70页珍藏版)》请在冰豆网上搜索。
![操作系统文件系统课程设计报告后附源代码.docx](https://file1.bdocx.com/fileroot1/2023-5/24/b8624cc2-b002-46ec-9d82-7ef6ee93f7bd/b8624cc2-b002-46ec-9d82-7ef6ee93f7bd1.gif)
操作系统文件系统课程设计报告后附源代码
1课程设计简介
1.1课程设计的目的
课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识,加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
1.2课程设计内容
课程设计内容设计一个简单的多用户文件系统。
即
①在系统中用一个文件来模拟一个磁盘;
②此系统至少有:
Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。
④能实际演示这个文件系统。
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。
1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。
2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。
另外,为打开文件设置了运行文件目录(AFD)。
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。
4)因系统小,文件目录的检索使用了简单的线性搜索。
5)文件保护简单使用了三位保护码:
允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
6)程序中使用的主要设计结构如下:
主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。
2数据结构的设计
2.1预定义
#defineBLOCKSIZ512//磁盘块的大小
#defineDATABLKNUM512//数据块的数目
#defineBLKGRUPNUM50//数据块组包含多少数据块
#defineP_N_BLOCKS15//inode节点中指向数据块的指针个数
#defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1//数据块组组数
#defineDINODESIZ512//磁盘i结点区的大小(空间32×512)
#defineDINODENUM32//磁盘i结点区的块数
#defineSYSOPENFILE40
#defineDIRNUM32//一个目录下的最多目录和文件的总和数
#defineDIRSIZ14//文件、目录名的长度(字节)
#defineUPWDSIZ15//密码的长度
#defineUNAMSIZ15//用户名的长度
#definePWDSIZsizeof(structpwd)//密码结构的长度
#definePWDNUMBLOCKSIZ/PWDSIZ//密码数据空间的大小(pwd为单位)
#defineNOFILE20//一个用户最多可以打开的文件数目
#defineDINODESTART4*BLOCKSIZ
//i结点区的开始地址-inodestable,1引导2超块3blockbitmap4inodebitmap
#defineDATASTART(2+DINODENUM)*BLOCKSIZ//数据区的开始地址
#defineDATASTARTNO36//数据区开始指针
#defineDIMODE_EMPTY00000/*可以用的空间*/
#defineDIMODE_FILE00001
#defineDIMODE_DIR00002
#defineDIMODE_PASSWD00004
#defineGRUP_00//管理员组
#defineGRUP_11
#defineGRUP_22
#defineGRUP_44
2.2结构体
//磁盘i结点结构,
structinode{
//chardi_name[DIRSIZ];
unsigned__int16di_ino;/*磁盘i节点标识*/
unsigned__int16di_number;/*关联文件数,当为0时表示删除文件*/
unsigned__int16di_mode;/*存取权限*/
unsigned__int16di_uid;/*磁盘i节点用户id*/
unsigned__int16di_gid;/*磁盘i节点权限组id*///1管理员组2用户组
unsigned__int32di_size;/*文件大小*/
unsigned__int32di_ctime;/*Creationtime*/
unsigned__int32di_mtime;/*Modificationtime*/
unsigned__int16di_block[P_N_BLOCKS];/*一组block指针*/
};
//目录项结构
structdirect{
chard_name[DIRSIZ];/*目录名(14字节)*/
__int16d_ino;/*目录号*/
};
//超级快结构
structsuper_block{
unsigned__int16s_inodes_count;/*inodes计数*/
unsigned__int16s_blocks_count;/*blocks计数*/
unsigned__int16s_r_blocks_count;/*保留的blocks计数*/
unsigned__int16s_free_blocks_count;//空闲的blocks计数
unsigned__int16s_free_inodes_count;/*空闲的inodes计数*/
unsigned__int16s_free_blocks_group[GROUPNUM];//新增一个数组来记录每个数据块组中的空闲数据块计数
unsigned__int16s_first_data_block;/*第一个数据block*/
unsigned__int16s_log_block_size;/*block的大小*/
unsigned__int16s_blocks_per_group;/*每blockgroup的block数量*/
unsigned__int16s_inodes_per_group;/*每blockgroup的inode数量*/
};
//用户密码
structpwd{
unsigned__int8p_uid;
unsigned__int8p_gid;
charusername[UNAMSIZ];/*用户名新加的*/
charpassword[UPWDSIZ];
};
//目录结构
structdir{
structdirectdirect[DIRNUM];
__int16size;
};
2.3全局变量和函数
//全局变量
unsigned__int8di_bitmap[DINODENUM];//硬盘inode节点位图1表示已使用0表示未使用
unsigned__int8bk_bitmap[DATABLKNUM];//数据块block位图
structsuper_blockfilsys;//超级块
structpwdpwd[PWDNUM];
FILE*fd;//文件指针
structinode*cur_inode;//i节点当前目录指针
structinode*inodetemp;//i节点指针
constcharfsystemname[20]="Linux.EXT2";//模拟硬盘的文件名
structdirectdir_buf[BLOCKSIZ/sizeof(structdirect)];//目录数组
charcmdhead[20];//cmd的头表示所在哪个文件夹、
inti_lock=0;//inode位图锁可能会多线程
intb_lock=0;//block位图锁
structpwd*cur_user;
/*全局函数*/
externintFormat();//格式化磁盘
externintInstall();//启动,安装文件系统
structinode*read_inode(int);//install里面读取文件dinode
structdirect*read_dir_data(int);//读取存储文件夹的物理块
externvoidshowdir();//命令dir
intEnterdir(char[]);//进入某个文件夹命令--cd文件名
intFd_dirfile(char[]);//查找当前目录里的文件没找到返回-1找到返回inode号
intIscmd(char[]);//判断是否两个字符串的命令
voidtwo_cmd(char[],char[]);//两个字符串的命令
intcreat(char[]);//创建文件
voidchangeinode();//交换指针
char*ReadFile(char[]);//读取文件
intmkdir(char[]);//创建文件夹
voidshowbitmap();//显示位图
intdeletefd(char[]);//删除文件
inteditfile(char[]);//编辑文件
intrename(char[]);//重命名
voidshowhelp();//命令帮助
voidlogin();
voidlogout();
intaccess();//权限判断
/*磁盘i节点的分配与释放(当一个新文件被建立的时候,在给该文件分配磁盘存储区之前,
应为该文件分配存放该文件说明信息的磁盘i节点,当从文件系统中删除某个文件时,
应首先删除它的磁盘i节点项。
)*/
intialloc();/*开辟一个空闲的i节点,返回i节点*///磁盘块分配与释放函数
intballoc(int);//申请硬盘空间
结构体说明:
硬盘模拟文件:
每个数据块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表示空闲。
inode节点:
inode记录了文件或者目录在数据区存放位置,是文件还是目录,是否系统文件,属于管理员组还是普通用户组,是由谁创建的,创建时间等。
如果是目录,则还记录了里面包含多少个文件或子目录。
是文件则记录了文件的大小。
读取文件要先通过inode然后找到block,才能读取。
Block数据块:
存放文件的地方,如果是目录则记录了这个目录下所有的文件和子目录的名称和所占的inode
如果是文本文档,则是字节流文件。
3功能模块(或算法)描述
我负责整体设计,实现底层具体设计,format格式化,install安装,login登录,ialloc申请inode空间,balloc申请block空间。
3.1format格式化
只写打开模拟文件,初始化超级快,初始化dinode位图block位图,初始化主目录,初始化etc目录,初始化管理员admin目录,初始化用户xiao目录,初始化用户passwd文件,写入模拟硬盘文件。
3.2install安装
读写打开模拟文件,读取dinode位图block位图,读取主目录,读取etc目录,读取管理员admin目录,读取用户xiao目录,读取用户passwd文件。
3.3login登陆
用户输入用户名和密码,在passwd文件中查找是否有此用户,核对密码。
正确则登陆成功,当前目录设定到当前用户文件夹下。
登录流程图
3.4ialloc申请inode空间
先检测inode位图是否加锁,是则退出。
加锁,检测inode空间是否还有已满,是则退出。
在inode位图中顺序查找空闲的inode,找到则返回inode地址,block解锁。
函数结束。
流程图3.3
登录流程图ialloc流程图3.3balloc流程图3.4
3.5balloc申请block空间
先检测block位图是否加锁,是则退出。
加锁,检测block空间是否还有k个空闲,否则退出。
在还有空闲block的组中查找是否有k个空闲,没有则去下一个block组中查找,找到则返回block地址,block解锁。
函数结束。
流程图3.4
3.5create创建文本文件
查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。
申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
将文件内容写入inode空间和block空间。
修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。
流程图3.5
3.7cdir创建文件夹
查找当前目录下是否有同名文件,是则退出,否则,申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。
将文件夹内容写入inode空间和block空间。
修改当前目录的结构,修改超级快,修改inode位图,block位图,写入模拟硬盘。
3.7readedit–读取和追加文本文件
Read----查找当前目录下是否该文件,没有则退出,否则调用access()权限判断,有权限则判断是不是文件,不是则退出,是文件则读取文件并显示。
Edit----调用读取文件模块,读取成功则用户输入追加的内容,如果追加的内容大于一个block则申请block空间,失败则退出,申请成功则保存文件。
3.8access(文件名)权限判断
先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。
如果是该用户创建的则有读写权限如果当前用户是管理员组的也具有读写权限如果该文件是用户可查看文件则都具有权限。
3.9cd–进入子目录或上级目录
查找当前目录是否有该子目录,没有则退出,调用access()判断当前用户是否有权限,无则退出,有则读取该子目录的inode,将当前目录指向该目录。
3.10attr(文件名)查看文件或者文件夹的属性
先查找当前目录下是否有该文件或目录,有则判断文件是否系统文件,是否文本文件,是否目录,由谁创建,属于什么组,占用的block,和inode。
将其全部显示出来。
3.9del删除文件或目录
查找当前目录是否有该文件名,没有则退出,有则调用access()判断是否有权限,有则判断是否为系统文件,是则无法删除,不是则判断是否是文件,是文件则直接删除,不是则判断是否文件夹,是文件夹则判断该文件夹下是否有文件,有文件则无法删除。
提示用户是否删除,确认则删除文件,修改当前文件夹inode,block结构,修改该文件占有的inode和block位图为0,修改超级块,写入模拟硬盘。
流程图3.9
3.8access(文件名)权限判断
先判断当前目录是否有该文件,在当前目录的block找到该文件,判断当前登录用户是哪个组,判断是否该用户创建,判断该文件的可见级别。
如果是该用户创建的则有读写权限如果当前用户是管理员组的也具有读写权限如果该文件是用户可查看文件则都具有权限。
1格式化和登录界面登录后显示帮助信息,进入到用户文件夹下
2dir命令---显示当前目录下的文件和目录
3logout命令---注销用户
操作系统课程设计是本课程重要的实践教学环节。
课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。
与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不过设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。
同时,在老师的身上我学得到很多实用的知识,再次我表示感谢!
同时,对给过我们帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
[1]袁庆龙,候文义.Ni-P合金镀层组织形貌及显微硬度研究[J].太原理工大学学报,2001,32
(1):
51-53.(连续出版物:
[序号]主要责任者.文献题名[J].刊名,出版年份,卷号(期号):
起止页码)
[2] 刘国钧,王连成.图书馆史研究[M].北京:
高等教育出版社,1979:
15-18,31.(专著:
[序号]主要责任者.文献题名[M].出版地:
出版者,出版年:
起止页码.)
[3]孙品一.高校学报编辑工作现代化特征[C].中国高等学校自然科学学报研究会.科技编辑学论文集
(2).北京:
北京师范大学出版社,1998:
10-22.(论文集:
[序号]主要责任者.文献题名[C]∥主编.论文集名.出版地:
出版者,出版年:
起止页码.)
附:
源代码
#include
#include
#include
#include
#include
#include
#defineBLOCKSIZ512//磁盘块的大小
#defineDATABLKNUM512//数据块的数目
#defineBLKGRUPNUM50//数据块组包含多少数据块
#defineP_N_BLOCKS15//inode节点中指向数据块的指针个数
#defineGROUPNUMDATABLKNUM/BLKGRUPNUM+1//数据块组组数
#defineDINODESIZ512//磁盘i结点区的大小(空间32×512)
#defineDINODENUM32//磁盘i结点区的块数
#defineSYSOPENFILE40
#defineDIRNUM32//一个目录下的最多目录和文件的总和数
#defineDIRSIZ14//文件、目录名的长度(字节)
#defineUPWDSIZ15//秘密的长度
#defineUNAMSIZ15//用户名的长度
#definePWDSIZsizeof(structpwd)//密码结构的长度
#definePWDNUMBLOCKSIZ/PWDSIZ//密码数据空间的大小(pwd为单位)
#defineNOFILE20//一个用户最多可以打开的文件数目
#defineNHINO128
#defineUSERNUM10//用户名的长度
#defineDINODESTART4*BLOCKSIZ//i结点区的开始地址-inodestable,1引导2超块3blockbitmap4inodebitmap
#defineDATASTART(2+DINODENUM)*BLOCKSIZ//数据区的开始地址
#defineDATASTARTNO36//数据区开始指针
/*di._mode*/
#defineDIMODE_EMPTY00000/*可以用的空间*/
#defineDIMODE_FILE00001
#defineDIMODE_DIR00002
#defineDIMODE_PASSWD00004
#defineDIMODE_SYSTEM00040/*系统文件*/
#defineDIMODE_READ00010/*READ和该数与操作后得到的是可以读该文件的用户组*/
#defineDIMODE_WRITE00020/*WRITE*/
#defineDIMODE_EXICUTE01000/*EXICUTE*/
#defineDIMODE_ADMIN00100/*管理员权限*/
#defineDIMODE_SHARE00200/*不需要权限*/
/*组*/
#defineGRUP_00//管理员组
#defineGRUP_11
#defineGRUP_22
#defineGRUP_44
/************************文件系统数据结构*******************************/
/*————————————————————————
磁盘i结点结构,
————————————————————————*/
structinode{
//chardi_name[DIRSIZ];
unsigned__int16di_ino;/*磁盘i节点标识*/
unsigned__int16di_number;/*关联文件数,当为0时表示删除文件*/
unsigned__int16di_mode;/*存取权限*/
unsigned__int16di_uid;/*磁盘i节点用户id*/
unsigned__int16di_gid;/*磁盘i节点权限组id*///1管理员组2用户组
unsigned__int32di_size;/*文件大小*/
unsigned__int32di_ctime;/*Creationtime*/
unsigned__int32di_mtime;/*Modificationtime*/
unsigned__int16di_block[P_N_BLOCKS];/*一组block指针*/
};
/*————————————————————————
目录项结构
————————————————————————*/
structdirect{
chard_name[DIRSIZ];/*目录名