首页 > 代码库 > Windows GPT磁盘GUID结构详解

Windows GPT磁盘GUID结构详解

前一篇 Windows磁盘MBR结构详解 中我们介绍了Basic Disk中的Master Boot Record结构。GPT Disk作为Windows 2003以后引入的分区结构。使用了GUID分区表结构,它与MBR相比好处是支持更大和更多的分区,提高容错。本文介绍了GUID分区表的结构和各个字段的含义。


GPT Disk 的Protective MBR:


GPT Disk的结构中,第一个LBA位置(LBA 0)存放的是Protective MBR,随后LBA1的位置才是GPT的GUID分区表头。Protective MBR的作用是为了兼容性考虑,阻止一些遗留的MBR磁盘工具破坏GUID分区表。这种在LBA 0的位置存放Protective MBR的结构是基于Extensible Firmware Interface(EFI)规格。Protective MBR和MBR拥有同样的结构,同时还包括一条包含值为0xEE的System ID的分区记录(如下图所示),这个值标注了该分区为GPT分区,如果包含该分区的磁盘被移动到Windows 2000中或者被一些遗留的磁盘工具访问,则该分区会被标注晨GPT Protective分区,不能被删除。

技术分享


Globally Unique Identifier Partition Table(GUID)结构:


如下图所示,组成GPT Disk的GUID记录有以下几种:

技术分享

GUID Partition Table Header: GPT Header定义了分区记录所用到的Logical Block Address的区域。同时还定义了分区在磁盘上的位置、它自身的GUID、以及一组CRC32的校验值。Primary GPT Header位于磁盘的LBA1位置,紧跟着Protective MBR。Backup GPT Header位于磁盘最后一个磁道之上。下图是GPT Header中包含几个字段:

技术分享


  • 首位0x00是为长度8个字节的签名档,这个值必须为固定值,用来定义EFI的兼容性。

  • 0x08开始有四组长度为4个字节的字段,Revision标注EFI规格的版本信息、Header Size记录了整个GPT Head的大小,也为固定值、CRC32的校验信息、Reserved预留位。

  • 随后0x18开始是5个长度为8个字节的字段和一个长度为16字节字段,Primary LBA记录了Primary GPT Head的位置、Backup LBA记录Backup GPT Header的位置、First Usable LBA记录了第一个分区的起始位置,例如64位的Windows Server 2003,它的起始位置是34、Last Usable LBA记录的分区结束的位置。Disk GUID长度为16个字节,用来标识分区表头和磁盘、 Partition Entry LBA记录GUID分区记录的位置,固定为LBA2。

  • 从0x50开始为3个长度为4字节的记录,Number of Partition Entries记录最大的磁盘分区数,例如64位的Windows Server是128个、Size of Partition Entry记录了每个GUID分区记录大小,它的值为128字节、Partition Entry Array CRC32记录一组分区记录的校验值。

  • 最后从0x5C位置开始长度为420字节的预留空间,值都为0。


GUID Partition Entry Array:类似MBR中的分区表,GUID partition entry array中包含了磁盘上每个分区的记录。比如64位的Windows Server 2003创建了一个Array值为16384字节,则第一个可用的数据大于等于LBA34. GUID Partition Entry Array也在分区最后存在一个副本,位置是在最后一个可用的LBA之后,GUID Partition table header之前。


GUID Partition Entry: GUID Partition Entry长度为128个字节,用来定义单个分区结构。每个GUID Partition entry从Partition Type记录开始。长度为16个字节的Partition Type GUID,类似MBR磁盘分区表中的System ID,它定义了分区中包含的数据和分区的作用。下图中是一个典型的GPT Disk的GUID Partition entry array记录,这个图中显示了三种分区记录


第一部分{45464920-5041-5254-0000-01005C000000}为EFI System分区、中间部分{16E3C9E3–5C0B–B84D–817D–F92DF00215AE}为Microsoft Reserved分区,最下面的一个{A2A0D0EB–E5B9–3344–87C0–68B6B72699C7}是Windows Basic Disk中的一个主分区。

技术分享

技术分享

在每个部分的中间位置主要记录了一些字段。Partition Type GUID之后的0x10位置开始,是一个长度为16字节的Unique Partition GUID记录用来标识每条记录的唯一性。0x20开始为3个长度为8个字节的字段,Starting LBA和Ending LBA分别记录了分区的起始和结束的位置、Attribute Bit描述了分区是如何使用的,例如是否为隐藏和只读等等、最后0x38开始的72个字节字段用来Unicode的分区的名字,名字最长为36个字符。


本文出自 “刘洪亮的博客” 博客,请务必保留此出处http://liuhongliang.blog.51cto.com/2895201/1916036

Windows GPT磁盘GUID结构详解