第 0 扇区
第 0 扇区,英文 。
因随着时间推移,功能发展,第0扇区因多种原因又被称为:
- MBR(Master Boot Record 或 Main Boot Record),主引导区记录
- Boot Sector 引导扇区
- 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卷上的引导扇区的十六进制数据:
跳转指令: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表) - 总扇区数
通过总扇区数可以计算得到SD卡的总容量大小:0x03B723C1 * 512 = 31914951168 Bytes - 根目录 开始地址 ★★★
根目录 开始地址的计算公式如下:根目录 开始地址 = [(保留扇区数) + (每 FAT 扇区数) * (FAT 数)] * 扇区字节数
那么,本例计算:根目录 开始地址 = (0x092A + 0x00003B6B * 0x02) * 512 = 0x1000000 Bytes
DPT
DPT = Partition Table,分区表,占64B;
DPT含4个分区项,字节偏移地址为 0x1BE~0x1FD,每个分区项长16个字节;
每个DPT中16B的偏移地址及具体含义如下:(下图中的相对偏移地址的基地址为0x1BE)
绝对偏移地址 | 相对偏移地址 | 字节长度 | 值 | 字段名和定义 |
---|---|---|---|---|
0x01BE | 0 | BYTE | 0x80 | 引导指示符 (Boot Indicator) 指明该分区是否是活动分区。 |
0x01BF | 1 | BYTE | 0x01 | 开始磁头 (Starting Head) |
0x01C0 | 2 | 6位 | 0x01 | 开始扇区 (Starting Sector) 只用了0 |
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字节的数据都以实际数据显示,就是按高位到地位的方式显示。存储时是按低位到高位存储的。
分区表类型 (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 |
注:
表格分为两列,分别显示分区类型编号和对应的分区类型描述