1、前言
本篇文章主要是介绍FAT格式分区数据在硬盘中是如何存储的,FAT分区格式是Microsoft最早支持的分区格式,依据FAT 表中每个簇链的所占位数(有关概念,后面会讲到)分为FAT12、FAT16、 FAT32 三种格式"变种",但其基本存储方式是相似的。我们在嵌入式系统中使用的最多是FAT32,所以后面主要介绍的是FAT32。
2、FAT文件系统结构
FAT文件系统结构图如下所示:
2.1 主引导扇区(MBR)
主引导扇区:硬盘的第一个扇区,由主引导记录(MBR)+ 主分区表(DPT)+ 引导扇区标记(Boot Record ID / Signature)组成,该区域是完成系统BIOS向操作系统交接的重要入口。该扇区在进行硬盘分区时产生。
主引导扇区组成
其中的MBR具体内容我们暂时不需要关心,重点要关心硬盘分区表DPT的数据,即上图中红色划线部分(重点关注蓝色和绿色方框数据),其各个字节表示的作用如下:
对于常见硬盘来说,我们主要关注相对扇区数和总扇区数的值,结合原始数据和分区表含义可以得到重点数据:
1、相对扇区数:保留区1 N扇区 = 0x800 = 2048扇区,也可以得到DBR的地址 = 2048*512 = 0x10 0000 Bytes。
2、总扇区数:对于只有一个分区的U盘来说,该数据表示分区卷的总容量(不包含相对扇区数)
2.2 操作系统引导扇区(DBR)
操作系统引导扇区DBR,也称为引导扇区。包含BIOS参数块,该参数块存储有关卷布局和文件系统结构的信息,以及加载windows的引导代码(暂时不需要关心引导代码)。
下面的示例演示了FAT32卷上引导扇区的十六进制数据:
下面两个表说明了FAT32卷的BPB和拓展BPB的布局,示例值对应FAT32卷上引导扇区的数据。
FAT32分区的BPB字段 | |||
字节位移 | 字段长度 (字节) |
对应取值 | 名称和定义 |
0x0B | 2 | 0x0200 | 扇区字节数(Bytes Per Sector) 硬件扇区的大小。 本字段合法的十进制值有 512、1024、2048 和 4096。对大多数磁盘来说,本字段的值为512。 |
0x0D | 1 | 0x10 | 每簇扇区数(Sectors Per Cluster),一簇中的扇区数。 一个卷默认的簇大小取决于该卷的大小。本字段的合法十进制值有 1、2、4、8、16、32、64 和 128。 |
0x0E | 2 | 0x0C80 | 保留扇区数(Reserved Sector) 第一个 FAT 开始之前的扇区数,包括引导扇区。 (相当于保留区2) |
0x10 | 1 | 0x02 | FAT 数(Number of FAT) 该分区上 FAT 表的个数。本字段的值一般为 2 |
0x11 | 2 | 0x0000 | 根目录项数(Root Entries) 只有 FAT12/FAT16 使用此字段。对 FAT32 分区而言,本字段必须设置为 0 |
0x13 | 2 | 0x0000 | 小扇区数(Small Sector) (只有 FAT12/FAT16 使用此字段)对 FAT32 分区而言,本字段必须设置为 0 |
0x15 | 1 | 0xF8 | 媒体描述符( Media Descriptor) 提供有关媒体被使用的信息。值 0xF8 表示硬盘,0xF0 表示高密度的 3.5寸软盘。 |
0x16 | 2 | 0x0000 | 每 FAT 扇区数(Sectors Per FAT) 只被 FAT12/FAT16 所使用,对 FAT32 分区而言,本字段必须设置为 0 |
0x18 | 2 | 0x003F | 每道扇区数(Sectors Per Track) 包含使用 INT 13h 的磁盘的“每道扇区数”几何结构值。 该分区被多个磁头的柱面分成了多个磁道 |
0x1A | 2 | 0x00FF | 磁头数(Number of Head) 本字段包含使用 INT 13h 的磁盘的“磁头数”几何结构值。 |
0x1C | 4 | 0x00000800 | 隐藏扇区数(Hidden Sector) 该分区上引导扇区之前的扇区数。在引导序列计算到根目录的数据区的绝对位移的 |