简单文件系统的实现.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《简单文件系统的实现.pdf》由会员分享,可在线阅读,更多相关《简单文件系统的实现.pdf(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、简单文件系统的实现 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT第三章简单文件系统的实现设计目的和内容要求1.设计目的通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。2内容要求(1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在退出该文件系统的使用时,应将该虚拟文件系统以一个 Windows文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。(2)文件存储空间的分配可采用显式链
2、接分配或其他的办法。(3)空闲磁盘空间的管理可选择位示图或其他的办法。如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到 FAT中。(4)文件目录结构采用多级目录结构。为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。(5)要求提供以下操作命令:my_format:对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。my_mkdir:用于创建子目录。my_rmdir:用于删除子目录。my_ls:用于显示目录中的内容。
3、my_cd:用于更改当前目录。my_create:用于创建文件。my_open:用于打开文件。my_close:用于关闭文件。my_write:用于写文件。my_read:用于读文件。my_rm:用于删除文件。my_exitsys:用于退出文件系统。3学时安排授课 2 学时,上机 9学时。4开发平台C 或 C+均可。5思考(1)我们的数据结构中的文件物理地址信息是使用 C 语言的指针类型、还是整型,为什么(2)如果引入磁盘索引结点,上述实现过程需要作哪些修改(3)如果设计的是一个单用户多任务文件系统,则系统需要进行哪些扩充(尤其要考虑读写指针问题)如果设计的是一个多用户文件系统,则又要进行哪些
4、扩充预备知识文件系统介绍1概述FAT 文件系统是微软公司在其早期的操作系统 MS-DOS及 Windows9x 中采用的文件系统,它被设计用来管理小容量的磁盘空间。FAT 文件系统是以他的文件组织方式文件分配表(fileallocationtable,FAT)命名的,文件分配表的每个表项中存放某文件的下一个盘块号,而该文件的起始盘块号则保存在它的文件控制块 FCB 中。在文件分配表中,一般用 FFFF 来标识文件的结束;用0000来标识某个逻辑块未被分配,即是空闲块。为了提高文件系统的可靠性,在逻辑磁盘上通常设置两张文件分配表,它们互为备份。此外,文件分配表必须存放在逻辑磁盘上的固定位置,而根
5、目录区通常位于 FAT2 之后,以便操作系统在启动时能够定位所需的文件,其磁盘布局如图 3-1所示:图 3-1FAT 文件系统磁盘布局上述磁盘布局中,引导块中主要存放了用于描述分区的各种信息,包括逻辑块的大小、文件分配表的大小及位置、根目录的大小及位置等。除此之外,用于加载操作系统内核的引导程序也存储在引导块中。FAT 文件系统家族又分为 FAT12、FAT16、FAT32 三种类型,这里的数字表示文件分配表中每个表项(即簇号)所占的位数,即 FAT12 中每个表项占个字节(12 位),FAT16 中每个表项占 2 个字节(16 位),FAT32 中每个表项占4 个字节(32位)。由于 FAT
6、 文件系统是以簇为单位为文件分配磁盘空间的(一个簇是一组连续的扇区,通常包含 2n个扇区),因此,FAT32 比 FAT12和 FAT16 支持更多的簇数、更小的簇大小和更大的磁盘容量,从而大大提高磁盘空间的利用率。通常,FAT12适用于小容量磁盘,如软盘;FAT16 是 MS-DOS的文件系统;FAT32 是 Windows9x 中的主要文件系统,开始支持大容量磁盘。2文件控制块 FCB为了正确、方便地操作文件,必须设置相应的数据结构用于存放文件的描述和控制信息,常用的数据结构有文件控制块(简称 FCB)和索引节点(简称i 节点)。在 FAT文件系统中使用文件控制块。文件与文件控制块一一对应
7、,而文件控制块的有序集合就称为文件目录,即一个文件控制块就是一个文件目录项。虽然不同文件系统的文件控制块的内容和格式不完全相同,但通常都包括以下三类信息:基本信息、存取控制信息和使用信息。(1)基本信息。包括文件名、用户名、文件类型、文件的物理地址、文件长度、文件的逻辑结构和物理结构等。(2)存取控制信息。一般分别给出文件主、伙伴用户、一般用户的存取权限。(3)使用信息。包括文件的建立日期及时间、上次存取文件的日期及时间、当前的使用信息等。以 MS-DOS(使用 FAT16 文件系统)为例,它的每个文件控制块包括 32 个字节,其字节分配情况如图 3-2 所示:图 3-2MS-DOS 的文件控
8、制块其中属性字段占一个字节,它的每一位用来表示该文件是否具有某种属性,如果某一位的值为 1,则表示该文件具有该属性。各位所表示的属性如表 3-1 所示:表 3-1 文件属性对照表位属性765存档43210只读保留保留子目 卷标系 统 文 隐录件藏3根目录区FAT12、FAT16的根目录区是固定区域、固定大小的,位于第二个 FAT 之后,如图 3-1所示,且占据若干连续扇区,其中 FAT12占 14个扇区,一共 224个根目录项;而 FAT16 占 32个扇区,最多保存 512个目录项,作为系统区的一部分。FAT32的根目录是作为文件处理的,采用与子目录文件相同的管理方式,其位置不是固定的,不过
9、一般情况也是位于第二个 FAT之后的,其大小可视需要增加,因此根目录下的文件数目不再受最多 512 个的限制。几个 C 语言库函数介绍由于我们的文件系统是建立在内存的虚拟磁盘上的,在退出文件系统的时候必须以一个文件的形式保存到磁盘上;而在启动文件系统的时候必须从磁盘上将该文件读入到内存的虚拟磁盘中。下面介绍几个可能会用到的 C 库函数,在使用这些库函数之前必须包含头文件“”。1打开文件函数 fopen()(1)格式:FILE*fopen(constchar*filename,constchar*mode)(2)功能:按照指定打开方式打开指定文件。(3)输入参数说明:filename:待打开的文
10、件名,如果不存在就创建该文件。mode:文件打开方式,常用的有:r:为读而打开文本文件(不存在则出错)。w:为写而打开文本文件(若不存在则创建该文件;反之,则从文件起始位置写,原内容将被覆盖)。a:为在文件末尾添加数据而打开文本文件。(若不存在则创建该文件;反之,在原文件末尾追加)。r+:为读和写而打开文本文件。(读时,从头开始;在写数据时,新数据只覆盖所占的空间,其后不变)。w+:首先建立一个新文件,进行写操作,随后可以从头开始读。(若文件存在,原内容将全部消失)。a+:功能与a相同;只是在文件末尾添加新的数据后,可以从头开始读。另外,上述模式字符串中都可以加一个“b”字符,如 rb、wb、
11、ab、rb+、wb+、ab+等组合,字符“b”表示 fopen()函数打开的文件为二进制文件,而非纯文字文件。(4)输出:一个指向 FILE类型的指针。2关闭文件函数 fclose()(1)格式:intfclose(FILE*stream);(2)功能:用来关闭先前fopen()打开的一个文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。(3)输入参数说明:stream:指向要关闭文件的指针,它是先前执行fopen()函数的返回值。(4)输出:若关闭文件成功则返回0;有错误发生时则返回EOF并把错误代码存到errno。3读文件函数 fread()(1)格式:size_tfr
12、ead(void*buffer,size_tsize,size_tcount,FILE*stream);(2)功能:读二进制文件到内存。(3)输入参数说明:buffer:用于存放输入数据的缓冲区的首地址;stream:使用fopen()打开的文件的指针,用于指示要读取的文件;size:每个数据块的字节数;count:要读入的数据块的个数;size*count:表示要求读取的字节数。(4)输出:实际读取的数据块的个数。4写文件函数 fwrite()(1)格式:size_tfwite(constvoid*buffer,size_tsize,size_tcount,FILE*stream);(2)功
13、能:将数据写到二进制文件中。(3)输入参数说明:buffer:用于存放输出数据的缓冲区的首地址;stream:使用fopen()打开的文件的指针,用于指示要写出的文件;size:每个数据块的字节数;count:要写出的数据块的个数;size*count:表示要求写出的字符数。(4)输出:实际写出的数据块的个数。5判断文件结束函数 feof()(1)格式:intfeof(FILE*stream)(2)功能:用来判断是否已读取到文件末尾。(3)输入参数说明:stream:使用 fopen()打开的文件的指针,用于指示要判断的文件。(4)输出:如果已读到文件尾则返回非零值,其他情况返回 0。6定位文
14、件函数 fseek()(1)格式:intfseek(FILE*stream,longoffset,intorigin);(2)功能:移动文件读写指针在文件中的位置。(3)输入参数说明:stream:使用fopen()打开的文件的指针,用于指示要定位读写指针的文件;offset:位移量,以字节为单位;origin:初始位置,有三个常量:SEEK_CUR:读写指针当前位置;SEEK_SET:文件开头;SEEK_END:文件末尾。当 origin值为 SEEK_CUR或 SEEK_END时,参数 offset可以为负值。实例系统的设计与实现本实例系统是仿照 FAT16 文件系统来设计实现的,但根目录
15、没有采用 FAT16的固定位置、固定大小的根目录区,而是以根目录文件的形式来实现的,这也是目前主流文件系统对根目录的处理方式。数据结构设计1需要包含的头文件(1)#include(2)#include(3)#include(4)#include2定义的常量(1)#defineBLOCKSIZE1024磁盘块大小(2)#defineSIZE1024000 虚拟磁盘空间大小(3)#defineEND65535FAT中的文件结束标志(4)#defineFREE0FAT中盘块空闲标志(5)#defineROOTBLOCKNUM2根目录区所占盘块总数(6)#defineMAXOPENFILE10最多同时
16、打开文件个数3数据结构(1)文件控制块 FCB用于记录文件的描述和控制信息,每个文件设置一个 FCB,它也是文件的目录项的内容。typedefstructFCB入文件系统函数 startsys()(1)对应命令:无(2)命令调用格式:无(3)函数设计格式:voidstartsys()(4)功能:由 main()函数调用,进入并初始化我们所建立的文件系统,以供用户使用。(5)输入:无(6)输出:无。(7)函数需完成的工作:申请虚拟磁盘空间;使用 c语言的库函数 fopen()打开 myfsys 文件:若文件存在,则转;若文件不存在,则创建之,转将上述缓冲区中的内容复制到内存中的虚拟磁盘空间中;转
17、在屏幕上显示“myfsys 文件系统不存在,现在开始创建文件系统”信息,并调用 my_format()对中申请到的虚拟磁盘空间进行格式化操作。转;将虚拟磁盘中的内容保存到 myfsys文件中;转使用 c语言的库函数 fclose()关闭 myfsys 文件;初始化用户打开文件表,将表项 0分配给根目录文件使用,并填写根目录文件的相关信息,由于根目录没有上级目录,所以表项中的 dirno 和 diroff分别置为 5(根目录所在起始块号)和 0;并将 ptrcurdir指针指向该用户打开文件表项。将当前目录设置为根目录。3磁盘格式化函数 my_format()(1)对应命令:my_format(
18、2)命令调用格式:my_format(3)函数设计格式:voidmy_format()(4)功能:对虚拟磁盘进行格式化,布局虚拟磁盘,建立根目录文件(或根目录区)。(5)输入:无(6)输出:无。(7)函数需完成的工作:在引导块后建立两张完全一样的 FAT表,用于记录文件所占据的磁盘块及管理虚拟磁盘块的分配,每个 FAT占据两个磁盘块;对于每个 FAT 中,前面 5 个块设置为已分配,后面 995个块设置为空闲;在第二张 FAT后创建根目录文件 root,将数据区的第 1块(即虚拟磁盘的第 6 块)分配给根目录文件,在该磁盘上创建两个特殊的目录项:“.”和“.”,其内容除了文件名不同之外,其他字
19、段完全相同。4更改当前目录函数 my_cd()(1)对应命令:my_cd(2)命令调用格式:my_cddirname(3)函数设计格式:voidmy_cd(char*dirname)(4)功能:改变当前目录到指定的名为 dirname的目录。(5)输入:dirname:新的当前目录的目录名;(6)输出:无(7)函数需完成的工作:调用 my_open()打开指定目录名的父目录文件,并调用 do_read()读入该父目录文件内容到内存中;在父目录文件中检查新的当前目录名是否存在,如果存在则转,否则返回,并显示出错信息;调用 my_close()关闭中打开的父目录文件;调用 my_close()关闭
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 文件系统 实现
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内