MBR GPT

1.MBR

1.1 MBR的组成

一个扇区的硬盘主引导记录MBR由4个部分组成。

主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。

WechatIMG5207.jpeg
typedef struct {
    char    bootinst[446];   /* space to hold actual boot code */
    PHMBRTABLE partitions[4];
    unsigned short  signature;/* set to 0xAA55 to indicate PC MBR format */
} mbr_head;
master_boot_record
master_boot_record

1.2 MBR中的分区信息结构

占用512个字节的MBR中,偏移地址01BEH--01FDH的64个字节,为4个分区项内容(分区信息表)。它是由磁盘介质类型及用户在使用 FDISK定义分区时确定的。在实际应用中,FDISK对一个磁盘划分的主分区可少于4个,但最多不超过4个。每个分区表的项目是16个字节,其内容含义如下表所示。

|存储字节位 |内容及含义 |
|---------|
|第1字节 |引导标志。若值为80H表示活动分区,若值为00H表示非活动分区。第2、3、4字节 本分区的起始磁头号、扇区号、柱面号。其中:磁头号——第2字节;扇区号——第3字节的低6位;柱面号——为第3字节高2位+第4字节8位。|
|第5字节 |分区类型符。00H——表示该分区未用(即没有指定);06H——FAT16基本分区;0BH——FAT32基本分区;05H——扩展分区;07H——NTFS分区;0FH——(LBA模式)扩展分区(83H为Linux分区等)。|
|第6、7、8字节| 本分区的结束磁头号、扇区号、柱面号。其中:磁头号——第6字节;扇区号——第7字节的低6位;柱面号——第7字节的高2位+第8字节。|
|第9、10、11、12字节| 本分区第一个扇区。|
|第13、14、15、16字节| 本分区的总扇区数。|

typedef struct {
    unsigned char  bootid;         /* bootable?  0=no, 128=yes  */
    unsigned char beghead ;    /* beginning head number */
    unsigned short begsect : 6;    /* beginning sector number */
    unsigned short begcyl  : 10;   /* 10 bit nmbr */
    unsigned char  systid;         /* Operating System type indicator code */
    unsigned char endhead ;    /* ending head number */
    unsigned short endsect : 6;    /* ending sector number */
    unsigned short endcyl  : 10;   /* also a 10 bit nmbr */
    unsigned int relsect;          /* first sector relative to start of disk */
    unsigned int numsect;          /* number of sectors in partition */
} mbr_table;
fdisk_partition_partitions
fdisk_partition_partitions

1.3 MBR的限制

MBR 分区系统是一个数据结构补丁的大杂烩,用于克服早期的限制。MBR 自身完全驻留在一个硬盘的第一个扇区(512 字节)上。MBR 的前 400 个字节专门用于存储代码:boot loader(引导装载程序)。计算机引导时,BIOS 读取并执行这段代码。

在这个代码区域之后,MBR 存储数据在 4 个分区上,这些分区称为主分区。每个分区采用两种方法描述:“柱面/磁头/扇区(CHS)” 标记法和 “逻辑块(LBA)” 标记法。今天,CHS标记法几乎成为了老古董,因为它是一个 24 位的数字。这意味着它只限于描述 8GB 磁盘区域。32 位的 LBA 值支持 2TB大小。但是这个 2TB 上限不太容易突破,因为在 MBR 中没有留下任何未分配的字段,可以用于向 LBA 地址添加更多位

除了这个 2TB 问题之外,MBR 还有其他困难。主要困难是 4 个主分区的限制。要克服这个限制,可能的方法是将一个主分区放到一边,作为一个占位符(称为扩展分区),用于容纳任意数量的附加分区(称为逻辑分区)。然而,这是一种笨拙的权宜之计,会导致一些问题。比如,安装多个操作系统时,如果过多的操作系统要求自身拥有过多的主分区,就会出现困难。

MBR 还有数据完整性问题。它是一个单一数据结构,容易受到误操作和磁盘故障的损坏。另外,由于逻辑分区以一种链接表结构定义,如果一个逻辑分区损坏,就会阻止对剩余的逻辑分区的访问。这些数据结构都没有任何形式的错误探测功能,因此,损坏很难定位。


2.GPT

2.1 GPT的组成

GPT结构
GPT结构
GPT结构数据
GPT结构数据

2.2 保护MBR

保护MBR包含一个DOS分区表(LBA0),只包含一个类型值为0xEE的分区项,在小于2TB的磁盘上,大小为整个磁盘;在更大的磁盘上,它的大小固定为2TB。它的作用是阻止不能识别GPT分区的磁盘工具试图对其进行格式化等操作,所以该扇区被称为“保护MBR”。实上,
上,EFI根本不使用这个分区表。

保护MBR
保护MBR

2.3 EFI部分

EFI部分又可以分为4个区域:EFI信息区(GPT头)、分区表、GPT分区、备份区域。

1. EFI信息区(GPT头)

起始于磁盘的LBA1,通常也只占用这个单一扇区。其作用是定义分区表的位置和大小。GPT头还包含头和分区表的校验和,这样就可以及时发现错误。

2. 分区表

分区表区域包含分区表项。这个区域由GPT头定义,一般占用磁盘LBA2~LBA33扇区。分区表中的每个分区项由起始地址、结束地址、类型值、名字、属性标志、GUID值组成。分区表建立后,128位的GUID对系统来说是唯一的。

3. GPT分区

最大的区域,由分配给分区的扇区组成。这个区域的起始和结束地址由GPT头定义。

4. 备份区

备份区域位于磁盘的尾部,包含GPT头和分区表的备份。它占用GPT结束扇区和EFI结束扇区之间的33个扇区。其中最后一个扇区用来备份1号扇区的EFI信息,其余的32个扇区用来备份LBA2~LBA33扇区的分区表。

2.4 EFI信息区数据结构

相对字节偏移量(十六进制) 字节数 说明[整数皆以little endian方式表示]
00~07 8 GPT头签名“45 46 49 20 50 41 52 54”(ASCII码为“EFI PART”)
08~0B 4 版本号,目前是1.0版,其值是“00 00 01 00”
0C~0F 4 GPT头的大小(字节数),通常为“5C 00 00 00”(0x5C),也就是92字节。
10~13 4 GPT头CRC校验和(计算时把这个字段本身看做零值)
14~17 4 保留,必须为“00 00 00 00”
18~1F 8 EFI信息区(GPT头)的起始扇区号,通常为“01 00 00 00 00 00 00 00”,也就是LBA1。
20~27 8 EFI信息区(GPT头)备份位置的扇区号,也就是EFI区域结束扇区号。通常是整个磁盘最末一个扇区。
28~2F 8 GPT分区区域的起始扇区号,通常为“22 00 00 00 00 00 00 00”(0x22),也即是LBA34。
30~37 8 GPT分区区域的结束扇区号,通常是倒数第34扇区。
38~47 16 磁盘GUID(全球唯一标识符,与UUID是同义词)
48~4F 8 分区表起始扇区号,通常为“02 00 00 00 00 00 00 00”(0x02),也就是LBA2。
50~53 4 分区表总项数,通常限定为“80 00 00 00”(0x80),也就是128个。
54~57 4 每个分区表项占用字节数,通常限定为“80 00 00 00”(0x80),也就是128字节。
58~5B 4 分区表CRC校验和
5C~* * 保留,通常是全零填充
    typedef struct {
    BYTE   SIGNATURE[8];
    DWORD  Revision;
    DWORD  Headersize;
    DWORD  CRC32OfHeader;
    DWORD  Reserved;
    UINT64 CurrentLBA;
    UINT64 BackupLBA; //location of the other head copy
    UINT64 FirstUsableLBA; //primary partition table last LBA+1
    UINT64 LastUsableLBA; //secondary parition table first LBA-1
    BYTE DiskGUID[16];
    UINT64 PartitionEntries;
    DWORD  NumOfPartitions;
    DWORD  SizeOfPartitionEntry;
    DWORD  CRC32ofPartitionArray;
    BYTE reserved[420];
} gpt_head_table;
gptheader
gptheader

2.5 分区表

分区项结构

|相对字节偏移量(十六进制) |字节数 |说明[整数皆以little endian方式表示]|
|------------------------|
|00~0F |16 |用GUID表示的分区类型|
|10~1F |16 |用GUID表示的分区唯一标示符|
|20~27 |8 |该分区的起始扇区,用LBA值表示。|
|28~2F |8 |该分区的结束扇区(包含),用LBA值表示,通常是奇数。|
|30~37 |8 |该分区的属性标志|
|38~7F |72 |UTF-16LE编码的人类可读的分区名称,最大32个字符。|

typedef struct {
    BYTE PartitionTypeGUID[16];
    BYTE PartitionGUID[16];
    UINT64 PartitionStartLBA;
    UINT64 PartitionEndLBA;
    UINT64 PartitionProperty;
    wchar_t PartitionName[36]; //Unicode
} gpt_paptition_table;

分区类型

|相关操作系统 |GUID[little endian] |含义|
|------------|
|None |00000000-0000-0000-0000-000000000000 |未使用|
|None |024DEE41-33E7-11D3-9D69-0008C781F39F |MBR分区表|
|None |C12A7328-F81F-11D2-BA4B-00A0C93EC93B |EFI系统分区[EFI System partition (ESP)]|
|None |21686148-6449-6E6F-744E-656564454649 |BIOS引导分区,其对应的ASCII字符串是"Hah!IdontNeedEFI"。|
|None |D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 |Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)|
|Windows |E3C9E316-0B5C-4DB8-817D-F92DF00215AE |微软保留分区|
|Windows |EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 |基本数据分区|
|Windows |DE94BBA4-06D1-4D40-A16A-BFD50179D6AC |Windows恢复环境|
|Linux |0FC63DAF-8483-4772-8E79-3D69D8477DE4 |数据分区。Linux曾经使用和Windows基本数据分区相同的GUID。这个新的GUID是由 GPT fdisk 和 GNU Parted 开发者根据Linux传统的"8300"分区代码发明的。|
|Linux |44479540-F297-41B2-9AF7-D131D5F0458A |x86根分区 (/) 这是systemd的发明,可用于无fstab时的自动挂载|
|Linux |4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 |x86-64根分区 (/) 这是systemd的发明,可用于无fstab时的自动挂载|
|Linux |3B8F8425-20E0-4F3B-907F-1A25A76F98E8 |Server Data (/srv) 这是systemd的发明,可用于无fstab时的自动挂载|
|Linux |933AC7E1-2EB4-4F13-B844-0E14E2AEF915 |HOME分区 (/home) 这是systemd的发明,可用于无fstab时的自动挂载|
|Linux |0657FD6D-A4AB-43C4-84E5-0933C84B4F4F |交换分区(swap) 不是systemd的发明,但同样可用于无fstab时的自动挂载|
|Linux |A19D880F-05FC-4D3B-A006-743F0F84911E |RAID分区|
|Linux |E6D6D379-F507-44C2-A23C-238F2A3DF928 |逻辑卷管理器(LVM)分区|
|Linux |8DA63339-0007-60C0-C436-083AC8230908 |保留|

Microsoft还进一步对分区的属性进行了细分:低位4字节表示与分区类型无关的属性,高位4字节表示与分区类型有关的属性。Microsoft目前使用了下列属性:

|Bit |解释|
|-----|
|0 |系统分区(磁盘分区工具必须将此分区保持原样,不得做任何修改)|
|1 |EFI隐藏分区(EFI不可见分区)|
|2 |传统的BIOS的可引导分区标志|
|60 |只读|
|62 |隐藏|
|63 |不自动挂载,也就是不自动分配盘符|

分区属性
分区属性

2.6 备份分区表,备份GPT头

备份区
备份区

备份分区表和分区头在硬盘数据的末尾,里面的数据和结构跟分区表和分区头内一样。是头部的一个备份。

2.7 GPT优势

GPT的最大好处当然是它消除了 2TB 这个障碍。但是,即使您不必处理 2TB 的磁盘,您也可能会考虑采用 GPT。CRC 和备份数据结构是在低于 2TB 的磁盘上转换到 GPT 的最重要的好处,尽管这一点存在争议。主分区和逻辑分区的区别丧失也可能对一些用户很重要。遗憾的是,许多需要主分区的操作系统都不能从 GPT 磁盘引导。


工具

010 editor

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

  • 申明:本文只是在阅读国内文章基础上整理而来,并不深入,也不专业,请务必带着怀疑态度来阅读本文,并希望得到您的建议和...
    笑笑爸比阅读 5,235评论 2 6
  • 分区表 一个磁盘抛开物理组成部分的话,就是一个地址序列,这个序列从0~n-1,每个地址包含512B(字节)的控件。...
    CoderKo1o阅读 1,862评论 0 2
  • 转载声明:本文虽然不是本人100%原创,但也是辛辛苦苦整理的,可以转载,但请注明出处 这篇文章是关于折腾Windo...
    SOMCENT阅读 8,016评论 3 37
  • 原文 https://zhuanlan.zhihu.com/p/26098509 对很多PC的使用者来说,UEFI...
    ditt0阅读 1,087评论 0 2
  • 由于简书没有目录 想看目录的直接打开CSDN的同名文章 目录: [TOC] 磁盘分区格式介绍 一般来说,磁盘分区表...
    李庆雪阅读 27,857评论 9 61