1.基本知识
扇区:每个磁道被分为若干个弧段,这些弧段就是扇区。通常情况下,每个扇区512个字节。
簇:FAT将磁盘空间按一定数目的扇区为单位进行划分,这样的单位称为簇。簇的大小一般为2的N次方。
2.FAT16表的组织形式
使用FAT文件系统必须具有几个部分:保留区,存放FAT的文件系统的重要参数和引导程序;FAT表,记录簇的使用情况;根目录区,记录根目录信息。
Fat16的组织形式 |
引导扇区 | FAT1 | FAT2(重复的) | 根文件夹 | 其他文件夹及所有文件 | 剩余扇区 |
1扇区 | 实际情况取大小 | 同FAT1 | 32个扇区 | 开始簇编号(从2开始) | 不足一簇 |
保留区的第一个扇区是DBR区,称为引导扇区。它是系统可访问的第一个扇区,主要包括与引导操作系统有关的引导参数和引导程序,还有与FAT文件系统有关的BPB参数。
1)DBR参数的偏移0x11处记录了根目录所占扇区的数目;偏移0x16记录了FAT表所占扇区的数据;偏移0x10记录了FAT表的副本数目。系统在得到这几项参数以后,就可以确定数据区的开始扇区偏移。
2)FAT16文件系统从根目录所占的32个扇区之后的第一个扇区开始以簇为单位进行数据的处理,对于根目录之后的第一个簇,编号为第2簇。
3)FAT文件系统之所以有12,16,32不同的版本之分,其根本在于FAT表用来记录任意一簇链接的二进制位数。以FAT16为例,每一簇在FAT表中占据2字节(二进制16位)。所以,FAT16最大可以表示的簇号为0xFFFF(十进制的65535)。
3.FAT
FAT表的作用是记录磁盘上簇的分配情况,系统中,会把FAT表全部读到内存中区。一个文件往往需要占用很多个簇。同一个文件不一定会完整地存放在一个连续的存储空间内,而是分成若干段,像链子一样地存放。在文件名记录中,指向文件存储的链头所在的FAT簇,而该簇的FAT表存放下一个链子的FAT簇值。
FAT16记录项的取值含义(16进制) |
FAT16记录项的取值 | 对应簇的表现情况 |
0000 | 未分配的簇 |
0002~FFEF | 已分配的簇 |
FFF0~FFF6 | 系统保留 |
FFF7 | 坏簇 |
FFF8~FFFF | 文件结束簇 |
1)FAT表以"F8 FF FF FF" 开头。
2)FAT表记录了磁盘数据文件的存储链表。
4.FDT
根目录区记录着SD卡里存储的所有文件和目录信息,如图所示。得到文件信息后,便可对相应文件进行操作。
FAT16目录项32个字节的表示定义 |
字节偏移(16进制) | 字节数 | 定义 |
0x0~0x7 | 8 | 文件名 |
0x8~0xA | 3 | 扩展名 |
0xB | 1 | 属性字节 | 00000000(读写) |
00000001(只读) |
00000010(隐藏) |
00000100(系统) |
00001000(卷标) |
00010000(子目录) |
00100000(归档) |
0xC~0x15 | 10 | 系统保留 |
0x16~0x17 | 2 | 文件的最近修改时间 |
0x18~0x19 | 2 | 文件的最近修改日期 |
0x1A~0x1B | 2 | 表示文件的首簇号 |
0x1C~0x1F | 4 | 表示文件的长度 |
1)0x0偏移处的取值若为00H,表明目录项为空;若为E5H,表明目录项曾被使用,但对应的文件或文件夹已被删除。
5.DBR
表6 一个FAT16分区上的引导扇区段 |
字节位移 | 字段长度(字节) | 字段名称 |
0x00 | 3 | 跳转指令(Jump Instruction) |
0x03 | 8 | OEM ID |
0x0B | 25 | BPB |
0x24 | 26 | 扩展BPB |
0x3E | 448 | 引导程序代码(Bootstrap Code) |
0x01FE | 4 | 扇区结束标识符(0x55AA) |
表7 FAT16分区的BPB字段 |
字节位移 | 字段长度(字节) | 例值 | 名称和定义 |
0x0B | 2 | 0x0200 | 扇区字节数(Bytes Per Sector) 硬件扇区的大小。本字段合法的十进制值有512、1024、2048和4096。对大多数磁盘来说,本字段的值为512 |
0x0D | 1 | 0x40 | 每簇扇区数(Sectors Per Cluster) 一个簇中的扇区数。由于FAT16文件系统只能跟踪有限个簇(最多为65536个)。因此,通过增加每簇的扇区数可以支持最大分区数。分区的缺省的簇的大小取决于该分区的大小。本字段合法的十进制值有 1、2、4、8、16、32、64和128。导致簇大于32KB(每扇区字节数*每簇扇区数)的值会引起磁盘错误和软件错误 |
0x0e | 2 | 0x0001 | 保留扇区数(Reserved Sector) 第一个FAT开始之前的扇区数,包括引导扇区。本字段的十进制值一般为1 |
0x10 | 1 | 0x02 | FAT数(Number of FAT)该分区上FAT的副本数。本字段的值一般为2 |
0x11 | 2 | 0x0200 | 根目录项数(Root Entries) 能够保存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数。在一个典型的硬盘上,本字段的值为512。其中一个项常常被用作卷标号(Volume Label),长名称的文件和文件夹每个文件使用多个项。文件和文件夹项的最大数一般为511,但是如果使用的长文件名,往往都达不到这个数 |
0x13 | 2 | 0x0000 | 小扇区数(Small Sector) 该分区上的扇区数,表示为16位(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它 |
0x15 | 1 | 0xF8 | 媒体描述符( Media Descriptor)提供有关媒体被使用的信息。值0xF8表示硬盘,0xF0表示高密度的3.5寸软盘。媒体描述符要用于MS-DOS FAT16磁盘,在Windows 2000中未被使用 |
0x16 | 2 | 0x00FC | 每FAT扇区数(Sectors Per FAT) 该分区上每个FAT所占用的扇区数。计算机利用这个数和FAT数以及隐藏扇区数来决定根目录在哪里开始。计算机还可以根据根目录中的项数(512)决定该分区的用户数据区从哪里开始 |
0x18 | 2 | 0x003F | 每道扇区数(Sectors Per Trark) |
0x1A | 2 | 0x0040 | 磁头数(Number of head) |
0x1C | 4 | 0x0000003F | 隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数。在引导序列计算到根目录和数据区的绝对位移的过程中使用了该值 |
0x20 | 4 | 0x003EF001 | 大扇区数(Large Sector) 如果小扇区数字段的值为0,本字段就包含该FAT16分区中的总扇区数。如果小扇区数字段的值不为0,那么本字段的值为0 |