4个组成部分
- 保留区域
- 文件分配表区域 (File Partition Table,简称FAT)
- 根目录区域
- 数据区域
保留区域
保留区域的第一个扇区(sector)很重要。它的大小是512 byte,对这个扇区有多种叫法----启动扇区(boot sector),保留扇区(reserved sector),0号扇区(0th sector)等等,在DOS分区下,又被叫做操作系统引导记录区(DOS BOOT RECORD,简称DBR)。
命名 | 字节偏移 | 字节长度 | 功能描述 |
---|---|---|---|
BS_jmpBoot | 0 | 3 | 跳转指令 |
BS_OEMName | 3 | 8 | 厂商标志与版本号 |
BPB_BytsPerSec | 11 | 2 | 每个扇区的字节数,该值只能是512,1024,2048,4096 |
BPB_SecPerClus | 13 | 1 | 每个簇的扇区数,合法值为1,2,4,8,16,32,64,128 。但必须保证(BPB_BytsPerSec*BPB_SecPerClus)<= 32KB。虽然有些操作系统支持64KB大小的簇,但很多应用安装程序无法在这样的FAT文件系统上正常运行 |
BPB_RsvdSecCnt | 14 | 2 | 保留区域的扇区数。该值一定不为0。 |
BPB_NumFATs | 16 | 1 | FAT表的数量,通常为2。 |
BPB_RootEntCnt | 17 | 2 | FAT32该值为0 |
BPB_TotSec16 | 19 | 2 | FAT32该值为0 |
BPB_Media | 21 | 1 | 媒体描述符 |
BPB_FATSz16 | 22 | 2 | FAT32该值为0 |
BPB_SecPerTrk | 24 | 2 | 每磁道扇区数。用于BIOS中断0x13,只对特殊形状的存储介质有效。 |
BPB_NumHeads | 26 | 2 | 磁头数。用于BIOS中断0x13,只对特殊形状的存储介质有效。 |
BPB_HiddSec | 28 | 4 | 隐藏扇区数。 |
BPB_TotSec32 | 32 | 4 | 该分区总扇区数 |
BPB_FATSz32 | 36 | 4 | 一张FAT表所占扇区数 |
BPB_ExtFlags | 40 | 2 | BIT[3:0]:活跃FAT表编号。 BIT[6:4]:保留。 BIT[7]:0–>FAT表实时镜像到所有的FAT表;1–>只有一个FAT表活跃,即 BIT[3:0]所指的FAT表。BIT[15:8]:保留 |
BPB_FSVer | 42 | 2 | FAT32的版本号 |
BPB_RootClus | 44 | 4 | 根目录的首簇簇号。通常是2。也可以是其它值。 |
BPB_FSInfo | 48 | 2 | 保留区域中FSINFO结构的扇区号,通常为1。 |
BPB_BkBootSec | 50 | 2 | 保留区域中备份引导扇区的扇区号,通常为6。 |
BPB_Reserved | 52 | 12 | 保留,以后扩展使用,目前都置0. |
BS_DrvNum | 64 | 1 | 驱动器号。 |
BS_Reserved1 | 65 | 1 | 保留。置0。 |
BS_BootSig | 66 | 1 | 扩展引导标识(0x29),表示接下来的3个域是可用的。 |
BS_VolID | 67 | 4 | 卷序列号 |
BS_VolLab | 71 | 11 | 卷标号 |
BS_FilSysType | 82 | 8 | 文件系统类型。为“FAT12 ”, “FAT16 ”, or “FAT ”三者之一。 |
BS_BootCode | 90 | 420 | 启动代码 |
BS_Signature0x55 | 510 | 1 | 有效标志,固定为0x55 |
BS_Signature0xAA | 511 | 1 | 有效标志,固定为0xAA |
注:BS(Boot Sector),BPB (BIOS Parameter Block)
文件分配表(FAT)
FAT32文件系统中,每条FAT表项占用4 byte,但实际上最高4bit是保留位,未使用。由于有效bits只有28位,所以最大簇号为0xFFFFFFFF(268435455),boot sector规定簇最大为32KB,折算下来最大容量约为8TB。
FAT表项从0开始编号,0 号地址与 1 号地址被系统保留并存储特殊标志内容。从 2 号地址开始,每个地址对应于数据区的簇号, FAT 表中的地址编号与数据区中的簇号相同。
如果某个簇未被分配使用,它所对应的FAT表项内的FAT表项值即用 0 进行填充,表示该 FAT 表项所对应的簇未被分配。当某个簇已被分配使用时,则它对应的 FAT 表项内的 FAT 表项值也就是该文件的下一个存储位置的簇号。
FAT表代表的是一种链式关系。例如一个70KB大小的文件A,假定此时簇大小为32KB,则当前文件需占用3个簇。在目录项中,会记录文件A的各种信息,包括文件的首簇号、时间等等。当拿到首簇号后,查找该簇号的FAT条目,该条目记录的就是下一个存储簇号。假设文件A依次占用的是簇3、4、5。则在目录项中,记录的首簇号是3,而在FAT表中,簇3对应的FAT条目里面记录的是4,,簇4对应的FAT条目记录的则是5,而簇5对应的FAT条目记录的则是结束标志 0x0FFFFFFF。
根目录
根目录的簇号在boot sector中有记录,通常位于2号簇。
根目录在文件系统建立时即已被创建,其目的就是存储文件夹或文件的目录项。每个目录项的大小为 32 个字节。目录项中除记录文件夹或文件起始簇号外,还记录它的名字、大小(文件夹没有大小)、时间值等信息。
每个子目录(文件夹)或文件除具有一个短文件目录项外,还会有长文件名目录项。短文件名目录项固定占用 32 字节,长文件名目录项则根据需要占用 1 个或者若干个 32 字节。
数据区域
该区域存储文件内容。以簇为最小存储单位,即使文件大小不足1个簇,也会占用1个簇。每一个簇都有一个对应的FAT表项。
参考资料
-
Microsoft Extensible Firmware Initiative FAT32 File System Specification
FAT: General Overview of On-Disk Format
微软FAT文件系统白皮书 -
《数据重现 文件系统原理精解与数据恢复最佳实践》 马林