Introduction

A boot sector is the sector of a persistent data storage device (e.g. hard disk, floppy disk, optical disc, etc.) which contains machine code to be loaded into random-access memory (RAM) and then executed by a computer system's built-in firmware -- Wikipedia

MBR 简介

引导扇区(Boot Sector),又称之为引导块(Boot Block)是硬盘、软盘或其它数据存储设备上的一个包含引导代码的区域,这些代码可以由计算机系统的内置固件(firmware)加载到内存中直接运行。主要有两种类型:MBR 和 PBR(VBR)。

主引导记录(MBR, Master Boot Record):

The Master Boot Record (MBR) is the information in the first sector of any hard disk or diskette that identifies how and where an operating system is located so that it can be boot (loaded) into the computer's main storage or random access memory.

主引导记录 MBR 是存储在主引导扇区 MBS 里面的数据内容,因此常常将二者混为一谈,慢慢地主引导扇区 MBS 的概念就有些淡化了,就干脆叫做 MBR 扇区了。同理,PBR 与 PBS 的关系也类似。

所以你现在往往可以看到这样的 MBR 解释:

A master boot record (MBR) is a special type of boot sector at the very beginning of partitioned computer mass storage devices like fixed disks or removable drives intended for use with IBM PC-compatible systems and beyond. -- Wikipedia

对于传统的 PC 机硬盘而言,每个硬盘的 0 柱面 0 磁头 1 扇区都有一个 Master Boot Sector (MBS 主引导扇区), 也就是该硬盘的 MBR 所在的位置。硬盘的每个分区的第一个扇区则是该分区的分区引导扇区(Partition Boot Sector),也就是该分区 PBR(Partition Boot Record) 所在的位置。MBR 占用 512 个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统的分区的引导扇区。

注:盘面号又称磁头号,每个盘面对应一个磁头。

MBR 特点

  • MBR 的内容是在硬盘分区时由分区软件(如 FDISK)写入该扇区的
  • MBR 不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR 也不会夹带操作系统的性质,具有公共引导的特性,但安装某些多重引导功能的软件或 LINUX 的 LILO 时有可能改写它
  • MBR 先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统。
  • 该扇区为隐藏扇区,实际上,0 磁头 0 柱面的扇区均为隐藏扇区,一般的硬盘访问命令无法访问,因此 MBR 分区表放在此处比较安全,不容易遭到破坏,同理,许多病毒也伺机隐藏在这里,不容易被查杀。
  • 对于 PC 机以及兼容架构的系统而言,主引导记录只有存储在可引导设备的引导扇区里才能引导系统。这是这种系统架构的设计所规定的工作方式。

MBR Layout

Structure of a classical generic MBR from Wikipedia

中文版: 标准 MBR 结构

MBR 512 字节,主要由三部分构成:

  1. 引导程序代码(Bootstrap code),最大占 446 字节

    最后 6 个字节为 四个字节的 Windows disk signature 和保留待用的两字节 0x0000

  2. 硬盘分区表 DPT(Disk Partition table for primary partitions),占 64 字节

    硬盘分区有很多用处。考虑到每个区可以安装不同的操作系统,因此主引导记录必须知道将控制权转交给哪个区。 分区表的长度只有 64 个字节,里面又分成四项,每项 16 个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区"。

    每个主分区的 16 个字节,由 6 个部分组成,详细组成在下面有写到。

  3. 主引导扇区结束标志(Boot signature)

    也有称之为 BRID(boot record ID,引导记录标识) 的。 0xAA55 是判别引导区是否有效合法的标志。“55AA” 标志通知系统:该 MBR 扇区是否有效,如果该标志丢失或损坏,磁盘将会显示为未初始化。

    BRID 的主要作用就是判断该设备是否可以用于启动。BIOS 按照“启动顺序”,把控制权转交给排在第一位的储存设备。这时,计算机读取该设备的第一个扇区,也就是读取最前面的 512 个字节。如果这 512 个字节的最后两个字节是 0x55 和 0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给“启动顺序”中的下一个设备。其实主引导记录的主要作用就是告诉计算机到硬盘的哪一个位置去找操作系统。

winhex 定位到 MBR 的图(辅助理解):

MBR hex

人工快速划分 MBR

拿到一个 winhex 展示的 MBR 时,如何人工快速划分其结构?

  1. 确定 55AA 标志

  2. 向上数四行,划分出 DPT,磁盘分区表。 数四行是因为 winhex 等都是一行从 0x0-0xF, 16 个字节, 4 行正好是 64 字节, 即: DPT 的大小

  3. 完成 1,2 步后,再向上全部都是引导代码了。 其中,向上两个字节,一般为空值, 0x0000 再向上四个字节,在本图中为 "7C 95 5A 1F",即:windows 磁盘签名

  4. 接下来我们就要专注于磁盘分区表了

    磁盘分区表 DPT(64 字节) | 字节 | 长度 | 定义 | | :---------: | :---: | :-------------------------------------------------------------------------------------: | | 第 1 个字节 | 1 | 0x00 表示非活动分区,0x80 表示活动分区,四个分区最多有一个激活分区 | | 第 2~4 字节 | 3 | 该分区第一个扇区的物理位置 | | 第 5 个字节 | 1 | 分区类型 | | 第 6~8 字节 | 3 | 该分区最后一个扇区的物理位置 | | 第 9-12 字节 | 4 | 该分区第一个扇区的逻辑地址(也叫本分区之前的扇区数,Sector preceding Partition x(分区序号)) | | 第 13-16 字节 | 4 | 该分区的扇区总数 |

    根据硬盘分区表的格式,分析如下分区表的第一个分区: 20200418172123

    首先我们可以看到,

    第一个字节:0x00 代表非活动分区 第五个字节:分区类型 0x0C, 查分区标识对照表可得其为: FAT32

    常见分区类型表(如果查不到,不代表没有,详细全面的类型表请看上一行的 wiki 链接): | Partition ID | type | | ------------ | ---------------------- | | 0x00 | 空,不允许使用 | | 0x04 | FAT16 格式(<32M) | | 0x05 | 扩展分区 | | 0x06 | FAT16 | | 0x0E | Win95 FAT16 | | 0x0C | Win95 FAT32 | |0x0B| FAT32 with CHS addressing| | 0x82 | Linux Native 分区 | | 0x83 | Linux Swap 分区 | | 0x87 | NTFS | | 0xA6 | Open BSD | | 0xA5 | FreeBSD |

    计算该分区的字节数: 本分区总扇区数: 根据第 13-16 字节,得知为 0x00017800(‭96256‬),又因为每个扇区是 512 字节 因此,该分区的大小:(96256‬*512)/(2^10)=94KB

    最后的四个字节(第 13-16 字节) 是主分区的扇区总数,决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过 2 的 32 次方。,如果每个扇区为 512 个字节,就意味着单个分区最大不超过 2TB。再考虑到扇区的逻辑地址也是 32 位,所以单个硬盘可利用的空间最大也不超过 2TB。如果想使用更大的硬盘,只有 2 个方法:一是提高每个扇区的字节数,二是增加扇区总数。为了解决这些问题,人们发明了 GPT 分区。

至此,对 MBR 的分析基本结束。

EBR

随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是通过主引导记录 MBR 定义的硬盘分区表只能描述 4 个分区,因此出于拓展的需要,规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。

所谓"扩展分区",就是指这个分区里面又分成多个分区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。

扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为 EBR)。它里面也包含一张 64 字节的分区表但是最多只有两项(也就是两个逻辑分区)

那如果我们希望逻辑分区不止两个,怎么实现呢? 我们往往采取类似于单链表的结构,其中四个主分区表项中的一个当做单链表的起始头,描述多余磁盘容量,即:扩展分区。该分区表项记录第一个逻辑分区的地址(第一个逻辑分区的 EBR 的地址),而 EBR 中两个分区表项:一项记录该逻辑分区(逻辑驱动器)的位置,另一项记录下一个逻辑分区的地址(第二个逻辑分区的 EBR 的地址),就这样一直链接下去,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。

系统在启动时按照分区链的链接顺序查找分区。当然,若分区链成环,结果就是:系统无法引导,构成硬盘逻辑锁

关于 MBR, EBR 的逻辑结构:

MBR&EBR
EBR

默认情况下, Windows 系统一般只划分一个主分区给系统,剩余的部分全部划入扩展分区,也就是这样:

Windows partitions

这里有两点需要注意:

  1. 在 MBR 分区表中最多 4 个主分区或者 3 个主分区+ 1 个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。
  2. 所有扩展分区开始位置的相对地址均从第 1 个扩展分区开始。
  3. 计算扩展分区的绝对地址需从加上 EBR1 的绝对地址(物理扇区号)。
EBR Address

PBR

The partition boot record is the first block of any bootable partition. It is also sometimes referred to as the Volume Boot Record (VBR)

当然,卷与分区还是有区别的,参考 操作系统概念中,分区和卷的区别是什么?

分区引导记录(Partition Boot Record), 又称分区引导扇区(Partition Boot Sector),卷引导扇区(Volume Boot Sector), 卷引导记录(VBR, Volume Boot Record), 它是由 FORMAT 高级格式化命令写在各个分区开始处第一个扇区。

当该分区为活动分区时,其 PBR 又称, DBR(DOS Boot Record,DOS 引导记录), OBR(OS Boot Record,操作系统引导记录)。除此之外,由于 DBR 的内容与操作系统版本,文件系统有关,DBR 也可以被称之为 "Boot Sector 文件系统名",例如:“BOOT Sector FAT32”、“BOOT Sector NTFS”

当然,有时候也会直接将所有分区(无论活动与否)PBR 都叫做 DBR,了解即可。

DBR 用来引导系统寻找激活分区根目录下的 NTLDR(XP)、bootmgr(Win7 above)、grldr(Grub)、btldr.mbr(BootLink)等可用于引导操作系统的程序。每个分区都有引导扇区,但只有被设为活动分区的 PBR 才能在引导过程中获得控制权,加载系统文件到内存。

  • 在对硬盘分区之后,每一个分区均有一个 DBR 与之对应。DBR 位于每个分区的第一个扇区,大小为 512 字节。
  • DBR 内容根据操作系统版本不同,磁盘类型不同而有所变化
  • 是可分区设备的每个分区内的第一个扇区。

它可以有两个作用:

  1. 当其为活动分区的 PBR, 即:DBR 时, 具有加载系统文件,从而引导操作系统的作用。而非活动分区的对应部分的意义是存储 DBR 的备份
  2. 作为任一个主分区的 PBR,它负责管理某个具体的分区,存储着分区的相关信息。

DBR

主引导程序执行完 MBR 中的引导代码后,将系统控制权交给活动分区的引导记录 DBR,用来引导操作系统。

  • 每个分区被赋予一个盘符,即逻辑盘符
  • 每个分区逻辑扇区从“0”开始编号
  • 高级格式化程序将引导记录 DBR 写到“0”扇区,DOS 引导扇区,

DBR Layout

操作系统引导记录 DBR(DOS Boot Record)通常位于硬盘的 1 柱面 0 磁道 1 扇区,其逻辑扇区号为 0,是操作系统可以直接访问的第一个扇区,因此,引导扇区又常常指 DBR。

以 Windows FAT32 DBR 为例分析:

FAT32 DBR

依次包括以下部分:

  1. 跳转指令,让程序执行流程跳转到引导代码(3 个字节)

    开头的跳转指令可以用来区分文件系统:

    1. FAT16 是 EB 3C 90
    2. FAT32 是 E8 58 90
    3. NTFS 是 EB 52 90
  2. 厂商标识和系统版本号(03~0A)(也称为 OEM),8 个字节

    其内容由创建该文件系统的 OEM 厂商具体安排。

  3. 磁盘参数块(0BH-59H 共占用 79 个字节), 即: BPB,BIOS Parameter Block

    BPB 十分重要,由此可算出逻辑地址与物理地址。 BPB

    1. 0BH ~ 0CH:每扇区字节数

      每扇区字节数记录每个逻辑扇区的大小,其常见值为 512 字节,但 512 字节并不是固定值。该值可以由程序定义,合法值包括 512、1024、2048 和 4096 字节。

    2. 0DH:每簇扇区数

      “簇”是 FAT12、FAT16 以及 FAT32 文件系统下数据的最小存储单元,一个“簇”由一组连续的扇区组成。

    3. 0EH ~ 0FH:DBR 保留扇区数

      DBR 保留扇区数是指 DBR 本身占用的扇区以及其后保留扇区的总和,也就是 DBR 到 FAT1 之间扇区总数,或者说是 FAT1 的开始扇区号(逻辑扇区号)。 也称作 FAT 表位置的偏移量,当然这里是相对于该分区的偏移量(没有包括该分区前面的部分)。 示例 保留扇区数 = FAT1 起始扇区 - 引导扇区(DBR)起始扇区 = 622020802-622020798 = 4

    4. 10H:FAT 表个数 FAT 表个数描述了该文件系统有几个 FAT 表,一般在 FAT 文件系统中都有两个 FAT,FAT1 和 FAT2。值默认为 02

    5. 11H ~ 12H:未用

      这个参数在 FAT16 中用来表示 FDT 中最大所能容纳的目录项数(Root Entries),一般为 0x0200=512,FAT32 没有固定的 FDT,所以不用这个参数。

    6. 13H ~ 14H:扇区总数

      这两个字节在 FAT16 中用来表示小于 32MB 的分区的扇区总数,FAT32 的总是大于 32MB,所 以不用这个参数。

    7. 15H:磁介质描述符

      介质描述符是描述磁盘介质的参数,根据磁盘性质的不同,取值不同。如硬盘为 F8

    8. 16H ~ 17H:未用

      这两个字节在 FAT16 中用来表示每个 FAT 表包含的扇区数,FAT32 未用。

    9. 18H ~ 19H:每磁道扇区数

      这是逻辑 C/H/S 中的一个参数,其值一般为 63。

    10. 1AH ~ 1BH:磁头数

    11. 1CH ~ 1FH:隐藏扇区数

      隐藏扇区数是指本分区之前(相对)使用的扇区数,该值与分区表中所描述的该分区的起始扇区号一致。对于主磁盘分区来讲,是 MBR 到该分区 DBR 之间的扇区数;对于扩展分区中的逻辑分区来讲,是其 EBR 到该分区 DBR 之间的扇区数。

      看不懂? 接着看,下面有图。

    12. 20H ~ 23H:扇区总数

      扇区总数是指分区的总扇区数,也就是 FAT32 分区的大小。

    13. 24H ~ 27H:每个 FAT 扇区数

      这四个字节用来记录 FAT32 分区中每个 FAT 表占用的扇区数。

    14. 28H ~ 29H:标志

      这两个字节用于表示 FAT32 是否可用,当其二进制最高位置 1 时,表示只有 FAT1 可用,否则 FAT2 也可用。

    15. 2AH ~ 2BH:版本。通常为 0。

    16. 2CH ~ 2FH:根目录首簇号

      分区在格式化为 FAT32 文件系统时,格式化程序会在数据区中指派一个簇作为 FAT32 的根目录区的开始,并把该簇号记录在 BPB 中。通常是把数据区的第一个簇分配给根目录使用,也就是 2 号簇。值固定为 02

    17. 30H ~ 33H:文件系统信息扇区号。

      FAT32 文件系统在 DBR 的保留扇区中安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号。该扇区一般在分区的 1 号扇区,也就是紧跟在 DBR 后的一个扇区。

    18. 32H:DBR 备份扇区号

      FAT32 文件系统在 DBR 的保留扇区中安排了一个 DBR 的备份,一般在 6 号扇区,也就是分区的第 7 个扇区。该备份扇区与原 DBR 扇区的内容完全一样,如果原 DBR 遭到破坏,可以用备份扇区修复。值默认为 06

    19. 34H ~ 3FH:未用。这 12 个字节保留不用。

    20. 40H:BIOS 驱动器号

      这是 BIOS 的 INT 13H 所描述的设备号码,一般从 80H 开始编号。

    21. 41H:未用。这两个字节不使用,为 0。

    22. 42H:扩展引导标记

      扩展引导标记 用来确认后面的三个参数是否有效,一般值为 29H。

    23. 43H ~ 46H:卷列序号

      卷列序号是格式化程序在创建文件系统时生成的一组 4 字节的随机数值。

    24. 47H ~ 51H:卷标

      卷标是由用户在创建文件系统时指定的一个卷的名称,原来的系统把卷标记录在这个地址处,现在的系统已经不再使用这个地址记录卷标,而是由一个目录项来管理卷标。

    25. 52H ~ 59H:文件系统类型

      BPB 最后一个参数,直接用 ASCⅡ 码记录当前分区的文件系统类型。一般 FAT32 的标识均填写为:46 41 54 33 32 20 20 20

  4. DOS 引导程序(5A~1FD)420 字节

    其中 DOS 引导程序完成 DOS 系统文件(IO.SYS,MSDOS.SYS)的定位与装载 DOS 引导程序

  5. 结束标志 55AA

对于采用 MBR 分区、FAT16 文件管理系统的硬盘而言,其大致结构如下: 下图主要包含主引导记录和一个主分区的结构示例,其他分区的结构类似,不再展开。

20200825171743

关于 FAT 在这里先简单提一下,后面有博文进行详细介绍。

对使用 DOS 分区体系的磁盘进行数据恢复及取证时:

  1. 基于 DOS 分区系统磁盘大都起始于 MBR 扇区。MBR 只占用 1 个扇区,与文件系统分区间有 62 个空闲扇区
  2. 理论上 EBR 只允许有两个分区表项,一个用于描述一个文件系统分区,另一个描述扩展分区。
  3. 主分区表被破坏时,可使用 Winhex 识别各个分区。也可计算主分区各个表项值,直接填入主分区表。
  4. 不是所有系统对分区类型进行强制执行。比如将 FAT32 的类型值改为 Linux 类型值,WinXP 依然可正常加载该分区。
  5. Windows 对类型值为隐藏类型分区严格执行,不进行加载。但可通过 Linux 加载。
  6. 有些版本只支持一个主文件系统分区表项。
  7. 分区表链被破坏时,可以通过“55AA”重新定位分区表链中各个分区表的位置。

参考资料

  1. Partition Boot Record (PBR)
  2. Master boot record
  3. Partition type
  4. Linux 引导扇区(boot sector)的结构
  5. Linux 系统启动流程
  6. 主引导记录
  7. 硬盘分区 FAT32 文件系统 DBR 详解及手工重建
  8. Definition Master Boot Record (MBR)
  9. BIOS 将 MBR 读入 0x7C00 地址处(x86 平台下)