操作系统课程设计 简单文件系统的实现.pdf





《操作系统课程设计 简单文件系统的实现.pdf》由会员分享,可在线阅读,更多相关《操作系统课程设计 简单文件系统的实现.pdf(33页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.操作系统课程设计报告操作系统课程设计报告小组编号:小组成员:一、课程设计概述:一、课程设计概述:1 1、题目:简单文件系统的实现、题目:简单文件系统的实现2、实现内容实现内容(1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个 Windows 文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。(2)文件存储空间的分配可采用显式链接分配或其他的办法。(3)空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可
2、以将位示图合并到FAT中。(4)文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。(5)要求提供以下操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。my_mkdir:用于创建子目录。my_rmdir:用于删除子目录。my_ls:用于显示目录中的内容。my_cd:用于更改当前目录。my_create:用于创建文件。my_open:用于打开文件。my_close:用于关闭文件。my_wr
3、ite:用于写文件。my_read:用于读文件。my_rm:用于删除文件。my_exitsys:用于退出文件系统。二、设计思路(主要算法描述、程序流程图等)二、设计思路(主要算法描述、程序流程图等):1 1系统主函数系统主函数 main()main()(1 1)对应命令:无)对应命令:无(2 2)命令调用格式:无)命令调用格式:无(3 3)函数设计格式:)函数设计格式:void main()void main()(4 4)功能:系统主函数)功能:系统主函数(5 5)输入:无)输入:无(6 6)输出:无)输出:无(7 7)函数需完成的工作:)函数需完成的工作:对前面定义的全局变量进行初始化;对前
4、面定义的全局变量进行初始化;调用调用 startsys()startsys()进入文件系统;进入文件系统;.列出文件系统提供的各项功能及命令调用格式;列出文件系统提供的各项功能及命令调用格式;显示命令行提示符,等待用户输入命令;显示命令行提示符,等待用户输入命令;将用户输入的命令保存到一个将用户输入的命令保存到一个 bufbuf 中;中;对对 bufbuf 中的内容进行命令解析,并调用相应的函数执行用户键入的命令;中的内容进行命令解析,并调用相应的函数执行用户键入的命令;如果命令不是“如果命令不是“my_exitsysmy_exitsys”,则命令执行完毕后转。,则命令执行完毕后转。2.2.进
5、入文件系统函数进入文件系统函数 startsys()startsys()(1 1)对应命令:无)对应命令:无(2 2)命令调用格式:无)命令调用格式:无(3 3)函数设计格式:)函数设计格式:void startsys()void startsys()(4 4)功能:由)功能:由 main()main()函数调用,进入并初始化我们所建立的文件系统,以供用户使用。函数调用,进入并初始化我们所建立的文件系统,以供用户使用。(5 5)输入:无)输入:无(6 6)输出:无。)输出:无。(7 7)函数需完成的工作:)函数需完成的工作:申请虚拟磁盘空间;申请虚拟磁盘空间;使用使用 c c 语言的库函数语言
6、的库函数 fopen()fopen()打开打开 myfsysmyfsys 文件:若文件存在,则转;若文件不存在,文件:若文件存在,则转;若文件不存在,则创建之,转则创建之,转 使用使用 c c 语言的库函数语言的库函数 fread()fread()读入读入 myfsysmyfsys 文件内容到用户空间中的一个缓冲区中,并判文件内容到用户空间中的一个缓冲区中,并判断其开始的断其开始的 8 8 个字节内容是否为“”个字节内容是否为“”(文件系统魔数)(文件系统魔数),如果是,则转;否则转;,如果是,则转;否则转;将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中;转将上述缓冲区中的内容复制到内存中的
7、虚拟磁盘空间中;转 在屏幕上显示“在屏幕上显示“myfsysmyfsys 文件系统不存在,现在开始创建文件系统”信息,并调用文件系统不存在,现在开始创建文件系统”信息,并调用my_format()my_format()对中申请到的虚拟磁盘空间进行格式化操作。转;对中申请到的虚拟磁盘空间进行格式化操作。转;将虚拟磁盘中的内容保存到将虚拟磁盘中的内容保存到 myfsysmyfsys 文件中;转文件中;转 使用使用 c c 语言的库函数语言的库函数 fclose()fclose()关闭关闭 myfsysmyfsys 文件;文件;初始化用户打开文件表,将表项初始化用户打开文件表,将表项0 0 分配给根
8、目录文件使用,并填写根目录文件的相关信分配给根目录文件使用,并填写根目录文件的相关信息,由于根目录没有上级目录,所以表项中的息,由于根目录没有上级目录,所以表项中的dirnodirno 和和 diroffdiroff 分别置为分别置为 5 5(根目录所在起始(根目录所在起始块号)和块号)和 0 0;并将;并将 ptrcurdirptrcurdir 指针指向该用户打开文件表项。指针指向该用户打开文件表项。将当前目录设置为根目录。将当前目录设置为根目录。3 3磁盘格式化函数磁盘格式化函数 my_format()my_format()(1 1)对应命令:)对应命令:my_formatmy_forma
9、t(2 2)命令调用格式:)命令调用格式:my_formatmy_format(3 3)函数设计格式:)函数设计格式:void my_format()void my_format()(4 4)功能:对虚拟磁盘进行格式化,布局虚拟磁盘,建立根目录文件(或根目录区)功能:对虚拟磁盘进行格式化,布局虚拟磁盘,建立根目录文件(或根目录区)。(5 5)输入:无)输入:无(6 6)输出:无。)输出:无。(7 7)函数需完成的工作:)函数需完成的工作:将虚拟磁盘第一个块作为引导块,开始的将虚拟磁盘第一个块作为引导块,开始的 8 8 个字节是文件系统的魔数,记为“”个字节是文件系统的魔数,记为“”;在之;在之
10、后写入文件系统的描述信息,如后写入文件系统的描述信息,如 FATFAT表大小及位置、根目录大小及位置、盘块大小、盘块表大小及位置、根目录大小及位置、盘块大小、盘块数量、数据区开始位置等信息;数量、数据区开始位置等信息;在引导块后建立两张完全一样的在引导块后建立两张完全一样的 FATFAT表,表,用于记录文件所占据的磁盘块及管理虚拟磁盘用于记录文件所占据的磁盘块及管理虚拟磁盘块的分配,每个块的分配,每个FATFAT占据两个磁盘块;对于每个占据两个磁盘块;对于每个FATFAT中,前面中,前面5 5 个块设置为已分配,后面个块设置为已分配,后面995995 个块设置为空闲;个块设置为空闲;在第二张在
11、第二张 FATFAT后创建根目录文件后创建根目录文件 rootroot,将数据区的第将数据区的第 1 1 块块(即虚拟磁盘的第(即虚拟磁盘的第 6 6 块)块)分配分配给根目录文件,在该磁盘上创建两个特殊的目录项:给根目录文件,在该磁盘上创建两个特殊的目录项:“.”和“”和“.”,其内容除了文件名不同之,其内容除了文件名不同之外,其他字段完全相同。外,其他字段完全相同。.4 4更改当前目录函数更改当前目录函数 my_cd()my_cd()(1 1)对应命令:)对应命令:my_cdmy_cd(2 2)命令调用格式:)命令调用格式:my_cd dirnamemy_cd dirname(3 3)函数
12、设计格式:)函数设计格式:void my_cd(char*dirname)void my_cd(char*dirname)(4 4)功能:改变当前目录到指定的名为)功能:改变当前目录到指定的名为 dirnamedirname 的目录。的目录。(5 5)输入:)输入:dirnamedirname:新的当前目录的目录名;:新的当前目录的目录名;(6 6)输出:无)输出:无(7 7)函数需完成的工作:)函数需完成的工作:调用调用 my_open()my_open()打开指定目录名的父目录文件,打开指定目录名的父目录文件,并调用并调用 do_read()do_read()读入该父目录文件内容读入该父目
13、录文件内容到内存中;到内存中;在父目录文件中检查新的当前目录名是否存在,如果存在则转,否则返回,并显示出在父目录文件中检查新的当前目录名是否存在,如果存在则转,否则返回,并显示出错信息;错信息;调用调用 my_close()my_close()关闭中打开的父目录文件;关闭中打开的父目录文件;调用调用 my_close()my_close()关闭原当前目录文件;关闭原当前目录文件;如果新的当前目录文件没有打开,则打开该目录文件;并将如果新的当前目录文件没有打开,则打开该目录文件;并将 ptrcurdirptrcurdir 指向该打开文件指向该打开文件表项;表项;设置当前目录为该目录。设置当前目录
14、为该目录。5 5创建子目录函数创建子目录函数 my_mkdir()my_mkdir()(1 1)对应命令:)对应命令:my_mkdirmy_mkdir(2 2)命令调用格式:)命令调用格式:my_ mkdir dirnamemy_ mkdir dirname(3 3)函数设计格式:)函数设计格式:void my_mkdir(char*dirname)void my_mkdir(char*dirname)(4 4)功能:在当前目录下创建名为)功能:在当前目录下创建名为 dirnamedirname 的子目录。的子目录。(5 5)输入:)输入:dirnamedirname:新建目录的目录名。:新建
15、目录的目录名。(6 6)输出:无。)输出:无。(7 7)函数需完成的工作:)函数需完成的工作:调用调用 do_read()do_read()读入当前目录文件内容到内存,检查当前目录下新建目录文件是否重名,读入当前目录文件内容到内存,检查当前目录下新建目录文件是否重名,若重名则返回,并显示错误信息;若重名则返回,并显示错误信息;为新建子目录文件分配一个空闲打开文件表项,如果没有空闲表项则返回为新建子目录文件分配一个空闲打开文件表项,如果没有空闲表项则返回-1-1,并显示错,并显示错误信息;误信息;检查检查 FATFAT是否有空闲的盘块,是否有空闲的盘块,如有则为新建目录文件分配一个盘块,如有则为
16、新建目录文件分配一个盘块,否则释放中分配否则释放中分配的打开文件表项,返回,并显示错误信息;的打开文件表项,返回,并显示错误信息;在当前目录中为新建目录文件寻找一个空闲的目录项或为其追加一个新的目录项在当前目录中为新建目录文件寻找一个空闲的目录项或为其追加一个新的目录项;需修需修改当前目录文件的长度信息,并将当前目录文件的用户打开文件表项中的改当前目录文件的长度信息,并将当前目录文件的用户打开文件表项中的fcbstatefcbstate 置为置为 1 1;准备好新建目录文件的准备好新建目录文件的FCBFCB 的内容,文件的属性为目录文件,以覆盖写方式调用的内容,文件的属性为目录文件,以覆盖写方
17、式调用do_write()do_write()将其填写到对应的空目录项中;将其填写到对应的空目录项中;在新建目录文件所分配到的磁盘块中建立两个特殊的目录项“在新建目录文件所分配到的磁盘块中建立两个特殊的目录项“.”和“”和“.”目录项,方法”目录项,方法是:是:首先在用户空间中准备好内容,首先在用户空间中准备好内容,然后以截断写或者覆盖写方式调用然后以截断写或者覆盖写方式调用 do_write()do_write()将其写到将其写到中分配到的磁盘块中;中分配到的磁盘块中;返回。返回。6 6删除子目录函数删除子目录函数 rmdir()rmdir()(1 1)对应命令:)对应命令:my_ rmdi
18、rmy_ rmdir(2 2)命令调用格式:)命令调用格式:my_ rmdir dirnamemy_ rmdir dirname.(1 1)函数设计格式:)函数设计格式:void my_rmdir(char*dirname)void my_rmdir(char*dirname)(2 2)功能:在当前目录下删除名为)功能:在当前目录下删除名为 dirnamedirname 的子目录。的子目录。(3 3)输入:)输入:dirnamedirname:欲删除目录的目录名。:欲删除目录的目录名。(4 4)输出:无。)输出:无。(5 5)函数需完成的工作:)函数需完成的工作:调用调用 do_read()d
19、o_read()读入当前目录文件内容到内存,检查当前目录下欲删除目录文件是否存读入当前目录文件内容到内存,检查当前目录下欲删除目录文件是否存在,若不存在则返回,并显示错误信息;在,若不存在则返回,并显示错误信息;检查欲删除目录文件是否为空(除了“检查欲删除目录文件是否为空(除了“.”和“”和“.”外没有其他子目录和文件)”外没有其他子目录和文件),可根据其,可根据其目录项中记录的文件长度来判断,若不为空则返回,并显示错误信息;目录项中记录的文件长度来判断,若不为空则返回,并显示错误信息;检查该目录文件是否已经打开,若已打开则调用检查该目录文件是否已经打开,若已打开则调用 my_close()m
20、y_close()关闭掉;关闭掉;回收该目录文件所占据的磁盘块,修改回收该目录文件所占据的磁盘块,修改 FATFAT;从当前目录文件中清空该目录文件的目录项,且从当前目录文件中清空该目录文件的目录项,且 freefree 字段置为字段置为 0 0:以覆盖写方式调用:以覆盖写方式调用do_write()do_write()来实现;来实现;修改当前目录文件的用户打开表项中的长度信息,并将表项中的修改当前目录文件的用户打开表项中的长度信息,并将表项中的 fcbstatefcbstate 置为置为 1 1;返回。返回。7 7显示目录函数显示目录函数 my_ls()my_ls()(1 1)对应命令:)对
21、应命令:my_lsmy_ls(2 2)命令调用格式:)命令调用格式:my_lsmy_ls(3 3)函数设计格式:)函数设计格式:void my_ls(void)void my_ls(void)(4 4)功能:显示当前目录的内容(子目录和文件信息)功能:显示当前目录的内容(子目录和文件信息)。(5 5)输入:无)输入:无(6 6)输出:无)输出:无(7 7)函数需完成的工作:)函数需完成的工作:调用调用 do_read()do_read()读出当前目录文件内容到内存;读出当前目录文件内容到内存;将读出的目录文件的信息按照一定的格式显示到屏幕上;将读出的目录文件的信息按照一定的格式显示到屏幕上;返
22、回。返回。8 8创建文件函数创建文件函数 my_create()my_create()(1 1)对应命令:)对应命令:my_createmy_create(2 2)命令调用格式:)命令调用格式:my_createmy_create(3 3)函数设计格式:)函数设计格式:int my_create(char*)int my_create(char*)(4 4)功能:创建名为的新文件。)功能:创建名为的新文件。(5 5)输入:)输入:新建文件的文件名,可能包含路径。:新建文件的文件名,可能包含路径。(6 6)输出:若创建成功,返回该文件的文件描述符(文件打开表中的数组下标)输出:若创建成功,返回该
23、文件的文件描述符(文件打开表中的数组下标);否则返;否则返回回-1-1。(7 7)函数需完成的工作:)函数需完成的工作:为新文件分配一个空闲打开文件表项,如果没有空闲表项则返回为新文件分配一个空闲打开文件表项,如果没有空闲表项则返回-1-1,并显示错误信息;,并显示错误信息;若新文件的父目录文件还没有打开,则调用若新文件的父目录文件还没有打开,则调用 my_open()my_open()打开;若打开失败,则释放中打开;若打开失败,则释放中为新建文件分配的空闲文件打开表项,返回为新建文件分配的空闲文件打开表项,返回-1-1,并显示错误信息;,并显示错误信息;调用调用 do_read()do_re
24、ad()读出该父目录文件内容到内存,读出该父目录文件内容到内存,检查该目录下新文件是否重名,检查该目录下新文件是否重名,若重名则若重名则释放中分配的打开文件表项,并调用释放中分配的打开文件表项,并调用 my_close()my_close()关闭中打开的目录文件;然后返回关闭中打开的目录文件;然后返回-1-1,并显示错误信息;并显示错误信息;检查检查 FATFAT是否有空闲的盘块,是否有空闲的盘块,如有则为新文件分配一个盘块,如有则为新文件分配一个盘块,否则释放中分配的打开否则释放中分配的打开.文件表项,并调用文件表项,并调用 my_close()my_close()关闭中打开的目录文件;返回
25、关闭中打开的目录文件;返回-1-1,并显示错误信息;,并显示错误信息;在父目录中为新文件寻找一个空闲的目录项或为其追加一个新的目录项在父目录中为新文件寻找一个空闲的目录项或为其追加一个新的目录项;需修改该目录需修改该目录文件的长度信息,并将该目录文件的用户打开文件表项中的文件的长度信息,并将该目录文件的用户打开文件表项中的 fcbstatefcbstate 置为置为 1 1;准备好新文件的准备好新文件的 FCBFCB 的内容,文件的属性为数据文件,长度为的内容,文件的属性为数据文件,长度为 0 0,以覆盖写方式调用,以覆盖写方式调用do_write()do_write()将其填写到中分配到的空
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计 简单文件系统的实现 操作系统 课程设计 简单 文件系统 实现

限制150内