zoukankan      html  css  js  c++  java
  • MBR 与 GPT

    MBR 与 GPT

    MBR

    主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区,它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。在深入讨论主引导扇区内部结构的时候,有时也将其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。因此,在使用“主引导记录”(MBR)这个术语的时候,需要根据具体情况判断其到底是指整个主引导扇区,还是主引导扇区的前446字节。

    对于硬盘而言,一个扇区可能的字节数为128×2n(n=0,1,2,3)。大多情况下,取n=2,即一个扇区(sector)的大小为512字节。

    • MBR:主引导记录位置在磁盘的第一个逻辑扇区,上图中的绿色部分,即LBA0的位置。一个逻辑扇区仅有512B(字节) ,MBR引导代码占446B,MBR分区表占64B,最后的结束标志字占2B(即上述以0x55 0xAA结尾的标识符)。因为每个分区只有16B大小的分区表记录,所以寻址最大只能到2.2TB,并且由于分区表总共只占64B,所以MBR分区表最多4个分区。
    • PBR:即Partition Boot Record,对应主引导记录,每个分区都存在引导记录,位置在每个磁盘分区的开始部分,占用扇区不定。这个扇区一般保存着操作系统引导程序的所在位置。上图的红色部分。
    • File System:操作系统对磁盘的所有操作都需要经过文件系统,删除文件指的是在文件系统里删除文件的索引条目,创建文件就是在在文件系统里添加索引条目并将具体数据写入磁盘。常见的文件系统格式有:FAT、ext4、NTFS。文件系统位置一般在PBR之后。上图黄色部分。
    Structure of a classical generic MBR
    Address Description Size
    (bytes)
    Hex Dec
    +000hex +0 Bootstrap code area 446
    +1BEhex +446 Partition entry №1 Partition table
    (for primary partitions)
    16
    +1CEhex +462 Partition entry №2 16
    +1DEhex +478 Partition entry №3 16
    +1EEhex +494 Partition entry №4 16
    +1FEhex +510 55hex Boot signature 2
    +1FFhex +511 AAhex
    Total size: 446 + 4×16 + 2 512

    主引导记录的组成

    启动代码

    主引导记录最开头是第一阶段引导代码。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后将控制权交给硬盘上的引导程序(如GNU GRUB)。它不依赖任何操作系统,而且启动代码也是可以改变的,从而能够实现多系统引导。

    硬盘分区表

    硬盘分区表占据主引导扇区的64个字节(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节。具体每个字节的定义可以参见硬盘分区结构信息。

    硬盘分区结构信息
    偏移 长度(字节) 意义
    00H 1 分区状态:00-->非活动分区;80-->活动分区;
    其它数值没有意义
    01H 1 分区起始磁头号(HEAD),用到全部8位
    02H 2 分区起始扇区号(SECTOR),占据02H的位0-5;
    该分区的起始磁柱号(CYLINDER),占据
    02H的位6-7和03H的全部8位
    04H 1 文件系统标志位
    05H 1 分区结束磁头号(HEAD),用到全部8位
    06H 2 分区结束扇区号(SECTOR),占据06H的位0-5;
    该分区的结束磁柱号(CYLINDER),占据
    06H的位6-7和07H的全部8位
    08H 4 分区起始相对扇区号
    0CH 4 分区总的扇区数

    对于大于8.4G的现代硬盘,CHS已经无法表示, BIOS使用LBA模式,对于超出的部分,CHS值通常设为0xFEFFFF,并加以忽略,直接使用Offset 0x08-0x0c的4字节相对值,再进行内部转换。

    由于块地址和大小使用32位存储在MBR的分区表中,因此,使用具有512字节扇区(实际或仿真)的驱动器的分区的最大大小和最高起始地址不能超过2 TiB(232 * 512B)。

    可是有时4个分区是不够用的,于是便有了主分区,拓展分区,逻辑分区的概念以支持更多分区的创建。
    有关这部分知识可以参考这里。于是便有下图。

    拓展分区

    结束标志字

    结束标志字55,AA(偏移1FEH-偏移1FFH)最后两个字节,是检验主引导记录是否有效的标志。

    GPT

    全局唯一标识分区表GUID Partition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(UEFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一32bits来存储逻辑块地址和大小信息的主引导记录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于2.2TB(2.2×1012字节)的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到这个局限性,并且将他们的容量较大的磁盘升级到4KB的扇区,这意味着MBR的有效容量上限提升到16 TiB。 这个看似“正确的”解决方案,在临时地降低人们对改进磁盘分配表的需求的同时,也给市场带来关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在264-1个扇区成为可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4×1021字节)或8 ZiB个512字节。

    GPT

    特点

    在MBR硬盘中,分区信息直接存储于主引导记录(MBR)中(主引导记录中还存储着系统的引导程序)。但在GPT硬盘中,分区表的位置信息储存在GPT头中。但出于兼容性考虑,硬盘的第一个扇区仍然用作MBR,之后才是GPT头。

    跟现代的MBR一样,GPT也使用逻辑区块地址(LBA)取代了早期的CHS寻址方式。传统MBR信息存储于LBA 0,GPT头存储于LBA 1,接下来才是分区表本身。64位Windows操作系统使用16,384字节(或32扇区)作为GPT分区表,接下来的LBA 34是硬盘上第一个分区的开始。

    为了减少分区表损坏的风险,GPT在硬盘最后保存了一份分区表的副本。

    Protective MBR (LBA 0)

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

    在使用MBR/GPT混合分区表的硬盘中,这部分存储了GPT分区表的一部分分区(通常是前四个分区),可以使不支持从GPT启动的操作系统从这个MBR启动,启动后只能操作MBR分区表中的分区。如Boot Camp就是使用这种方式启动Windows。

    分区表头(LBA 1

    分区表头定义了硬盘的可用空间以及组成分区表的项的大小和数量。在使用64位Windows Server 2003的机器上,最多可以创建128个分区,即分区表中保留了128个项,其中每个都是128字节。(EFI标准要求分区表最小要有16,384字节,即128个分区项的大小)

    分区表头还记录了这块硬盘的GUID,记录了分区表头本身的位置和大小(位置总是在LBA 1)以及备份分区表头和分区表的位置和大小(在硬盘的最后)。它还储存着它本身和分区表的CRC32校验。固件、引导程序和操作系统在启动时可以根据这个校验值来判断分区表是否出错,如果出错了,可以使用软件从硬盘最后的备份GPT中恢复整个分区表,如果备份GPT也校验错误,硬盘将不可使用。所以GPT硬盘的分区表不可以直接使用16进制编辑器修改。

    分区表头的格式
    起始字节 长度 内容
    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个字节)

    主分区表和备份分区表的头分别位于硬盘的第二个扇区(LBA 1)以及硬盘的最后一个扇区。备份分区表头中的信息是关于备份分区表的。

    分区表项(LBA 2–33

    GPT分区表使用简单而直接的方式表示分区。一个分区表项的前16字节是分区类型GUID。例如,EFI系统分区的GUID类型是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B}。接下来的16字节是该分区唯一的GUID(这个GUID指的是该分区本身,而之前的GUID指的是该分区的类型)。再接下来是分区起始和末尾的64位LBA编号,以及分区的名字和属性。

    GPT分区表项的格式
    起始字节 长度 内容
    0 16字节 分区类型GUID
    16 16字节 分区GUID
    32 8字节 起始LBA(小端序)
    40 8字节 末尾LBA
    48 8字节 属性标签(如:60表示“只读”)
    56 72字节 分区名(可以包括36个UTF-16(小端序)字符)

    参考文献

    1. MBR与GPT
    2. 主引导记录 - Wiki
    3. Master boot record - Wiki
    4. 全局唯一标识分区表 - Wiki
    5. GUID Partition Table
    6. Partition type
    7. 从系统盘符选错到认识硬盘的各种分区
  • 相关阅读:
    XML Schema的基本语法(转)
    Lambda 表达式参考
    LINQ查询表达式示例
    Jackson ObjectMapper类使用解析
    hdu 1242 c++ 广搜
    poj 1111 新手路过
    poj 1664 放苹果
    poj 3126 简单广搜题
    poj 1256 全排列
    HDU 2544 最短路
  • 原文地址:https://www.cnblogs.com/zerxoi/p/13228039.html
Copyright © 2011-2022 走看看