FAT32文件系统详细分析 (续FAT文件系统详解)
文章目录
- FAT32文件系统详细分析 (续FAT文件系统详解)
- 1. 前言
- 2. 格式化SD nand/SD卡
- 3. FAT32文件系统分析
- 3.1 保留区分析
- 3.1.1 BPB(BIOS Parameter Block) 及BS区分析
- 3.1.2 FSInfo 结构扇区分析
- 3.1.3 引导扇区剩余扇区
- 3.1.4 备份引导扇区
- 3.1.5 保留区剩余区域
- 3.2 分区偏移及大小计算
- 3.3 FAT区分析:
- 3.3.1 FAT1
- 3.3.2 FAT2
- 3.4 数据区分析:
- 4. 总结
1. 前言
续上一篇文章 FAT文件系统详解(点击跳转!)
在上一篇文章,我们已经对FAT文件系统有了一个详细的介绍,但由于FAT文件系统由历史发展,存在FAT12/16/32三种系统,在上一篇文章中采用的是FAT16系统作为实例进行的分析,而FAT32系统存在些许差异,且FAT32文件系统在当前应用广泛,因此特补充此篇博文,完善FAT32的示例分析。
2. 格式化SD nand/SD卡
- 格式化SD nand / SD卡,强制采用FAT32格式,分配每个簇大小为2048Byte,同时为了避免其他原有数据干扰,我们此处取消快速格式化。
- 使用 WinHex 打开分析
3. FAT32文件系统分析
FAT文件系统布局图如下,和FAT16上有些许差别:
3.1 保留区分析
保留区分为引导扇区、备份引导扇区及其他字段,具体数据段分析如下。
3.1.1 BPB(BIOS Parameter Block) 及BS区分析
BPB及BS参数内容数据如下:
EB 58 90
:BS_JmpBoot,跳转指令4D 53 44 4F 53 35 2E 30
:BS_OEMName,MSDOS 5.0,一个名字,指示创建此卷的操作系统,无其他作用`00 02
:BPB_BytsPerSec,扇区大小 512 字节04
:BPB_SecPerClus,每次操作的最小扇区数,簇 Cluster,4 (与格式化时选择的大小匹配 2048 = 512 * 4)16 11
:BPB_RsvdSecCnt,保留区的扇区数,0x1116=4374 (通过此可计算,FAT区起始地址为 4374 * 512 = 0x22 2C00)02
:BPB_NumFATs,FATs的个数,2(一般此值为2,多一个用来做冗余备份,解决系统异常导致第一个损坏时,增大恢复的可能性,表示FAT区有两个FATs备份)00 00
:BPB_RootEntCnt,0,在FAT12/16系统中,此字段表示根目录中32字节目录条目数量,设置此值时需注意对齐,为了最大的兼容性,FAT16系统上此值应设置为512,FAT32系统上此值应设置为000 00
:BPB_TotSec16,16位大小区域描述FAT卷扇区总数,0。当FAT12/16系统扇区数 ≥0x10000(65536)时,此字段应设置为0,真实值存放在 BPB_TotSec32 字段;对于FAT32系统,此值必须为0。(此处由于我们的总扇区数=118.510241024/512 = 242688 > 65536,所以此字段为0)F8
:BPB_Media 媒体类型00 00
:BPB_FATSz16,00,一个FAT占用的扇区数,此字段仅在FAT12/16系统使用;FAT32系统,此字段必须为0,使用BPB_FATSz32字段替代。3F 00
:BPB_SecPerTrk,每个磁道的扇区数,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。FF 00
:BPB_NumHeads,头数量,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。00 00 00 00
:BPB_HiddSec,0,FAT 卷之前的隐藏物理扇区数(当磁盘被分区之后,当前分区并不一定是从扇区头开始的)00 08 0F 00
:BPB_TotSec32,0x0F0800 = 985088(整个卷空间大小),32位大小区域描述FAT卷扇区总数。 FAT12/16系统,扇区总数小于0x10000时,此字段必须为0,真实值存放在BPB_FATSz16;FAT32系统,此字段一直有效。(481M = 512 * 985088)
以上是FAT12/16/32公共字段,接下来是FAT32独有字段
75 07 00 00
:BPB_FATSz32,1909,一个FAT占用的扇区数,FAT区总大小等于 BPB_FATSz?? * BPB_NumFATs 扇区。(由此可计算FAT区总大小:1909 * 2 = 3818扇区 = 3818 * 512Byte = 0x1D D400 Byte)00 00
: BPB_ExtFlags,扩展标识字段,bit7=0,表示所有FAT都是镜像的和活跃的;bit7=1,表示只有bit3-0表示的FAT是有效的。00 00
:BPB_FSVer:FAT32版本,高字节是主版本号,低字节是次版本号。02 00 00 00
:BPB_RootClus,2, 根目录的第一个簇号,此值通常为2,因为前两个簇一般用于保留。01 00
:BPB_FSInfo,1,FSInfo结构扇区与FAT32卷顶部的偏移扇区值。此值通常为1,因为其通常位于引导扇区旁边。06 00
:BPB_BkBootSec,6, 备份引导扇区与FAT32卷顶部的偏移扇区值。此值通常为6,考虑最大的兼容性,此值不建议为其他值。00 00 00 00 00 00 00 00 00 00 00 00
:BPB_Reserved,0,保留80
:BS_DrvNum
,IBM PC 的磁盘 BIOS 使用的驱动器号,00h代表软盘,80h代表固定磁盘00
:BS_Reserved,保留字段,029
:BS_BootSig,扩展引导签名,表示以下存在三个字段30 D1 B5 78
:BS_VolID,与 BS_VolLab 一起构成卷序列号,一般在格式化的时候结合时间生成4E 4F 20 4E 41 4D 45 20 20 20 20
:(解析为:"NO NAME “),BS_VolLab,11byte卷标,当卷标不存在时,此值应设置为"NO NAME”46 41 54 33 32 20 20 20
:BS_FilSysType,始终为"FAT32 ",对FAT类型的确定没有任何影响。33 C9 ... B9 01 00 00
:BS_BootCode32,引导启动程序,与平台有关,不使用时填充为0BS_BootSign
:0xAA55,引导签名,指示这是一个有效的引导扇区
当扇区大小大于512字节时,剩余的字段应全部使用0x0填充。
3.1.2 FSInfo 结构扇区分析
FSInfo 数据结构为FAT32系统所特有,其目的是记录FAT32系统上剩余的簇数量以及下一个空闲簇数据;以避免扫描整个磁盘搜索导致的时间浪费。
FSInfo数据偏移可从引导扇区内的 BPB_FSInfo
参数获取,此处为 1,因此 FSInfo 数据偏移为1个扇区,对应512Byte,0x200地址处。FSInfo数据结构如下:
字段名 | 偏移 | 大小 | 描述 |
---|---|---|---|
FSI_LeadSig | 0 | 4 | 固定值为0x41615252,头部签名 |
FSI_Reserved1 | 4 | 480 | 保留区域,采用0x00覆盖 |
FSI_StrucSig | 484 | 4 | 固定值为0x61417272,也是一个签名 |
FSI_Free_Count | 488 | 4 | 记录了空闲的簇数,如果这个值为0xFFFF FFFF,则表示不知道具体的空闲簇数 |
FSI_Nxt_Free | 492 | 4 | 提示驱动程序应该从此参数提示的簇开始寻找空闲的簇,通过此参数便可以不用从FAT区头开始寻找下一个空闲簇了,节省了大量时间;如果此参数为0xFFFF FFFF,则驱动程序应该从头部(2号簇)开始寻找空闲簇 |
FSI_Reserved2 | 496 | 12 | 保留区域,采用0x00覆盖 |
FSI_TrailSig | 508 | 4 | 固定值0xAA550000,尾部签名 |
内容如下:
3.1.3 引导扇区剩余扇区
FAT32引导扇区总共有三个512Byte的扇区构成。BPB、BS、FSInfo字段已使用了2个扇区,还剩有一个扇区未使用,字段为0,如下图所示,需要注意的是,此扇区在偏移值510处依旧存在尾部签名0xAA55。
引导扇区剩余字段,为非有效字段,采用0x00填充。
3.1.4 备份引导扇区
相比FAT12/16,FAT32系统上存在引导扇区的备份,此块区域偏移参考引导扇区内BPB_BkBootSec
字段,当前引导扇区内此参数值为6, 因此在当前文件系统内,备份引导扇区的偏移为 6号扇区,对应偏移地址为 BPB_BkBootSec
* BPB_BytsPerSec
= 6 * 512Byte = 3072Byte = 0xC00
3.1.5 保留区剩余区域
在FAT32系统中,保留区除了 BPB区域、FSInfo区域以及这两个区域的备份区域外,还有一部分区域,目前我没找到此区域的作用,我理解为此块区域是作为某种引导程序,数据内容如下:
关于此块区域,欢迎大家在评论区讨论!
此外,还有一处区域的存在也欢迎大家讨论,即FSInfo扇区后面的一个扇区,只有看到尾部签名,其他数据为空,目前也未找到此处有关说明,后续清楚后会在此补充,亦欢迎大家在评论区讨论!
3.2 分区偏移及大小计算
知道BPB参数内容之后,便可以进行分区偏移及大小计算了!
各分区偏移地址及大小如下:
分区名 | 起始扇区 | 起始地址 | 分区大小 | 备注 |
---|---|---|---|---|
保留区 | 0x00 | 0x00 | 扇区数: BPB_RsvdSecCnt = 4374 字节数: BPB_BytsPerSec ✖ BPB_RsvdSecCnt = 4374 ✖ 512 = 2239488 = 0x22 2C00 | |
FAT区 | FatStartSector = BPB_RsvdSecCnt = 4373 | 0x22 2C00 | 扇区数:FatSectors = BPB_FATSz?? ✖ BPB_NumFATs = 1909 ✖ 2 = 3818 字节数:3818 ✖ 512 = 1954816= 0x1D D400 | |
根目录区 | 无 | - | - | - |
数据区 | DataStartSector = FatStartSector + FatSectors = 4374 + 3818 = 8192 | 0x222C00 + 0x1DD400= 0x40 0000 | 扇区数:DataSectors = BPB_TotSec32 - DataStartSector = 985088 - 8192 = 976896 |
关于FAT区,通常存在一个以上的FAT,如此处所格式化的sd卡便存在两个FAT,对应的偏移地址和大小如下:
FAT | 起始扇区 | 起始地址 | 分区大小 | 备注 |
---|---|---|---|---|
FAT1 | 4373 | 0x22 2C00 | 扇区数:1909 字节数:1909 ✖ 512 = 977408 | |
FAT2 | 4373 + 1909 = 6282 | 0x22 2C00 + 1909 ✖ 512 = 0x31 1600 | 扇区数:1909 字节数:1909 ✖ 512 = 977408 |
注意:在FAT32系统中,根目录区不存在,但依旧存在根目录,不过是根目录作为数据区的一部分!
3.3 FAT区分析:
FAT32系统与FAT12/16系统在FAT区数据一个显著差别是:FAT32每条FAT条目占32bit,FAT16占16个bit,FAT12占12bit。关于此部分更详细描述,可参考上一篇:FAT文件系统详解(点击跳转!) 的 4.3 章节!
3.3.1 FAT1
FAT1偏移地址:0x22 2C00
数据内容如下:
3.3.2 FAT2
FAT2是FAT1的备份,偏移地址:0x31 1600
数据内容与FAT1一致,如下:
3.4 数据区分析:
偏移地址:0x40 0000
由参数BPB_RootClus
可知,数据区第一个簇是2号簇。
打开数据区的第一个簇,里面存放的内容便是根目录的内容!这也就是为什么FAT32没有根目录区,但依旧存在根目录的实现方式。数据内容如下:
之后我们看到3号簇的内容:
数据字段如下图所示,由于在上一篇博文中已对长短文件名每个字段进行过细致分析,此处不再做过度分析,仅抽取关键字段进行分析,如下图所示:
之后切换到4号簇和5号簇,可以查看到对应数据:
从6号簇开始便没有在使用,均为空闲簇,对应上 FSInfo 结构内 FSI_Nxt_Free
字段的内容。
4. 总结
相比FAT16系统,FAT32文件系统在保留区有了更多的设计:
1)增加了引导扇区的备份,异常掉电等情况下可恢复性更强;
2)增加了FSInfo结构,对于大容量flash访问将更加高效;
此外FAT32系统取消了根目录区,将根目录移至数据区,根目录与普通目录本来就没有什么区别,确实也不用单独分一个区存放,提高了一致性。
关于数据的存储思想,依旧保持不变:FAT区内的FAT条目通过簇链记录扇区使用情况及文件占用的扇区情况;数据区内目录和文件都作为文件,通过目录这一类特殊文件,描述文件属性以及实际文件内容存放的簇的方式,将整个文件管理起来。
综上,便是FAT32格式文件系统的详细解析,欢迎大家评论区进行积极讨论与反馈!!!
创作不易,转载请注明出处!
关注、点赞+收藏,可快速查收博主有关分享!
相关推荐:
-
上一篇:FAT文件系统详解(点击跳转)
-
博客主页:
爱出名的狗腿子(点击跳转)