理论教育 Proteus和IAREWARM中的FAT16文件系统

Proteus和IAREWARM中的FAT16文件系统

时间:2023-11-03 理论教育 版权反馈
【摘要】:FAT是由微软发布的一种磁盘文件管理系统。之所以要以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512B的扇区管理会增加FAT表的项数,对大文件存取增加消耗,文件系统效率不高。FAT文件系统就是根据分区的相关DBR参数与DBR中存放的已经计算好的FAT表的大小来确定的。表5-16 FAT16目录项32个字节的表示定义下面对表5-16中的一些取值进行说明:●对于短文件名,系统将文件名分成两部分进行存储,即主文件名+扩展名。

Proteus和IAREWARM中的FAT16文件系统

FAT是由微软发布的一种磁盘文件管理系统。在FAT发展过程中,先后发布了FAT12、FAT16、FAT32三个版本,其中FAT16是指磁盘的一个分区最多含有2的16次方个簇,由于每个簇的最大存储空间只有32KB,因此磁盘一个分区的存储容量最大为2GB。对于容量大小不超过2GB的SD卡,通常只作为一个分区。

FAT16主要由表5-15所列的6部分组成(主要是前5部分)。FAT16在引导扇区(DBR)之后没有留任何保留扇区,其后紧随的便是FAT表。FAT表是用来记录磁盘数据区簇链结构的,FAT将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。通常情况下,每扇区512B。簇的大小一般是2n(n为整数)个扇区的大小,像512B,1KB,2KB,4KB,8KB,16KB,32KB,64KB等。实际中通常不超过32KB。之所以要以簇为单位而不以扇区为单位进行磁盘的分配,是因为当分区容量较大时,采用大小为512B的扇区管理会增加FAT表的项数,对大文件存取增加消耗,文件系统效率不高。

表5-15 FAT16的主要组成

978-7-111-44508-1-Chapter05-99.jpg

FAT文件系统的目录结构如同一棵有向的从根到叶的树,这里提到的有向是指对于FAT分区内的任一文件(包括文件夹),均需从根目录寻址来找到。可以认为目录存储结构的入口就是根目录。

FAT文件系统根据根目录来寻址其他文件(包括文件夹),故而根目录的位置必须在磁盘存取数据之前得以确定。FAT文件系统就是根据分区的相关DBR参数与DBR中存放的已经计算好的FAT表的大小来确定的。磁盘格式化之后,根目录的大小和位置就都已经确定下,其位置紧随FAT2之后,大小通常为32个扇区。根目录之后便是存放文件的数据区。

FAT文件系统的一个重要思想是把目录(文件夹)当作一个特殊的文件来处理,在FAT16中,虽然根目录地位并不等同于普通的文件,但其组织形式和普通的目录(文件夹)并没有不同。FAT分区中所有的文件夹(目录)文件,实际上可以看作是一个存放其他文件(文件夹)入口参数的数据表。所以目录占用空间的大小并不等同于其下所有数据的大小,但也不等于0。通常是占一个很小的空间,可以看作目录文件是一个简单的二维表文件。其具体存储原理是:不管目录文件所占空间为多少簇,一簇为多少字节,系统都会以32个字节为单位进行目录文件所占簇的分配。以这32个字节确定的偏移,来定义本目录下的一个文件(或文件夹)的属性。这32个字节中各字节偏移定义如表5-16所列。

表5-16 FAT16目录项32个字节的表示定义

978-7-111-44508-1-Chapter05-100.jpg

下面对表5-16中的一些取值进行说明:

●对于短文件名,系统将文件名分成两部分进行存储,即主文件名+扩展名。0x0~0x7字节记录文件的主文件名,0x8~0xA记录文件的扩展名,取文件名中的ASCII码值。不记录主文件名与扩展名之间的“.”号。主文件名不足8个字符以空白符(20H)填充,扩展名不足3个字符同样以空白符(20H)填充。0x00偏移处的取值若为00H,表明目录项为空;若为E5H,表明目录项曾被使用,但对应的文件或文件夹已被删除。(这也是误删除后恢复的理论依据)。文件名中的第一个字符若为“.”或“..”表示这个簇记录的是一个子目录的目录项。“.”代表当前目录;“..”代表上级目录。

●0xB字节为属性字段,系统将0xB的一个字节分成8位,用其中的一位代表某种属性的有或无。例如00000101就表示个文件的属性是只读、系统。(www.daowen.com)

●0xC~0x15字节在FAT16的定义中为保留未用,在高版本的WINDOWS系统中有时也用它来记录修改时间和最近访问时间。

●0x16~0x17字节为文件的最近修改时间。0x16字节的0~4位是以2s为单位的量值;0x16字节的5~7位和0x17字节的0~2位是分钟;0x17字节的3~7位是小时。

●0x18~0x19字节为文件的最近修改日期。0x18字节的0~4位是日期数;0x18字节5~7位和0x19字节0位是月份;0x19字节的1~7位为年号。

●0x1A~0x1B字节存放文件或目录的首簇号。系统根据首簇号在FAT表中找到入口,然后再跟踪簇链直至簇尾,同时用0x1C~0x1F字节所表示的文件长度来判定文件有效性,就可以正确地读取文件(目录)了。

●普通子目录的寻址过程也是通过其父目录中的目录项来指定的,与数据文件(指非目录文件)不同的是,目录项偏移0xB的第4位置1,而数据文件为0。

读取SD卡中的文件时,首先要根据文件名查找该文件的信息结构体。根据文件信息结构体中的起始簇号即可找到数据区第1簇的内容,也可以在FAT表中找到第2个簇号,根据第2个簇号又能找到第2个簇的内容和FAT表中的第3个簇号,直至遇到文件结束标志。这样就可以根据FAT表中的簇号读出全部文件数据。下面以图5-16为例说明读取SD卡文件的具体步骤。

978-7-111-44508-1-Chapter05-101.jpg

图5-16 SD卡文件的读取步骤

1)先在目录项表中找到与文件名匹配的内容,如Myfile,从Myfile所对应的目录项中可以找到该文件的首簇号0004。

2)根据首簇号0004访问FAT表,读出首簇号对应的FAT表项内容0005,即第2个簇号。根据第2个簇号再访问FAT表,读出其对应的内容,即第3个簇号0006,这样依次做下去,直到最后一个表项内容为FFFF为止。

3)由第2步可知,Myfile这个文件占用了4个簇,这4个簇号形成一个簇链:0004-0005-0006-0008,根据这些簇号所形成的簇链访问者4个簇号对应的4个数据存储区,文件Myfile就分别存放在这4个存储区中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈