分区表和主引导记录

  分区表是硬盘逻辑结构的一个重要组成部分。如果一个硬盘的空间太大,我们通常把它分割成几个部分。每个部分有一个固定的大小,并被称为逻辑驱动器。为什么我们要做这件事情?因为两个原因:
1. 如果一个硬盘的空间没有被分割,一个逻辑驱动器可能会太大并且文件碎片(参见 DEFRAG.EXE 程序——磁盘碎片整理)会增长得更快。为了避免这种情况的发生,我们把一个磁盘的空间分割成几个部分。(这种情况在 Windows NT/2000 及更高版本上已不再发生)。
2. 虽然把信息保存在不同目录是一个把不同类型的文件放在不同位置的好方法(特别当把它们重定向为网络驱动器的时候,参见 SUBST.EXE),但是有时我们仍然要格式化一个磁盘来让它变得干净。这个时候,一个占据整个磁盘空间的逻辑驱动器会带来麻烦。(自从 Windows Vista 开始,这种需求就变得少多了,因为它的可引导安装光盘有一个预安装环境(WinPE),并且它会在安装前把老的 Windows 文件移动到一个叫 Windows.old 的目录中去)。
  在分区表中,数据包括分区的起始扇区,分区的大小以及分区的类型。
  在使用一个硬盘之前,它应该被分区。一个新的硬盘通常是低级格式化过的(意味着表示磁道和扇区的标记已经在磁盘上了;软盘有时在出售时没有被低级格式化过),并且有一个可以使用的位于第一个扇区中的主引导程序;这个扇区叫主引导记录(MBR)。还有一个同样重要的扇区,就是活动的(可引导的)分区的第一个扇区。这个扇区叫做引导扇区。
  主引导程序用于引导在磁盘上一个可引导的分区内安装的操作系统。主引导程序先在主分区表(是主引导记录中的一部分)中查找它所需的信息,接着把标记为“活动”的分区的引导扇区读到内存中,然后运行在引导扇区中的引导程序来引导操作系统。
  在 2001 年,我刚开始写这篇文章时,市场上流行的硬盘大小是 40GB。在 2011 年,当我审阅并更新这篇文章时,主引导记录即将被 GUID 分区表和相关的英特尔统一可扩展固件接口所取代,因为它无法表示大于 2TB 的分区的缘故。(说明:GUID 是“全球唯一标识”(Global Unique Identification)的缩写,它用于唯一地标识一个对象,即使是从不同的两台电脑上生成的对象,其 GUID 也不会重复。统一可扩展固件接口的英文名称是 UEFI,Unified Extensible Firmware Interface。)
  让我们来看看主引导扇区有一些什么。以下是我在我的 8GB 硬盘上跑的 Windows 98 中所做的操作。
C:\WINDOWS\Desktop>debug
-a 100
17C2:0100 mov ax, 0201
17C2:0103 mov bx, 0200
17C2:0106 mov cx, 0001
17C2:0109 mov dx, 0080
17C2:010C int 13
17C2:010E int 3
17C2:010F
-g=100

AX=0050  BX=0200  CX=0001  DX=0080  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=17C2  ES=17C2  SS=17C2  CS=17C2  IP=010E   NV UP EI PL NZ NA PO NC
17C2:010E CC            INT     3
-d 200 3ff
17C2:0200  FA 33 C0 8E D0 BC 00 7C-8B F4 50 07 50 1F FB FC   .3.....|..P.P...
17C2:0210  BF 00 06 B9 00 01 F2 A5-EA 1D 06 00 00 BE BE 07   ................
17C2:0220  B3 04 80 3C 80 74 0E 80-3C 00 75 1C 83 C6 10 FE   ...<.t..<.u.....
17C2:0230  CB 75 EF CD 18 8B 14 8B-4C 02 8B EE 83 C6 10 FE   .u......L.......
17C2:0240  CB 74 1A 80 3C 00 74 F4-BE 8B 06 AC 3C 00 74 0B   .t..<.t.....<.t.
17C2:0250  56 BB 07 00 B4 0E CD 10-5E EB F0 EB FE BF 05 00   V.......^.......
17C2:0260  BB 00 7C B8 01 02 57 CD-13 5F 73 0C 33 C0 CD 13   ..|...W.._s.3...
17C2:0270  4F 75 ED BE A3 06 EB D3-BE C2 06 BF FE 7D 81 3D   Ou...........}.=
17C2:0280  55 AA 75 C7 8B F5 EA 00-7C 00 00 49 6E 76 61 6C   U.u.....|..Inval
17C2:0290  69 64 20 70 61 72 74 69-74 69 6F 6E 20 74 61 62   id partition tab
17C2:02A0  6C 65 00 45 72 72 6F 72-20 6C 6F 61 64 69 6E 67   le.Error loading
17C2:02B0  20 6F 70 65 72 61 74 69-6E 67 20 73 79 73 74 65    operating syste
17C2:02C0  6D 00 4D 69 73 73 69 6E-67 20 6F 70 65 72 61 74   m.Missing operat
17C2:02D0  69 6E 67 20 73 79 73 74-65 6D 00 00 80 20 06 17   ing system... ..
17C2:02E0  56 33 F6 56 56 52 50 06-53 51 BE 10 00 56 8B F4   V3.VVRP.SQ...V..
17C2:02F0  50 52 B8 00 42 8A 56 24-CD 13 5A 58 8D 64 10 72   PR..B.V$..ZX.d.r
17C2:0300  0A 40 75 01 42 80 C7 02-E2 F7 F8 5E C3 EB 74 B7   .@u.B......^..t.
17C2:0310  D6 C7 F8 B1 ED CE DE D0-A7 A1 A3 B0 B2 D7 B0 B3   ................
17C2:0320  CC D0 F2 CE DE B7 A8 BC-CC D0 F8 A1 A3 00 BC D3   ................
17C2:0330  D4 D8 B2 D9 D7 F7 CF B5-CD B3 CA B1 B3 F6 CF D6   ................
17C2:0340  B4 ED CE F3 A1 A3 B0 B2-D7 B0 B3 CC D0 F2 CE DE   ................
17C2:0350  B7 A8 BC CC D0 F8 A1 A3-00 C8 B1 C9 D9 B2 D9 D7   ................
17C2:0360  F7 CF B5 CD B3 00 00 00-00 00 00 00 00 00 00 00   ................
17C2:0370  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17C2:0380  00 00 00 8B FC 1E 57 8B-F5 CB 00 00 00 00 00 00   ......W.........
17C2:0390  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17C2:03A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
17C2:03B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 01   ................
17C2:03C0  01 00 17 FE BF 8C 3F 00-00 00 0E 12 A0 00 80 00   ......?.........
17C2:03D0  81 8D 0C FE FF FF 4D 12-A0 00 4D 12 A0 00 00 FE   ......M...M.....
17C2:03E0  FF FF 0F FE FF FF 9A 24-40 01 FE E6 19 01 00 00   .......$@.......
17C2:03F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA   ..............U.
-
  在上表中:
1. 一开始是主引导程序。它启动“活动分区”中的操作系统。
2. 从位于偏移 0x1BE 开始(也就是 17C2:03BE)是主分区表。其中共有四个表项。每个记录使用 16 字节。它们的内容如下:
偏移量    内容
0x00      分区是否是活动的。如果值是 0x80 ~ 0x8F,分区就是活动的。如果
          值是 0x00,这个分区是不活动的。

0x01-0x03 分区的起始磁头号、扇区号和柱面号。在 P-CHS(物理柱面-磁头-扇区
          号)模式下供在硬盘的前 504 兆字节中的分区使用。在 L-CHS(逻辑
          柱面-磁头-扇区号)模式下供在硬盘的前 8 吉字节中的分区使用。

0x04      分区的类型。见下表(引用自 BootStar 帮助):

MS-DOS: FAT 12,分区小于 32 兆字节:类型“01” FAT 16,分区小于 504 兆字节,版本高于 3.3:类型“04” FAT 16,分区小于 2 吉字节并且在硬盘的前 8 吉字节以内:类型“06” 视窗 95: FAT 16,分区小于 2 吉字节并且在硬盘的前 8 吉字节以内:类型“06” FAT 16,分区小于 2 吉字节并且不在硬盘的前 8 吉字节以内:类型“0E” 视窗 95b OSR 2,视窗 98: FAT 16,分区小于 2 吉字节并且在硬盘的前 8 吉字节以内:类型“06” FAT 16,分区小于 2 吉字节并且不在硬盘的前 8 吉字节以内:类型“0E” FAT 32,在硬盘的前 8 吉字节以内:类型“0B” FAT 32,在硬盘的不前 8 吉字节以内:类型“0C” 视窗 NT: FAT 16,分区小于 4 吉字节并且在硬盘的前 8 吉字节以内:类型“06” NTFS;分区在前 1024 柱面以内开始:类型“07” 视窗 2000: FAT 16,分区小于 4 吉字节并且在硬盘的前 8 吉字节以内:类型“06” FAT 16,分区小于 4 吉字节并且不在硬盘的前 8 吉字节以内:类型“0E” FAT 32,分区小于 127 吉字节并且在硬盘的前 8 吉字节以内:类型“0B” FAT 32,分区小于 127 吉字节并且不在硬盘的前 8 吉字节以内:类型“0C” NTFS;分区在前 1024 柱面以内开始:类型“07” OS/2: HPFS;分区小于 2 吉字节并且在硬盘的前 8 吉字节以内:类型“07” FAT 16,分区小于 2 吉字节并且在硬盘的前 8 吉字节以内:类型“06” Linux: ext2fs,分区在前 1024 柱面以内开始:类型“83” 交换分区(要另外设置):类型“82” 扩展分区: 标准:类型“05” 分区不在硬盘的前 8 吉字节以内:类型“0F” Novell Netware: Netware 286:类型“64” Netware 3.11:类型“65”
0x05-0x07 分区的结束磁头号、扇区号和柱面号。在 P-CHS 模式下供在硬盘的前 504 兆字节中的分区使用。在 L-CHS 模式下供在硬盘的前 8 吉字节中 的分区使用。 0x08-0x0B 分区的第一个扇区的相对扇区号。换句话说,把分区的起始扇区的绝对 扇区号减去包含这分区表的扇区的绝对扇区号就是相对扇区号。这个数 字对小于 2048 吉字节的硬盘都是有效的。这个数字可以用于扩展的 INT 13H 中断调用,它支持高达 48 位扇区号的 LBA(逻辑块地址)模 式(在 2003 年的 ATA-6 标准中)。 0x0C-0x0F 分区包含的扇区数。这个数字对小于 2048 吉字节的硬盘都是有效的。
3. 0x1FE 和 0x1FF 这两个字节组成硬盘主引导记录有效标志“55 AA”。
  如果你在使用 MS-DOS 或者视窗 9x 或者视窗 NT/2000,你会看见一个主 DOS 分区和一个扩展分区。它们加在一起占用了整个硬盘的空间(在这里的例子中看不出来,因为我的硬盘空间没有被全部分配掉)。通常,C 盘是一个可引导的分区并且它应该是一个主 DOS 分区。为了能在计算机启动的时候引导它,它应该被标记为“活动”。你的硬盘的其他驱动器字母通常是扩展分区中的逻辑驱动器。常见的情况是,在扩展分区中有超过一个的逻辑驱动器。为了标记这些在硬盘上的逻辑驱动器,子分区表就被采用了。这些分区表是这样被链接起来的:主分区表中有关扩展分区的信息指向第一个子分区表。在第一个子分区表中包含指向第一个逻辑驱动器和第二个子分区表的信息(记录在一个扇区中,也被称为“扩展引导记录”,虽然里面并没有任何程序代码),以此类推。这样,扩展分区可以有多个逻辑驱动器。
  为了获得大于 504 兆字节的硬盘的准确信息,MS-DOS 或者视窗 9x/NT/2000 对照系统 BIOS(基本输入输出系统)配置来找出硬盘的参数,以使它们可以从相对扇区号和分区包含的扇区数来计算真实的柱面号、磁头号和扇区号。它们也可以略过这种检查而直接使用逻辑柱面-磁头-扇区号并直接调用 INT 13H(BIOS 磁盘操作程序)中断。对于现代的硬盘,LBA 模式被广泛地支持,因此通常不需要考虑柱面号、磁头号和扇区号。
  当你使用 FDISK 创建分区的时候,它不仅仅在磁盘上写入分区信息,它也清除分区的引导扇区。所以当你使用 FORMAT 命令格式化这个分区之前,MS-DOS 不会允许你使用它。由于这个操作,如果你删除一个分区然后使用 FDISK 创建一个新的,这个新的分区在硬盘的相同位置,也有相同的大小,你仍然看不见原来分区中的信息。所以请你在删除和创建分区的时候千万小心!另一件有关 FDISK 的事:“/MBR”开关。这个开关让 FDISK 只是用它的标准版本主引导程序来重写主引导程序。它不影响系统的分区表。如果你在使用修改分区表的多启动工具,比如 BootStar,SystemCommander 等等,不要使用那个开关。
  市场上有其他分区工具比如 Partition Magic(由 PowerQuest 公司出品)、Disk Manager(由 IBM 公司出品)以及开源软件 GParted(Gnome 分区编辑器)。它们支持调整分区大小、复制和移动分区这些 FDISK 所不支持的特殊操作。同时,诺顿 Ghost 是一个分区复制和备份工具(另一个是 PowerQuest DriveImage)。当然你可以使用它们中的任何一种,但是为了你好,不要同时使用好几个同类型的工具,除非有官方的文件指出你所使用的产品是互相兼容的。有时一个工具有某方面的缺陷或不兼容等情况,而另一个工具有另一方面的问题。同样地,你最好不要在分区工具在执行操作的时候中止它(不管它是否有一个“取消”按钮),因为这样做可能会带来问题。

返回 MS-DOS 基础知识