Boot Sector 组成

在FAT32文件系统中,DBR(DOS Boot Record,也称为 Boot Sector 或 引导扇区是文件系统的第0个扇区(扇区0,通常为512字节),存储了启动计算机所需的引导代码及文件系统的关键参数。

FAT32引导扇区在结构上与FAT16引导扇区非常相似,但是FAT32 BPB(BIOS Parameter Block)包含额外的字段。

下表描述了用FAT32文件系统格式化的卷的引导扇区的各个部分。

字节偏移量 字段长度 字段名
0x00 3 个字节 跳转指令(Jump instruction)
0x03 8 个字节 厂商标志+版本号(OEM Name)
0x0B 53 个字节 BPB(BIOS Parameter Block)
0x40 26 个字节 扩展 BPB(Extended BPB)
0x5A 420 个字节 引导程序代码(Bootstrap code)
0x01FE 2 个字节 有效结束标志(End of sector marker) : 0xAA55

各字段介绍

下面的示例演示了FAT32卷上的引导扇区的十六进制数据:
4.FAT32 引导扇区(Boot Sector) - 图1

跳转指令:EB 58 90

0xEB:短跳转(Short Jump)操作码
0x58:跳转的偏移量(十进制88),表示跳过88字节。
0x90:NOP(无操作指令,用于对齐)。
效果:CPU从0x00跳转到0x5A(0x00 + 0x58 + 2,跳转指令自身占2字节)。

其他可能值:0xE9 0xXX 0xXX
近跳转(Near Jump),占用3字节,跳转范围更大。

对于U盘此部分可以忽略。

BPB

下面两个表说明了FAT32卷的BPB和扩展的BPB的布局,示例值对应于FAT32卷上引导扇区的数据。

字节位移 字段长度(字节) 对应取值 名称和定义
0x0B 2 0x0200 扇区字节数(Bytes Per Sector) - 硬件扇区的大小
本字段合法的十进制值有 512、1024、2048 和 4096。
对大多数磁盘来说,本字段的值为512=0x0200。
0x0D 1 0x20 每簇扇区数(Sectors Per Cluster) - 一簇中的扇区数
一个卷默认的簇大小取决于该卷的大小。
本字段的合法十进制值有 1、2、4、8、16、32、64 和 128。
0x0E 2 0x092A 保留扇区数(Reserved Sector)★★★
FAT1之前的扇区数,包括引导扇区(扇区0)
0x10 1 0x02 FAT 数(Number of FAT)★★★
当前盘符分区上有几个FAT表;
本字段的值一般为 2(E.g FAT1 和 FAT2,所以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)
记录磁盘的物理几何参数,表示每个磁道(track)包含的扇区数
该分区被多个磁头的柱面分成了多个磁道
0x1A 2 0x00FF 磁头数(Number of Head)
0x1C 4 0x0000003F 隐藏扇区数(Hidden Sector)
0x20 4 0x03B723C1 总扇区数(Large Sector)
本字段包含 FAT32 分区中总的扇区数
0x24 4 0x00003B6B 每FAT扇区数(Sectors Per FAT) - 仅FAT32使用
每个FAT表 占用的 磁盘扇区 数量
计算机利用这个数和计算机利用这个数和 FAT 数以及保留扇区数(本表中所描述的)来决定根目录从哪里开始。该计算机还可以从目录中的项数决定该分区的用户数据区从哪里开始
0x28 2 0x0000 扩展标志(Extended Flag) - 仅FAT32使用
该两个字节结构中各位的值为:
位 0-3:活动 FAT 数(从 0 开始计数,而不是 1).只有在不使用镜像时才有效
位 4-6:保留
位 7:0值意味着在运行时FAT被映射到所有的FAT,1值表示只有一个 FAT是活动的
位 8-15:保留
0x2A 2 0x0000 文件系统版本(File System Version) - 仅FAT32使用
0x2C 4 0x00000002 根目录簇号(Root Cluster Number) - 仅FAT32使用
本字段的值一般为 2
0x30 2 0x0001 文件系统信息扇区号(File System Info Sector) - 仅FAT32使用
其值一般为 1。
在备份引导扇区(Backup Boot Sector)中保留了该 FSINFO 结构的一个副本,但是这个副本不保持更新
0x32 2 0x0006 备份引导扇区(Backup Boot Sector)
非“0”表示存储引导扇区副本的扇区号。
该字段的值通常为6。
0x34 12 0x00 保留(Reserved) - 仅FAT32使用
本字段的值总为 0

扩展BPB

字节位移 字段长度(字节) 对应取值 名称和定义
0x40 1 0x80 物理驱动器号(Physical Drive Number)
盘驱动器被标识为 0x00,物理硬盘被标识为 0x80,而与物理磁盘驱动器无关。
只有当该设备是一个引导设备时,这个值才有意义
0x41 1 0x00 保留(Reserved)
0x42 1 0x29 扩展引导标签(Extended Boot Signature)
本字段必须要有能被 Windows 2000 所识别的值 0x28 或 0x29
0x43 4 0xBC0C96E0 分区序号(Volume Serial Number)
在格式化磁盘时所产生的一个随机序号,它有助于区分磁盘
0x47 11 “NO NAME” 卷标(Volume Label)
本字段只能使用一次,它被用来保存卷标号。现在,卷标被作为一个特殊文件保存在根目录中
0x52 8 “FAT32” 系统ID(System ID)
FAT32文件系统中一般取为”FAT32”

通过上面 Boot Sector 表格,总结如下:

  • 扇区字节数和每簇扇区数
    硬件扇区的大小为512Bytes,每个簇占用扇区数为32个扇区
    即:1簇=32扇区, 1扇区=512B
  • 保留扇区数
    我们可以通过保留扇区数可以找到FAT表的起始位置,FAT Table Start Address = 0x092A * 512 = 0x125400 Bytes。确实在地址0x125400位置找到了FAT表,如下:(后面还会详细分析FAT表)
    4.FAT32 引导扇区(Boot Sector) - 图2
  • 总扇区数
    通过总扇区数可以计算得到SD卡的总容量大小:0x03B723C1 * 512 = 31914951168 Bytes
    4.FAT32 引导扇区(Boot Sector) - 图3
  • 根目录 开始地址 ★★★
    根目录 开始地址的计算公式如下:
    根目录 开始地址 = [(保留扇区数) + (每 FAT 扇区数) * (FAT 数)] * 扇区字节数
    那么,本例计算:
    根目录 开始地址 = (0x092A + 0x00003B6B * 0x02) * 512 = 0x1000000 Bytes

4.FAT32 引导扇区(Boot Sector) - 图4