每块硬盘在使用前都要先进行分区,也就是将硬盘划分为一个个的逻辑区域。每一个分区都有一个确定的起止位置。在起止位置之间的那些连续的扇区都归该分区所有,不同分区的起止位置互不交错。
MBR磁盘的分区形式一般有3种,即主分区、扩展分区和非DOS分区。主分区又称为主DOS分区(Primary DOS Partition),目前也称为主磁盘分区。扩展分区又称为扩展DOS分区(Extended DOS Partition)。非DOS分区(Non-DOS Partition)是一种特殊的分区形式,它是将硬盘中的一块区域单独划分出来供另一个操作系统使用的,如Linux和UNIX等。对主分区的操作系统来讲,非DOS分区是一块被划分出去的存储空间。只有非DOS分区内的操作系统才能管理和使用这块存储区域,非DOS分区之外的系统一般不能对该分区内的数据进行访问。
首先来分析分区表部分。
为了便于用户对磁盘的管理,操作系统引入磁盘分区的概念,即将一块磁盘逻辑划分为几个区域。在分区表的64字节中,以16字节为一个分区表项来描述一个分区的结构。
一块硬盘最多可以有4个主磁盘分区,被激活的主磁盘分区称为主分区,主分区在一块硬盘中只能有一个。
图4-16所示的硬盘有两个主磁盘分区。
用WinHex打开该硬盘,其MBR及分区表信息如图4-17所示。
每个分区表项中相对应的各个字节的含义都是一样的。下面以第一个主磁盘分区的分区表项为例,说明其各字节的含义,这部分的具体含义见表4-1。
表4-1 分区表项的含义
字节偏移 | 字段长度 | 值 | 字段名和定义 |
---|---|---|---|
0x01BE | 1字节 | 0x80 | 引导标志(Boot Indicator):指明该分区是否是活动分区 |
0x01BF | 1字节 | 0x01 | 开始磁头(Start Head) |
0x01C0 | 6位 | 0x01 | 起始扇区(Start Sector):只用了0~5位,后面的两位(第6位和第7位)被开始柱面字段所使用 |
0x01C1 | 10位 | 0x00 | 起始柱面(Start Cylinder):共占用10位,最大值为1023 |
0x01C2 | 1字节 | 0x07 | 分区的类型描述(Partition type indicator):定义了分区的类型,详细定义,请参见表4-2 |
0x01C3 | 1字节 | 0xFE | 结束磁头(End Head) |
0x01C4 | 6位 | 0xFF | 结束扇区(End Sector):只使用了0~5位。最后两位(第6、7位)被结束柱面字段所使用 |
0x01C5 | 10位 | 0xFF | 结束柱面(End Cylinder):结束柱面是一个10位的数,最大值为1023 |
0x01C6 | 4字节 | 0x0000003F | 本分区之前使用的扇区数(Sectors preceding partition):指从该磁盘开始到该分区开始之间的偏移量,以扇区数来表示 |
0x01CA | 4字节 | 0x01388AFC | 分区的总扇区数(Sectors in partition):指该分区所包含的扇区总数 |
注意
表4-1中的超过1字节的数据都以高位到低位的方式显示,因为Windows系统是运行在x86架构之上的,所以在实际存储时是按低位到高位存储的,两者表现不同,请仔细看清楚。以后出现的表和图均用这种方式描述。
另外也可以通过WinHex的模板管理器中的MBR模板来查看这些参数的意义,对WinHex不熟悉的读者请先学习第3章的“WinHex使用方法详解”。
打开WinHex的模板管理器,选择MBR模板,如图4-18所示。
双击模板后就可以查看分区表信息了,如图4-19所示。
下面对一些重要的信息作进一步的解释:
①分区表项的第一个字节为分区的引导标志,只能是00H和80H。80H为可引导的活动分区,00H为不可引导的非活动分区。其他值对Microsoft而言为非法值。
②再重复非常重要的一点:大于1字节的数值被以低字节在前的存储格式(Little Endian)顺序保存下来。例如,“本分区之前使用的扇区数”字段的值3F000000H就是Little Endian格式的,按照习惯的高位在前的方式表示为0000003FH,这个数值的十进制值为63。
③“本分区之前使用的扇区数”就是该分区的相对起始扇区号,是以LBA值来表示的。这个值也可以称为隐藏扇区数。
④系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。有时分区时输入分区的大小为7000MB,结果分出来却是6997MB,就是这个原因。
⑤分区表项的第三和第四个字节的扇区和柱面参数中,扇区占6位(bit),柱面占10位(bit)。以“起始扇区号”为例,其低6位用作扇区数的二进制表示,高两位用做柱面数10位中的高两位。由此可知,实际上用这种方式表示的分区容量是有限的,柱面和磁头从0开始编号,扇区从1开始编号,所以最多只能表示1024个柱面×63个扇区×256个磁头×512Byte=8 455 716 864Byte,即通常的8.4GB(实际上应该是7.8GB左右)限制。实际上磁头数通常只用到255个(由汇编语言的寻址寄存器决定),即使把这3字节按线性寻址,依然力不从心。在后来的操作系统中,超过8.4GB的分区其实已经不通过C/H/S的方式寻址了。而是通过偏移0CH~偏移0FH共4字节32位线性扇区地址来表示分区所占用的扇区总数。可知通过4字节可以表示232个扇区,即2TB=2048GB,目前对于大多数计算机而言,这么大的分区已经够用了。在未超过8.4GB的分区上,C/H/S的表示方法和线性扇区的表示方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即使不协调,也以线性寻址为准。超过8.4GB的分区结束C/H/S一般填充为FEH FFH FFH,即C/H/S所能表示的最大值。不过这几个字节是什么其实都无关紧要了。
⑥虽然现在的系统均采用线性寻址的方式来处理分区的大小,但不可跨柱面的原则依然没变。本分区的扇区总数加上与前一分区之间的保留扇区数目依然必须是柱面容量的整数倍。
⑦偏移01C2H处表示该分区的类型,它是操作系统管理分区、组织分区的方式。下面给出一些常见的分区类型,详见表4-2。
表4-2 常见分区类型
00H | DOS或Windows不允许使用,视为非法 | 5CH | Priam Edisk |
01H | FAT12 | 61H | Speed Stor |
02H | XENIX root | 63H | GNU HURD or Sys |
03H | XENIX usr | 64H | Novell Netware |
04H | FAT16 小于32MB | 65H | Novell Netware |
05H | Extended | 70H | Disk Secure Mult |
06H | FAT16 大于32MB | 75H | PC/IX |
07H | HPFS/NTFS | 80H | Old Minix |
08H | AIX | 81H | Minix/Old Linux |
09H | AIX bootable | 82H | Linux swap |
0AH | OS/2 Boot Manage | 83H | Linux |
0BH | Windows 95 FAT32 | 84H | 0S/2 hidden C: |
0CH | Windows 95 FAT32 | 85H | Linux extended |
0EH | Windows 95 FAT16 | 86H | NTFS volume set |
0FH | Windows 95 Extended(大于8GB) | 87H | NTFS volume set |
10H | OPUS | 93H | Amoeba |
11H | Hidden FAT12 | 94H | Amoeba BBT |
12H | Compaq diagnost | A0H | IBM Thinkpad hidden |
16H | Hidden FAT16 | A5H | BSD/386 |
14H | Hidden FAT16小于32MB | A6H | Open BSD |
17H | Hidden HPFS/NTFS | A7H | NextSTEP |
18H | AST Windows swap | B7H | BSDI fs |
1BH | Hidden FAT32 | B8H | BSDI swap |
1CH | Hidden FAT32 partition(using LBA-mode INT 13 extensions) | BEH | Solaris boot partition |
1EH | Hidden LBA VFAT partition | C0H | DR-DOS/Novell DOS secured partition |
24H | NEC DOS | C1H | DRDOS/sec |
3CH | Partition Magic | C4H | DRDOS/sec |
40H | Venix 80286 | C6H | DRDOS/sec |
41H | PPC PreP Boot | C7H | Syrinx |
42H | SFS | DBH | CP/M/CTOS |
4DH | QNX4.x | E1H | DOS access |
4EH | QNX4.x 2nd part | E3H | DOS R/0 |
4FH | QNX4.x 3rd part | E4H | SpeedStor |
50H | OnTrack DM | EBH | BeOS fs |
51H | OnTrack DM6 Aux | F1H | SpeedStor |
52H | CP/M | F2H | DOS 3.3+ secondary partition |
53H | OnTrack DM6 Aux | F4H | SpeedStor |
54H | OnTrack DM6 | FEH | LAN step |
55H | EZ-Drive | FFH | BBT |
56H | Go1den Bow |
在一块硬盘中是允许有多个主磁盘分区的,来看一个例子。
图4-20所示是“计算机管理”中的“磁盘管理”界面,其中“磁盘1”是一块2GB的硬盘,从图中可以看到,这块硬盘分为3个区,都为主磁盘分区,没有扩展分区。
用WinHex打开这块硬盘的MBR扇区查看它的分区表,如图4-21所示。
再用WinHex的MBR模板看一下它的参数,如图4-22所示。
不知道读者是否看出规律了,如果还没有看出来,我们一起分析一下。
首先做一个说明,前面提到过,分区表中的C/H/S参数基本上不起什么作用,所以在分析分区表时,对其不做分析。
①从每个分区表项的第一个字节可以看到,它们的值都是00H,说明这三个分区都不是活动分区。
②从“分区类型”这个参数可以看到,这三个分区的类型都是0BH,说明它们都是FAT32分区。
③第一个分区的开始扇区为63号扇区,大小为1 028 097个扇区。请注意,这两个值相加得到1 028 160,这个值是什么呢,它就是第二个分区的开始扇区号,这一点可以从第二个分区表项中看到。
④同理,第二个分区的开始位置1 028 160扇区,加上第二个分区的大小1 445 850扇区,得到2 474 010,这个值又是第三个分区的开始扇区号。
我们从中可以发现规律,在这种主磁盘分区中,每个分区的开始扇区号,都是硬盘的绝对扇区号。这一点非常重要,请大家理解并记住。