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的改变而改变 
  | 
原文:http://www.cnblogs.com/zhiliao112/p/4067860.html