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的改变而改变 |