1,基本概念
fat32 spec
FAT的全称是File Allocation Table,FAT是在1980s年代初由微软开发的,主要有FAT12,FAT16,FAT32三种,分为这三种的主要原因是FAT12的FAT entry有12bits,FAT16的FAT entry有16bits,FAT32的FAT entry有32bit
2,FAT format
一个扇区(sector)大小为512Byte,一个cluster的大小通常为2的整数次幂的cluster的个数,最大32KB,一个文件至少占用一个cluster,通常为整数个cluster,这整数个cluster互为链表关系
FAT32 format(Data是从cluster计算起的,不存在cluster0和cluster1的。)
MBR |
Boot |
FSInfo |
Rsv |
FAT1 |
FAT2 |
Data |
FAT16 format(Data从Cluster2开始)
MBR |
Boot |
Rsv |
FAT1 |
FAT2 |
RotDir |
Data |
Boot指的是Boot Sector,Boot Sector占用第一个逻辑扇区,大小为512Byte.Boot Sector的详细解释可以参考FAT32 spec,其中主要有用成员如下:
Name |
Offset(byte) |
Size(byte) |
Description |
BPB_BytsPerSec |
11 |
2 |
描述每个sector多少byte,通常为512(向前兼容),也可以取值为1024,2048,4096, 注:如果设备有物理sector为N且N大于512,那么取值为N但是不能超过4096 |
BPB_SecPerClus |
13 |
1 |
表明每个cluster有多少个sector,通常为2的整数次幂,但是一个cluster通常不会超过32K |
BPB_RsvdSecCnt |
14 |
2 |
在Reserved region里保留sector的个数,对于FAT12 FAT16此值为1,对于FAT32此值为32 |
BPB_NumFATs |
16 |
1 |
FAT data structure的个数,通常为2,FAT1和FAT2,安全性互为备份的关系 |
BPB_RootEntCnt |
17 |
2 |
对于FAT32此值为0,对于FAT12和FAT16,此值含义是32byte根目录入口的个数 |
BPB_TotSec16 |
19 |
2 |
对于FAT12和FAT16,此值表示的是整个fatimg里sector的个数,对于FAT32此值为0,整个fatimg里sector的个数在offset 32长度为4的范围里表示。 |
BPB_Media |
21 |
1 |
0Xf8表示的是non-removable media,0XF0表示的是removable media,该值要和FAT[0]的低位相同 |
BPB_FATSz16 |
22 |
2 |
对于FAT12和FAT16,表明的是一个FAT占用sector的大小,对于FAT32,此值为0 |
BPB_HiddSec |
28 |
4 |
对于不带分区的设备,此值为0,对于其他的,此值的含义是在partition前的隐藏sector的个数 |
BPB_TotSec32 |
32 |
4 |
对于FAT32表明的是整个设备的sector的个数。不包含之前的MBR |
以下是针对FAT32的。
Name |
Offset(byte) |
Size(byte) |
Description |
BPB_FATSz32 |
36 |
4 |
一个FAT表占用的sector的个数,FAT32有两个FAT表,互为备份关系,FAT12和FAT16该项内容为空。 |
BPB_ExtFlags |
40 |
2 |
Bit7为0表示的是在运行的时候FAT表1和FAT表2是互为镜像的,bit7为1表示在运行的时候只有一个FAT表是活动的,FAT12和FAT16该项内容为空。 |
BPB_RootClus |
44 |
4 |
根目录所在cluster的cluster的序号,通常为2,即Data region的第二个cluster是根目录,这样从cluster2就可以方便找到根目录(个人理解cluster是从Data region开始算起) |
BPB_FSInfo |
48 |
2 |
表明了fsinfo占用的sector的个数 |
BPB_BkBootSec |
50 |
2 |
Reserved area里对boot sector备份的个数。 |
BPB_Reserved |
52 |
12 |
保留将来扩展使用 |
BS_DrvNum |
64 |
1 |
|
BS_FilSysType |
82 |
8 |
FAT32通常设置为字符串“FAT32” |
|
510 |
2 |
固定值 0X55 AA,这个固定值一定偏移是510位置,不随sector的改变而改变
|