第 0 扇区
第 0 扇区,英文 。
第0扇区分为两种情况:
物理驱动器中的第0扇区指 MBR
MBR(Master Boot Record 或 Main Boot Record),主引导区记录
更多MBR知识,请访问:https://www.softool.cn/read/mbr/2509031422.html逻辑驱动器中的第0扇区指 Boot Sector
此处的第0扇区可能在物理驱动器中的第2048, 4096 等扇区。
下面介绍的内容属于 逻辑驱动器 范围。
引导扇区
如果U盘有多个分区,那么每个分区的开头扇区(第0扇区 ,我在下面的内容称为卷第0扇区
),又可以称作:
- Boot Sector 引导扇区 ★★★
- DBR = DOS Boot Record
- Reserved Sector 保留扇区
- BPB (BIOS Parameter Block) BIOS参数块
- VBR(卷引导记录) ★★★
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卷上的引导扇区的十六进制数据:
跳转指令(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
注: BPB的基址=0x0B
下面两个表说明了 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表) - 总扇区数
通过总扇区数可以计算得到SD卡的总容量大小:0x03B723C1 * 512 = 31914951168 Bytes - 根目录 开始地址 ★★★
根目录 开始地址的计算公式如下:根目录 开始地址 = [(保留扇区数) + (每 FAT 扇区数) * (FAT 数)] * 扇区字节数
那么,本例计算:根目录 开始地址 = (0x092A + 0x00003B6B * 0x02) * 512 = 0x1000000 Bytes
SofTool.CN
我的理解:
系统ID 可以分类两类:主分区 和 扩展分区。
主分区: 该分区表中的4个分区表项中的 各自记录的 系统ID 不为0 + 不是扩展分区;
扩展分区:该分区表中的4个分区表项中的 各自记录的 系统ID 为 0x05、 0x0F 或 0x85 ,在该分区表中的相对偏移量0x1BE位置又可以记录4个分区表项^_^;
卷、分区和扇区之间的关系
一个卷=一个引导扇区+N个分区
一个分区=N个扇区