1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MBR EBR与DBR详解

MBR EBR与DBR详解

时间:2019-11-20 12:42:50

相关推荐

MBR EBR与DBR详解

demo:/Hilaver/NtfsResolution/

先看一张硬盘图片(一个盘面):

MBR

主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码。它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生的。 --摘自百度百科

MBR扇区位于物理硬盘的0柱面,0磁头,1扇区,也就是整个硬盘的第一个扇区(偏移量为0),共占512个字节(即一个扇区),每个物理硬盘只有一个MBR扇区。

MBR扇区由三部分构成:第一部分是446字节的引导代码,也就是上面提到的MBR;第二部分是DPT(Disk Partition Table,硬盘分区表),包含4个表项,每个表项16字节,共占用64字节;第三部分是2个字节的结束标志,0x55AA。其结构如下图:

DBR

分区引导扇区也称DBR(DOS BOOT RECORD),是由FORMAT高级格式化命令写到该扇区的内容,DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区才会被MBR装的DBR入内存运行。 --摘自百度百科

在对硬盘分区之后,每一个分区均有一个DBR与之对应。DBR位于每个分区的第一个扇区,大小为512字节

DBR的结构与分区格式有关,NTFS与FAT32的DBR格式是不同的。

EBR

EBR(Extended Boot Record)是与MBR相对应的一个概念。前边已经讲过,MBR里有一个DPT(Disk Partition Table,磁盘分区表)的区域,它一共是64字节,按每16个字节作为一个分区表项,它最多只能容纳4个分区。能够在MBR的DPT里进行说明的分区称为主分区。如果我们想分区多于4个的时候,MBR的DPT里就会容纳不下来,于是微软就想出了另一个解决方案,在MBR里,只放不多于三个主分区,剩下的分区,则由与MBR结构很相像的另一种分区结构(EBR,也就是扩展分区引导记录)进行说明。一个EBR不够用时,可以增加另一个EBR,如此像一根链条一样地接下去,直到够用为止。 --又摘自百度百科

实际上,EBR中有用的部分仅为其DPT的前两个表项,第一个表项记录了扩展分区中该EBR对应的逻辑分区(逻辑驱动器)的偏移地址和扇区个数,第二个表项记录了下一个逻辑分区的必要信息,本质上是一个链表的结点。

实例分析

下面给出我的一个Windows7虚拟机的分区结构图(所有的分区文件系统格式均为NTFS):

在Winhex下读取到的硬盘信息如下:

其中MBR、DBR和EBR的位置如下图:

从上图可以看到,整个物理硬盘被分成了6个分区,其中C、E和F是主分区,G、H和I是逻辑分区。写代码获得各个分区的信息如下:

MBR扇区数据分析

读取MBR如下(在硬盘偏移量为0处读取512个字节),找到其中64个字节的DPT数据:

提取出来如下:

80 20 21 0007 FE FF FF 00 08 00 0000 F0 3F 06

00 FE FF FF07 FE FF FF 00 F8 3F 0600 F8 7F 02

00 FE FF FF07 FE FF FF 00 F0 BF 0800 00 40 02

00 FE FF FF0F FE FF FF 00 F0 FF 0A00 08 40 00

上面四个表项分别指向分区C、E、F和G。

刚刚已经提到,DPT中最多包含4个表项,每个表项16字节,每个表项的结构如下:

//DPT表项typedefstruct_PartTableEntry {BYTE bootSignature;//引导标志BYTE startHead;//CHS寻址方式,起始磁头BYTE startSector;//起始扇区,本字节低六位BYTE startCylinder;//起始磁道(柱面),startSector高二位和本字节BYTE systemSignature;//文件系统类型标志BYTE endHead;//终止磁头BYTE endSector;//终止扇区BYTE endCylinder;//终止磁道unsignedint startSectorNo;//LBA寻址,起始扇区号unsignedint totalSectorsNum;//该分区扇区总数}PartTableEntry,*pPartTableEntry;

先看第一个表项:

80 20 21 0007 FE FF FF 00 08 00 0000 F0 3F 06

第一个字节为引导标志,0x80表示活动分区,0x00表示非活动分区。接下来三个字节用来表示CHS寻址方式的起始地址,具体含义已经在上面结构体中给出。接下来一个字节表示分区文件系统的类型,0x07表示NTFS(参考最后的附表)。接下来的三个字节表示CHS寻址方式的终止地址(0xFEFFFF表示该字段无效,因为3个字节最大的寻址能力为2^(3*8)个扇区,即8GB。当分区大小超过8GB时该字段无效)。再后面的四个字节表示LBA(Logical Block Address)寻址方式的起始扇区(可以计算出最大支持2TB的硬盘),要注意小端字节序(数据存储时低字节在前),也就是说C盘的起始扇区为00 00 08 00。最后四个字节表示该分区的扇区数量,同样是小端模式,即C盘共0x063FF000个扇区。

接下来让我们跳转到C盘的起始扇区(00 00 08 00),读取该处512字节的数据如下:

你会看到熟悉的结束标志0x55AA,实际上这是C盘的DBR扇区。DBR扇区各个字段的含义在后面展开。

EBR扇区分析

MBR扇区的硬盘分区表的第二和第三个表项与第一个类似,这里不再展开,我们主要来看一下第四个表项:

00 FE FF FF0F FE FF FF 00 F0 FF 0A00 08 40 00

第一个字节表示非活动分区,CHS寻址无效,第五个字节分区类型为0x0F,表示扩展分区。LBA寻址的起始扇区为0x0AFFF000,包含扇区个数为0x00400800。跳转到该扩展分区的起始扇区0x0AFFF000处读取512字节数据:

最后两个字节是结束标志0x55AA,这512字节实际上是一个EBR扇区,其结构与MBR扇区相同,但有用的部分仅为DPT的前两个表项,数据如下:

00 FE FF FF07 FE FF FF 00 08 00 0000 90 21 00

00 FE FF FF05 FE FF FF 00 98 21 0000 70 1E 00

第一个表项表示本该EBR对应的逻辑分区G的起始地址和扇区数量,其中LBA寻址的起始扇区为00 00 08 00,但是该地址为相对偏移,实际的起始扇区为本扇区的实际地址加上相对偏移量,即0x0AFFF000 + 0x00000800 = 0x0AFFF800。读取0x0AFFF800扇区的数据如下:

这个扇区实际上是逻辑分区G的DBR扇区,记录了G盘的基本信息。

第二个表项记录了下一个逻辑分区 H 的EBR扇区的起始地址和扇区总数量。其中,EBR扇区的起始地址为00 21 98 00,同样是一个相对地址,实际扇区为0x0AFFF000 + 0x00219800 = 0x0B218800,读取0x0B218800扇区的数据如下:

这512字节是逻辑分区H的EBR扇区,同样提取DPT的前两个表项:

00 FE FF FF07 FE FF FF 00 08 00 0000 B8 0B 00

00 FE FF FF05 FE FF FF 00 58 2D 0000 B0 12 00

与上一个EBR扇区类似,第一个表项的LBA寻址的起始扇区(00 00 08 00)仍是一个相对偏移,指向该EBR所对应的逻辑分区的起始地址,其实际扇区为:0x0B218800 + 0x00000800 = 0x0B219000,实际字节偏移为0x0B219000 *512字节每扇区 = 0x1643200000,从该字节处读取512字节数据可以得到分区H的DBR扇区,这里就不再截图。第二个表项的LBA寻址起始扇区(00 2D 58 00)同样是一个相对偏移,指向下一个逻辑分区(I:)的EBR扇区,其实际扇区为MBR扇区DPT第四个表项的起始扇区加上该相对偏移,即0x0AFFF000 + 0x002D5800 = 0x0B2D4800。该扇区的数据为:

在该EBR扇区中,DPT的第一个表项仍使用相对偏移指出本逻辑分区(I:)的起始扇区,这个扇区就是分区I:的DBR扇区。第二个表项全0,表示该逻辑分区即是最后一个逻辑分区。

总结一下,在Windows系统下如果采用MBR的引导方式,当分区个数大于等于4的时候,一般情况下系统会将前三个分区设为主分区,第四个作为扩展分区(扩展分区中包含若干个逻辑分区)。MBR扇区的DPT中前三个表项可以直接定位前三个主分区的DBR扇区,第四个表项指向第一个逻辑分区的EBR扇区,根据EBR中的DPT前两个表项分别可以定位本逻辑分区的DBR扇区和下一个逻辑分区的EBR扇区,由此逻辑分区链接成一条链进行管理。

DBR扇区分析

下面给出NTFS和FAT32的DBR扇区格式,注意一点:NTFS下的备份DBR在分区的最后一个扇区,FAT32下的备份DBR一般在第六个扇区。

//NTFS DBR扇区typedefstruct_NTFSDBR {BYTE JMP[3]; //跳转指令BYTE FsID[8]; //文件系统IDunsignedshortint bytePerSector; //每扇区字节数BYTE secPerCluster; //每簇扇区数BYTE reservedBytes[2]; //2个保留字节BYTE zeroBytes[3]; //三个0字节BYTE unusedBytes1[2]; //2个未用字节BYTE mediaType;//媒体类型BYTE unusedBytes2[2]; //2个未用字节unsignedshortint secPerTrack; //每磁道扇区数unsignedshortint Heads; //磁头数unsignedint hideSectors; //隐藏扇区数BYTE unusedBytes3[4]; //4个未用字节BYTE usedBytes[4]; //4个固定字节unsigned__int64 totalSectors; //总扇区数unsigned__int64 MFT; //MFT文件起始簇号unsigned__int64 MFTMirror; //MFTMirror文件起始簇号char fileRecord; //文件记录BYTE unusedBytes4[3]; //3个未用字节char indexSize; //索引缓冲区大小BYTE unusedBytes5[3]; //未用字节BYTEvolumeSerialID64[8]; //卷序列号unsignedint checkSum; //校验和BYTE bootCode[426]; //引导代码BYTE endSignature[2]; //结束标志}NTFSDBR,*pNTFSDBR;

typedefstruct_FAT32_Sector{unsignedint Sectors_per_FAT_FAT32; //FAT32每个FAT表占用扇区数unsignedshortint Extend_Flag; //0-3位表示活动FAT数,7位:0表示在运行时FAT映射到所有FAT 1表示只有一个FAT是活动的,其他位保留unsignedshortint FS_Version; //文件系统版本,高字节表示主要修订号,低直接表示次要修订号unsignedint Root_Cluster_Number;//根目录簇号,一般取值为2unsignedshortint FS_Info_Sector; //文件系统扇区号,一般取1unsignedshortint Backup_Sector; //备份引导扇区,一般取值为6BYTE Reserved_Sector[12]; //保留扇区 }FAT32_Sector, *pFAT32_Sector;typedefstruct_Basic_BPB{unsignedshortint Bytes_per_Sector; //每个扇区字节数,可取512,1024,2048,4096,通常取512BYTESectors_per_Cluster; //每簇扇区数,可取1,2,4,8,16,32,64,128,FAT32最多跟踪268,435,445个簇unsignedshortint Reserved_Sector; //保留扇区,表示第一个FAT前的扇区数,通常取32BYTEFATs;//FAT表个数,通常取2unsignedshortint RootEntry; //根目录项数,对FAT32,取值必为0unsignedshortint SmallSector; //小扇区数,对FAT32,取值必为0BYTEMedia; //存储介质描述,F8表示硬盘,F0表示3.5软盘unsignedshortint Sector_per_FAT_FAT16; //针对FAT12/16的每个FAT扇区数,对FAT32,取值为0unsignedshortint Sector_per_Track; //每道扇区数,描述磁盘物理结构unsignedshortint Heads; //磁头数unsignedintHidden_Sector;//该块硬盘前用于存放引导代码及分区表的扇区数unsignedintLarge_Sector;//总扇区数,若SmallSector为0,此处表示分区上扇区总数//可用扇区数 = 总扇区数-保留扇区-FAT表占用扇区_FAT32_SectorFat32_Sector; //FAT32文件系统扇区信息}Basic_BPB, *pBasic_BPB;typedef struct_FAT32_Extend_BPB{BYTE Physical_Drive; //物理驱动器号,0x80表示物理硬盘,0x00表示软盘驱动器BYTE Reserved; //保留BYTE Extend_Singure; //0x28或0x29以供Windows NT识别unsignedint Vol_Serial; //卷序列号,由格式化时随机获得BYTE Vol_Label[11]; //卷标示BYTE System_ID[8]; //系统ID,根据格式化的格式为FAT32,FAT16等}FAT32_Extend_BPB, *pFAT32_Extend_BPB;//FAT32 DBR扇区typedefstruct_FAT32_DBR{BYTEJumpInstrction[3]; //0x00,跳转指令,通常为EB5890,其中58指示了,跳转位置,在X86中,58+2就代表跳转到5A处BYTEOEMID[8]; //0x03,厂商标示和OS版本信息_Basic_BPB BPB; //0x0B_FAT32_Extend_BPB Extend_BPB; //0x40BYTE Boot_Strap[420]; //文件系统引导代码//0x5A,引导区代码BYTE endSignature[2]; //0x01FE,结束标示}FAT32_DBR, *pFAT32_DBR;

下面是一个FAT32分区的DBR扇区数据,具体含义在上述结构体中已做声明,这里就不再展开:

下面是一张以前的FAT32分区DBR扇区的数据,部分字段含义做了解释:

附-磁盘分区类型标志表:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。