2.2 DOS分区
DOS分区是我们遇到的最多的分区类型。多年以来,DOS分区体系一直是Intel IA32硬件平台(i386 / x86等)的分区体系。
2.2.1 概述
虽然很多参考文档对DOS分区进行介绍,但一直没有一个统一的标准,也没有统一的命名规则。Microsoft将使用DOS分区体系的磁盘称为"主
引导记录(Master Boot Recorder,MBR)磁盘",这是相对于使用"全局ID分区表(GUID Partition
Table,GPT)磁盘"而言的。
提示:GPT是Windows Server
2003 中的一种新型磁盘架构,是一种基于 Itanium 计算机中的可扩展固件接口(Extensible Firmware
Interface,EFI)使用的磁盘分区架构。这种64位的Itanium
版Windows系统采用的磁盘布局架构,与传统的32位磁盘布局架构完全不同,我们将在后面进行详细介绍。
从Windows 2000开始,Microsoft又引入了"基本磁盘(Basic Disk)"和"动态磁盘(Dynamic Disk)"的概念。
对于基本磁盘而言,不管是使用MBR分区还是使用GPT分区,位于其上的分区都是由单一的空间组成并独立存在的。在分区存在的情况下,无法在不影响现有数据的条件下对分区动态地扩容。要想对分区进行扩容,就必须先删除现有的分区,再重新进行划分。
而对于动态磁盘而言,不管是使用MBR分区体系还是使用GPT分区体系,位于其上的分区可以是由单一的空间组成,也可以是由若干个空间(不受是否连
续的限制)组成,甚至可以由若干个磁盘上的若干个空间组成。同时,如果使用NTFS文件系统,还可以在不影响现有分区内数据的情况下动态地对分区进行扩
容。由于GPT分区体系尚未完全普及,所以,我们依然沿用传统意义上的基本磁盘所指的范畴,即我们提到"基本磁盘"时,单指DOS分区磁盘,也就是MBR
磁盘,而不包括GPT磁盘。
注意:很多人一提到"DOS分区",就认为只是指Windows下使用的分区体系,这是对"DOS
分区"的一个理解误区。"DOS分区"并不是以操作系统的不同而划定的分区体系,而是指使用"主引导记录(MBR)"的分区体系。Microsoft
DOS、Linux以及基于IA32平台的FreeBSD和OpenBSD等操作系统都使用DOS分区体系。DOS分区是最常见也是最复杂的分区体系。
2.2.2 主引导记录扇区MBR
使用DOS分区体系时,磁盘的第一个扇区--也就是0号扇区被称为主引导记录扇区,也称为主引导记录MBR(Master Boot
Recorder,MBR)。当计算机启动并完成自检后,首先会寻找磁盘的MBR扇区并读取其中的引导记录,然后将系统控制权交给它。由此可见,如果
MBR损坏,则后续的所有工作都无法继续进行。
1.MBR数据结构
MBR由446个字节的引导代码、64个字节的主分区表及2个字节的签名值"55AA"组成。我们首先使用Winhex来看一下MBR扇区的内容,如图2.11所示(因为该磁盘尚未进行分区操作,所以分区表全部为空)。
可以看到,MBR扇区由如下三大部分组成。
引导代码:MBR接管系统的控制权后,引导代码负责对其他代码信息进行检查(例如查看是否有"55AA"有效标记)并进一步引导系统。
分区表:分区表负责描述磁盘内的分区情况。
"55AA"有效标志:"55AA"标志作为有效标志以通知系统该MBR扇区是否有效,如果该标志丢失或损坏,磁盘将会显示为"未初始化"。
MBR扇区的数据结构如表2.1所示。
表2.1 MBR扇区的数据结构
|
字节偏移(十六进制)
|
字 节 数
|
描 述
|
|
00~1BD
|
446
|
引导代码
|
|
1BE~1CD
|
16
|
分区表项1
|
|
1CE~1DD
|
16
|
分区表项2
|
|
1DE~1ED
|
16
|
分区表项3
|
|
1EE~1FD
|
16
|
分区表项4
|
|
1FE~1FF
|
2
|
签名值(55AA)
|
具体含义解释如下。
(1) 0x00~0x1BD:446个字节,引导代码区域,包含一段指令,用以通知计算机如何访问分区表并定位操作系统的位置。
主引导代码是一段非常重要的代码,因为它是磁盘上最先装入内存并执行的代码。也正因为如此,很多引导型病毒把自己嵌入到主引导代码中,从而实现首先
运行的目的。标准的Microsoft引导代码会在计算机启动完成自检并将控制权交给它后,读取分区表并根据分区表项的可引导标志判定哪个主分区是引导分
区,找到这个分区后就查看并读取位于该分区第一个扇区的引导代码并进而启动操作系统,这部分代码会因操作系统的不同而不同。
利用引导代码可以实现多系统引导。很多用户需要在同一台计算机上安装超过一个的操作系统,这就需要使用多系统引导,以便能够在计算机启动时选择要进入的操作系统。多系统引导可以由两种方法实现。
一种方法是,大多数用户会将Windows操作系统作为要安装的系统之一,Windows可以在引导分区中设置一段代码,以允许用户选择要进入的操
作系统。也就是说,MBR中的主引导程序先加载Windows引导代码,然后由Windows引导代码再呈现给用户一个操作系统选择界面。
另一种方法是改变MBR中的引导代码,修改后的引导代码会直接呈现给用户一个选项列表,由用户选择从哪个分区进行引导。这种方法一般会占用位于第一个分区之前的一部分未使用扇区存放程序代码。
(2) 0x1BE~0x1FD:64个字节,4个分区表项,每个表项占用16个字节。每个表项描述一个DOS分区,最多可以描述4个主分区。
分区表项并没有顺序要求,也就是说,并不严格要求第一个分区表项对应物理位置的第一个分区,第二个表项对应第二个分区。
分区表也并不要求必须先使用第一个分区表项,然后依次使用后面的表项。操作系统在检索主分区表时,会完整地对四个分区表项进行完全检索,然后根据每个分区表项描述的物理位置定位分区,而不会以分区表项的先后顺序定位分区所处的先后位置关系。
图2.12描述了一个被划分成三个主分区的磁盘,前三个分区表项分别用来描述一个分区,最后一个分区表项未被使用。
(3) 0x1FE~0x1FF:2个字节,有效结束标志"55AA"。如果没有这个签名值,操作系统会认为该磁盘没有被初始化,也就无法正常加载磁盘上
的分区和解释数据。不过,只要分区和文件系统正常,某些数据恢复软件在没有这个签名值的情况下也可以正确地检测到分区表并正确地解释出所有正常的数据。
2.分区表项数据结构
分区表区域共占用64个字节,一个分区表项由以下几个部分组成:
是否可引导标志。
分区起始CHS地址。
分区类型。
分区结束CHS地址。
分区起始LBA地址。
分区大小扇区数。
分区表项数据结构如表2.2所示。
表2.2 分区表项数据结构
|
偏移(十六进制)
|
字节数
|
描 述
|
|
00~00
|
1
|
可引导标志,0x00 - 不可引导;0x80 - 可引导
|
|
01~03
|
3
|
分区起始CHS地址
|
|
04~04
|
1
|
分区类型
|
|
05~07
|
3
|
分区结束CHS地址
|
|
08~0B
|
4
|
分区起始LBA地址(Little-endian顺序)
|
|
0C~0F
|
4
|
分区大小扇区数(Little-endian顺序)
|
各部分含义解释如下。
(1) 0x00~0x00:1个字节,可引导标志。只有两种可能值,0x80为可引导,0x00为不可引导,其他值为非法值。
这个标志并不是必需的,只有在磁盘上有引导分区时,才会将该分区对应的分区表项的该字节置为0x80。
另外,如果安装了多操作系统并且使用了多系统引导软件,由用户选择使用哪个分区内的操作系统启动时,多系统引导软件会在用户选择了正确的引导分区后将该分区所对应的分区表项中的引导标志字节置为0x80,以使其可引导。
注意:在四个分区表项中,最多只能有一个分区表项被标记为可引导,否则为非法。
(2) 0x01~0x03:3个字节,分区的起始CHS地址。
第一个字节用于记录分区起始磁头号。
第二个字节的低6位用于记录分区起始扇区号。
用10个bit记录分区起始柱面号:第二个字节的高两位作为起始柱面号的高两位,第三个字节的8个bit作为分区起始柱面号的低8位。
提示:只有Windows 98及Windows
ME等较老的操作系统才使用这个CHS区域的值,Windows
2000及以后的操作系统则忽略它们,而只使用LBA区域的值来定位分区的位置及大小。保留CHS参数只是为了兼容较早的操作系统的需要。对于工具类软
件,则可能会因软件的不同而使用CHS参数或LBA参数。在分区表被破坏需要手工重写分区表时,可以不必关心CHS参数,虽然据称这三个参数全为0会被判
定为分区表项不合法,但在Windows XP下实验发现这三个参数全部为0并不会影响数据再现,其他潜在影响未知。
(3) 0x04~0x04:1个字节,分区类型标志。
分区类型标志表明其所描述的分区的类型,如FAT、NTFS、Linux或者FreeBSD等,不同的操作系统可能会使用不同的分区类型。利用分区
类型值,可以达到隐藏某些分区的目的。例如,将NTFS的类型值由0x07改为0x17,重新进入Windows后,Windows将不再为其分配盘符,
也就无法在"我的电脑"中看到这个分区。
分区标志类型值及其含义如表2.3所示。
表2.3 分区标志类型值及其含义
|
类型值
(十六进制)
|
含 义
|
类型值
(十六进制)
|
含 义
|
|
00
|
空,DOS或Windows
不允许使用,视为非法
|
5C
|
Priam Edisk
|
|
01
|
FAT12
|
61
|
Speed Stor
|
|
02
|
XENIX root
|
63
|
GNU HURD or Sys
|
|
03
|
XENIX usr
|
64
|
Novell Netware
|
|
06
|
FAT16分区小于32M时为0x04
|
65
|
Novell Netware
|
|
07
|
HPFS / NTFS
|
70
|
Disk Secure Mult
|
|
08
|
AIX
|
75
|
PC/IX
|
|
09
|
AIX bootable
|
80
|
Old Minix
|
|
0A
|
OS/2 Boot Manage
|
81
|
Minix/Old Linux
|
续表
|
类型值
(十六进制)
|
含 义
|
类型值
(十六进制)
|
含 义
|
|
0B
|
Win95 FAT32
|
82
|
Linux swap
|
|
0C
|
Win95 FAT32
|
83
|
Linux
|
|
0E
|
Win95 FAT16
|
84
|
0s/2 hidden C:
|
|
0F
|
Win95 Extended(大于8GB)
|
85
|
Linux extended
|
|
10
|
OPUS
|
86
|
NTFS volume set
|
|
11
|
Hidden FAT12
|
87
|
NTFS volume set
|
|
12
|
Compaq diagmost
|
93
|
Amoeba
|
|
14
|
Hidden FAT16<32MB
|
94
|
Amoeba BBT
|
|
16
|
HiddenFAT16
|
A0
|
IBM Thinkpad hidden
|
|
17
|
Hidden HPFS/NTFS
|
A5
|
BSD/386
|
|
18
|
AST Windows swap
|
A6
|
Open BSD
|
|
1B
|
Hidden FAT32
|
A7
|
NextSTEP
|
|
1C
|
Hidden FAT32 partition
(using LBA-mode INT 13 extensions)
|
B7
|
BSDI fs
|
|
B8
|
BSDI swap
|
|
1E
|
Hidden LBA VFAT partition
|
BE
|
Solaris boot partition
|
|
24
|
NEC DOS
|
C0
|
DR-DOS/Novell DOS
secured partition
|
|
3C
|
Partition Magic
|
C1
|
DRDOS/sec
|
|
40
|
Venix 80286
|
C4
|
DRDOS/sec
|
|
41
|
PPC Perp Boot
|
C6
|
DRDOS/sec
|
|
42
|
NTFS动态分区
|
C7
|
Syrinx
|
|
4D
|
QNX4.x
|
DB
|
CP/M/CTOS
|
|
4E
|
QNX4.x 2nd part
|
E1
|
DOS access
|
|
4F
|
QNX4.x 3rd part
|
E3
|
DOS r/0
|
|
50
|
OnTrack DM
|
E4
|
Speedstor
|
|
51
|
OnTrack DM6 Aux
|
EB
|
BeoS fs
|
|
52
|
CP/M
|
F1
|
SpeedStor
|
|
53
|
OnTrack DM6 Aux
|
F2
|
DOS 3.3+secondary partition
|
|
54
|
OnTrack DM6
|
F4
|
SpeedStor
|
|
55
|
EZ-Drive
|
FE
|
LAN step
|
|
56
|
Golden Bow
|
FF
|
BBT
|
Microsoft对某些相同的文件系统使用了不同的类型值。这是因为,Microsoft操作系统根据类型值的不同确定使用哪种方式对分区内的数
据进行读写操作--使用基本Int 13H( BIOS Int 13H)还是扩展Int 13H(Extended Int 13H)。
基本Int
13H调用是BIOS提供的磁盘基本输入输出中断调用,它可以完成磁盘(包括硬盘和软盘)的复位、读写、校验、定位、诊断、格式化等功能。它使用的就是
CHS寻址方式,因此最大只能访问8 GB左右的硬盘。虽然现代硬盘都已经采用了线性寻址,但是由于基本Int 13H的制约,使用BIOS Int
13H接口的程序,如DOS 等则只能访问8GB以内的硬盘空间。
为了打破容量访问限制,Microsoft等几家公司制定了扩展Int 13H标准(Extended Int 13H),采用线性寻址方式存取硬盘,所以突破了8GB的限制,而且还加入了对可拆卸介质(如移动硬盘)的支持。
(4) 0x05~0x07:分区结束CHS地址。与分区起始CHS地址结构相同。
(5) 0x08~0x0B:4个字节,分区起始LBA地址,使用Little-endian顺序。这是非常重要的参数,如果该参数遭到破坏,操作系统将无法找到文件系统分区或扩展分区的起始位置。
(6) 0x0C~0x0F:4个字节,分区大小扇区数,使用Little-endian顺序。
注意:实践表明,在手工重写分区表时,在其他参数正确的情况下,分区大小扇区数稍有偏差对导出数据
不会产生什么影响。当然,不能偏差太多。不过需要注意,虽然填入的某个分区大小扇区数稍微大于原分区实际大小不会影响本分区内的数据,但如果该分区后还有
分区,则可能会因为产生分区交错而导致系统无法正常加载各个分区,甚至造成死机现象的发生。