参考自 详解MBR分区结构以及GPT分区结构 维基百科-全局唯一标识分区表 维基百科-主引导记录
在Linux操作系统上,可以通过hexedit /dev/sdx 查看硬盘上的原始内容。
MBR分区MBR(Master Boot Record,主引导扇区)磁盘分区是一种使用最为广泛的分区结构,它也被称为DOS分区结构,但它并不仅仅应用于Windows系统平台,也应用于Linux,基于X86的UNIX等系统平台。它位于磁盘的0号扇区(一扇区等于512字节),是一个重要的扇区(简称MBR扇区)。
MBR扇区结构:
地址 |
描述 |
长度(字节) |
0 |
代码区 |
440(最大446) |
440 |
选用磁盘标志 |
4 |
444 |
一般为空,0x0000 |
2 |
446 |
标准MBR分区表 |
64 |
510 |
MBR有效标志:0x55AA |
2 |
总大小:446+64+2=512
启动代码主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。
硬盘分区
偏移 |
长度(字节) |
含义 |
00H |
1 |
分区状态:00 非活动分区;80 活动分区 |
01H |
1 |
分区起始磁头号(HEAD),用到全8位 |
02H |
2 |
分区起始扇区号(SECTOR),0-5位;分区起始磁柱号(CYLINDER)6-15位 |
04H |
1 |
文件系统标志位 |
05H |
1 |
分区结束磁头号(HEAD),用到全8位 |
06H |
2 |
分区结束扇区号(SECTOR),0-5位;分区结束磁柱号(CYLINDER)6-15位 |
08H |
4 |
分区起始相对删区号 |
0CH |
4 |
分区总扇区数 |
硬盘分区表占据主引导扇区的64个字节(偏移01BEH—偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息。下面是一个例子: 如果某一分区在硬盘分区表的信息如下
80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00
则我们可以看到,最前面的”80”是一个分区的激活标志,表示系统可引导[1];”01 01 00”表示分区开始的磁头号为1,开始的扇区号为1,开始的柱面号为0;”0B”表示分区的系统类型是FAT32,其他比较常用的有04(FAT16)、07(NTFS);”FE BF FC”表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;”3F 00 00 00”表示首扇区的相对扇区号为63(小端序);”7E 86 BB 00”表示总扇区数为12289662(小端序)。
结束标志字结束标志字55 AA (偏移1FEH-偏移1FFH)最后两个字节,是检验主引导记录是否有效的标志。
主引导扇区的读取流程系统开机或者重启。
- BIOSK开机自检(Power On Self Test — POST)。BIOS执行内存地址为FFFF:0000H处的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件(包括内存)进行检查。
- 读取主引导记录(MBR)。当BIOS检查到硬件正常并与CMOS中的设置相符后,按照CMOS中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存地址为0000:7C00H处。
- 检查0000:01FEH-0000:01FFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示”NO ROM BASIC”然后死机。
- 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处,然后继续执行。
- 根据MBR中的引导代码启动引导程序。
事实上,BIOS不仅检查0000:01FEH-0000:01FFH(MBR的结束标志位)是否等于55AAH,往往还对磁盘是否有写保护、主引导扇区中是否存在活动分区等进行检查。如果发现磁盘有写保护,则显示磁盘写保护出错信息;如果发现磁盘中不存在活动分区,则显示类似如下的信息“Remove disk or other media Press any key to restart”。
GPT分区GPT磁盘分区结构解决了MBR只能分4个主分区的的缺点,理论上说,GPT磁盘分区结构对分区的数量好像是没有限制的。但某些操作系统可能会对此有限制。出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。为了减少分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。

传统MBR(LBA0)在GPT分区表的最开头,出于兼容性考虑仍然存储了一份传统的MBR,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。不能识别GPT硬盘的操作系统通常会识别出一个未知类型的分区,并且拒绝对硬盘进行操作,除非用户特别要求删除这个分区。

分区表头(LBA1)分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。在使用64位Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。(EFI标准要求分区表最小要有16,384字节,即128个分区项的大小)
分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小(位置总是在LBA 1)以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。
起始字节 |
长度 |
内容 |
0 |
8字节 |
签名 (“EFI PART”, 45 46 49 20 50 41 52 54) |
8 |
4字节 |
修订 (在1.0版中, 值是00 00 01 00) |
12 |
4字节 |
分区表头的大小 (单位是字节, 通常是92字节, 即5C 00 00 00) |
16 |
4字节 |
分区表头 (第0 - 91字节) 的CRC32校验, 在计算时, 把这个字段作为0处理, 需要计算出分区序列的CRC32校验后再计算本字段 |
20 |
4字节 |
保留, 必须是0 |
24 |
8字节 |
当前LBA (这个分区表头的位置) |
32 |
8字节 |
备份LBA (另一个分区表头的位置) |
40 |
8字节 |
第一个可用于分区的LBA (主分区表的最后一个LBA + 1) |
48 |
8字节 |
最后一个可用于分区的LBA (备份分区表的第一个LBA - 1) |
56 |
16字节 |
硬盘GUID (在类UNIX系统中也叫UUID) |
72 |
8字节 |
分区表项的起始LBA (在主分区表中是2) |
80 |
4字节 |
分区表项的数量 |
84 |
4字节 |
一个分区表项的大小 (通常是128) |
88 |
4字节 |
分区序列的CRC32校验 |
92 |
* |
保留, 剩余的字节必须是0 (对于512字节LBA的硬盘即是420个字节) |

校验值31 90 c2 bc ,当前LBA1 ,备份LBA0x2E9390AF ,第一个可用于分区的LBA34 ,最后一个可用于分区的LBA0x2E93908E ,分区表起始LBA2 ,分区表数量128 ,分区表项的大小128 。
分区表项(LBA2-33)分区表位于GPT磁盘的2-33号磁盘,一共占用32个扇区,能够容纳128个分区表项。每个分区表项大小为128字节。因为每个分区表项管理一个分区,所以Windows系统允许GPT磁盘创建128个分区。
起始字节 |
长度 |
内容 |
0 |
16字节 |
分区类型GUID |
16 |
16字节 |
分区GUID |
32 |
8字节 |
起始LBA (小端序) |
40 |
8字节 |
末尾LBA |
48 |
8字节 |
属性标签 (如: 60 表示 “只读”) |
56 |
72字节 |
分区名 (可以包括36个UTF-16 (小端序) 字符) |

起始LBA0x800 ,末尾LBA0x2E93908E ,属性0x0
|