第 0 扇区

第 0 扇区,英文 0thSector0^{th} Sector

  • MBR(Master Boot Record 或 Main Boot Record),主引导区记录

如果U盘只有一个分区,那么它又可以称为下面介绍的引导扇区。

引导扇区

如果U盘有多个分区,那么每个分区的开头扇区(我叫做 相对第0扇区),又可以称作:

  • Boot Sector 引导扇区
  • DBR = DOS Boot Record
  • Reserved Sector 保留扇区
  • BPB (BIOS Parameter Block) BIOS参数块

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

跳转指令(3B):EB 58 90

0xEB:短跳转(Short Jump)操作码
0x58:跳转的偏移量(十进制88),表示跳过88字节(从第Offset=2开始算,即2+88=90=0x5A)。
0x90:NOP(无操作指令,用于对齐)。

其他可能值: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

DPT

DPT = Partition Table,分区表,占64B;
DPT含4个分区项(固定值),字节偏移地址为 0x1BE~0x1FD,每个分区项占16个字节(固定值);

每个分区项16B的偏移地址及具体含义如下:(下图中的相对偏移地址的基地址为0x1BE)

绝对偏移地址 相对偏移地址 字节长度 字段名和定义
0x01BE 0 BYTE 0x80 引导指示符 (Boot Indicator) 指明该分区是否是活动分区。
0x01BF 1 BYTE 0x01 开始磁头 (Starting Head)
0x01C0 2 6位 0x01 开始扇区 (Starting Sector) 只用了05位。第67位被开始柱面字段使用。
0x01C1 3 10位 0x00 开始柱面 (Starting Cylinder) 由开始扇区的最后2位+8位组成,10位最大值1023。
0x01C2 4 BYTE 0x07 系统ID (System ID) 定义
分区表类型(请详见下面的表)★
0x01C3 5 BYTE 0xFE 结束磁头 (Ending Head)
0x01C4 6 6位 0xFF 结束扇区 (Ending Sector) 只使用0~5位,第6~7位被结束柱面字段使用。
0x01C5 7 10位 0x7B 结束柱面 (Ending Cylinder) 由结束扇区的最后2位+8位组成,10位最大值1023。
0x01C6 8 DWORD 0x0003F 相对扇区数 (Relative Sectors) 磁盘起始到该分区的扇区偏移量。
0x01CA 12 DWORD 0xAA83F 总扇区数 (Total Sectors) 该分区的扇区总数。

注:上表中的超过1字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。

系统ID,又称 分区表类型 (System ID) ★

类型编号(Hex) 分区类型描述 类型编号(Hex) 分区类型描述
00 空,Microsoft不允许使用 63 GNU HURD or Sys
01 FAT32 64 Novell Netware
02 XENIX root 65 Novell Netware
03 XENIX usr 70 Disk Secure Mult
04 FAT16 <32M 75 PC/IX
05 Extended ★ 80 Old Minix
06 FAT16 81 Minix/Old Linux
07 HPFS/NTFS 82 Linux swap
08 AIX 83 Linux
09 AIX bootable 84 OS/2 hidden C:
0A OS/2 Boot Manage 85 Linux extended ★
0B Win95 FAT32 86 NTFS volume set
0C Win95 FAT32 ★★ 87 NTFS volume set
0E Win95 FAT16 93 Amoeba
0F Win95 Extended(>8GB) ★ 94 Amoeba BBT
10 OPUS 0A IBM Thinkpad hidden
11 Hidden FAT12 A5 BSD/386
12 Compaq diagnose A6 Open BSD
16 Hidden FAT16 A7 NextSTEP
14 Hidden FAT16<32GB B7 BSDI fs
17 Hidden HPFS/NTFS B8 BSDI swap
18 AST Windows swap B6 Solaris boot
1B Hidden FAT32 partition C1 DRDOS/sec
1C Hidden FAT32 partition (LBA) C4 DRDOS/sec
1E Hidden LBA VFAT partition C6 DRDOS/sec
24 NEC DOS C7 Syrinx
3C Partition Magic DB CP/M/CTOS
40 Venix 80286 E1 DOS access
41 PPC PreP Boot E3 DOS R/0
42 SFS E4 SpeedStor
4D QNX4.x EB BeOS fs
4E QNX4.x 2nd part F1 SpeedStor
4F QNX4.x 3rd part F2 DOS 3.3+ secondary partition
50 Ontrack DM F4 SpeedStor
51 Ontrack DM6 Aux FE LAN step
52 CP/M FF BBT
53 OnTrack DM6 Aux
54 OnTrack DM6
55 EZ-Drive
56 Golden Bow
5C Priam Edisk
51 Speed Stor

注:
表格分为两列,分别显示分区类型编号和对应的分区类型描述

SofTool.CN
我的理解:
系统ID 可以分类两类:主分区 和 扩展分区。
主分区: 该分区表中的4个分区表项中的 各自记录的 系统ID 不为0 + 不是扩展分区;
扩展分区:该分区表中的4个分区表项中的 各自记录的 系统ID 为 0x05、 0x0F 或 0x85 ,在该分区表中的相对偏移量0x1BE位置又可以记录4个分区表项^_^;

卷、分区和扇区之间的关系

一个卷=一个引导扇区+N个分区
一个分区=N个扇区