详解MBR分区结构以及GPT分区结构

原作地址http://dengqi.blog.51cto.com/5685776/1348951

一、MBR分区结构

   MBR磁盘分区是一种使用最为广泛的分区结构,它也被称为DOS分区结构,但它并不仅仅应用于Windows系统平台,也应用于Linux,基于X86的UNIX等系统平台。它位于磁盘的0号扇区(一扇区等于512字节),是一个重要的扇区(简称MBR扇区)。

MBR扇区由以下四部分组成:

引导代码:引导代码占MBR分区的前440字节,负责整个系统启动。如果引导代码被破坏,系统将无法启动。

Windows磁盘签名:占引导代码后面的4字节,是Windows初始化磁盘写入的磁盘标签,如果此标签被破坏,则系统会提示“初始化磁盘”。

MBR分区表:占Windows磁盘标签后面的64个字节,是整个硬盘的分区表。

MBR结束标志:占MBR扇区最后2个字节,一直为“55 AA”。

wKioL1LKNVbgiJppAAHQQfWcPwQ942.jpg

注意:作者分析磁盘使用的工具是Winhex,如果读者需要请自行下载。


下面详细分析分区表结构

   磁盘在使用前都要进行分区,也就是将硬盘划分为一个个逻辑的区域。每一个分区都有一个确定的起始结束位置。MBR磁盘的分区形式一般有3种,既主分区,扩展分区和非DOS分区。主分区既主DOS分区,扩展分区既扩展的DOS分区(扩展分区可以分逻辑分区),非DOS分区对于主分区的操作系统来说是一块被划分出去的区域,只能非DOS分区中操作系统可以管理。

如下:是MBR分区表

wKiom1LKNgyzkviIAACTxTAiH_Y413.jpg

MBR一共占用64个字节,其中每16个字节为一个分区表项。也就是在MBR扇区中只能记录4个分区信息,可以是4个主分区,或者是3个主分区1个扩展分区。

每个分区项中对应的字节解释如下表:

wKioL1LKNlXCchlUAAFbjpz0d3s644.jpg

wKiom1LKNu_xS0nCAAC7bgZMKmE917.jpg

wKioL1LKN22TWqhvAAERmt888K4487.jpg

wKiom1LKN6LDOsMdAAFADGBiJ4A015.jpg

扩展分区的结构分析

   由于MBR仅仅为分区表保留了64字节的存储空间,而每个分区则占用16字节的空间,也就是只能分4个分区,而4个分区在实际情况下往往是不够用的。因此就有了扩展分区,扩展分区中的每个逻辑分区的分区信息都存在一个类似MBR的扩展引导记录(简称EBR)中,扩展引导记录包括分区表和结束标志“55 AA”,没有引导代码部分。

wKioL1LKN-Kj6j8OAAFhlbN46B4606.jpg

如上图:EBR中分区表的第一项描述第一个逻辑分区,第二项指向下一个逻辑分区的EBR。如果下一个逻辑分区不存在,第二项就不需要了。


   MBR分区的结构大致就介绍到这了。如果硬盘的MBR被破坏,可以复制其他硬盘的MBR到故障盘,然后修复分区表,也可以初始化故障盘然后修复分区表。


二、GPT分区结构

GPT磁盘分区的基本特点

   GPT磁盘分区结构解决了MBR只能分4个主分区的的缺点,理论上说,GPT磁盘分区结构对分区的数量好像是没有限制的。但某些操作系统可能会对此有限制。

GPT磁盘分区结构由6部分组成,如下图:

wKiom1LKQX7zOkrSAABNDHxLhq4451.jpg

1、保护MBR

   保护MBR位于GPT磁盘的第一扇区,也就是0号扇区,有磁盘签名,MBR磁盘分区表和结束标志组成,没有引导代码。而且分区表内只有一个分区表项,这个表项GPT根本不用,只是为了让系统认为这个磁盘是合法的。

wKiom1LKSF7SZd_BAACDsiSCWBo629.jpg

2、GPT头

   GPT头位于GPT磁盘的第二个磁盘,也就是1号扇区,该扇区是在创建GPT磁盘时生成,GPT头会定义分区表的起始位置,分区表的结束位置、每个分区表项的大小、分区表项的个数及分区表的校验和等信息。

wKiom1LKSKbx49XOAAB95x1ZyKM823.jpg

GPT头中参数的含义解释如下表:

wKiom1LKSNWQBhWbAADZkLFMSQQ667.jpg

3、分区表

   分区表位于GPT磁盘的2-33号磁盘,一共占用32个扇区,能够容纳128个分区表项。每个分区表项大小为128字节。因为每个分区表项管理一共分区,所以Windows系统允许GPT磁盘创建128个分区。

   每个分区表项中记录着分区的起始,结束地址,分区类型的GUID,分区的名字,分区属性和分区GUID。

wKioL1LKSSbwft0fAAC7B9dwnXU848.jpg

分区表项中各参数的含义解释如下表:

wKiom1LKSUHTowAAAABrpN_N6iM090.jpg

4、分区区域

   GPT分区区域就是用户使用的分区,也是用户进行数据存储的区域。分区区域的起始地址和结束地址由GPT头定义。

5、GPT头备份

   GPT头有一个备份,放在GPT磁盘的最后一个扇区,但这个GPT头备份并非完全GPT头备份,某些参数有些不一样。复制的时候根据实际情况更改一下即可。

6.分区表备份

   分区区域结束后就是分区表备份,其地址在GPT头备份扇区中有描述。分区表备份是对分区表32个扇区的完整备份。如果分区表被破坏,系统会自动读取分区表备份,也能够保证正常识别分区。


GPT的分区结构相对于MBR要简单许多,并且分区表以及GPT头都有备份。


以下是一个C++程序示例,用于在物理磁盘上保护MBR并在被修改时回滚。 ```cpp #include <iostream> #include <fstream> #include <Windows.h> // MBR结构体定义 #pragma pack(push, 1) struct MBR { // MBR代码 unsigned char code[446]; // 分区 unsigned char partitionTable[64]; // MBR签名 unsigned short signature; }; #pragma pack(pop) int main() { // 打开物理磁盘 HANDLE hDisk = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDisk == INVALID_HANDLE_VALUE) { std::cerr << "无法打开物理磁盘!" << std::endl; return -1; } // 读取原始MBR备份 MBR originalMBR; DWORD bytesRead; if (!ReadFile(hDisk, &originalMBR, sizeof(MBR), &bytesRead, NULL)) { std::cerr << "无法读取原始MBR备份!" << std::endl; CloseHandle(hDisk); return -1; } // 读取当前的MBR MBR currentMBR; if (!ReadFile(hDisk, &currentMBR, sizeof(MBR), &bytesRead, NULL)) { std::cerr << "无法读取当前MBR!" << std::endl; CloseHandle(hDisk); return -1; } // 检查MBR是否被修改 bool modified = false; for (int i = 0; i < sizeof(MBR); i++) { if (currentMBR.code[i] != originalMBR.code[i]) { modified = true; break; } } if (modified) { std::cout << "MBR已被修改,正在回滚..." << std::endl; // 回滚MBR DWORD bytesWritten; if (!WriteFile(hDisk, &originalMBR, sizeof(MBR), &bytesWritten, NULL)) { std::cerr << "无法回滚MBR!" << std::endl; CloseHandle(hDisk); return -1; } // 进行其他回滚操作... std::cout << "MBR回滚完成!" << std::endl; } else { std::cout << "MBR未被修改。" << std::endl; } CloseHandle(hDisk); return 0; } ``` 这个程序使用了Win32 API的`CreateFile`,`ReadFile`和`WriteFile`函数来打开、读取和写入物理磁盘上的MBR。它首先读取原始的MBR备份,然后读取当前的MBR。接下来,它逐个字节比较当前的MBR和原始备份MBR的代码部分,以检查是否有任何不同之处。如果有差异,它会将原始备份的MBR回滚到物理磁盘中。 请注意,这个程序需要管理员权限才能访问物理磁盘。在运行程序之前,请确保以管理员身份运行。 同样地,这只是一个简单示例,实际的MBR保护和回滚程序可能需要更复杂的逻辑和更全面的错误处理。在操作系统层面上进行MBR操作是非常敏感和危险的,因此请谨慎操作,并确保你了解自己在做什么。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值