当前位置:C++技术网 > 资讯 > Windows下的DOS分区体系深入解析

Windows下的DOS分区体系深入解析

更新时间:2015-06-26 23:43:34浏览次数:1+次

    DOS分区表讲解图示,请参考DOS分区图,来看下面的分析。

DOS分区体系深入解析
    在深入解析之前,我得让大家清楚一个事实。DOS分区体系并不是Windows的东西,而是一个分区标准,在Linux等系统中,也会使用的。只是,Windows对DOS分区有其自己的处理罢了。DOS分区体系只是一个分区标准大框架,具体的细节,则会因为不同的操作系统而存在差异。所以在开始之前,想特别提醒一下读者,DOS分区不要误以为只是Windows上的标准。
    在Windows中,将DOS分区体系称为主引导记录(Master Boot Record,MBR)。在其他操作系统或者领域文档中,可能对此叫法都不一样。而在Windows平台中,已经明确称为主引导记录了。所以,在Windows操作系统中,通常也把DOS分区体系叫做DOS分区或者MBR分区或者主引导记录分区。
    在此,我们必须要提到一点,目前存在的还有一种分区体系,那就是“全局ID分区体系(GUID Partition Table,GPT)”,也就是常常听说的GPT分区体系。这里只是简单的介绍一下这种分区体系。GPT分区支持128个分区,而DOS分区体系最多只有4个主分区,要使用超过4个分区,那么就要使用扩展分区。这会在后面详细讲解。GPT还有一个绝对优势,就是一个GPT分区支持最大18EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)大小。而DOS分区中,最大只能支持2TB。GPT在大数据时代中,占据绝对优势。而日常使用,还是以DOS分区为主。
    DOS分区体系中,以一个主分区表可以支持4个主分区,而要创建更多的分区,则要使用扩展分区结构。主分区就相当于一张表,操作系统启动前,就是要访问这个表,以找到操作系统所在的分区,进而启动操作系统,所以也叫这个表为主分区表,就是因为是第一个被访问的分区表。主分区表有4个表项,记录了四个主分区的起始地址、大小、分区类型等。
    而为了创建更多的分区,就需要使用扩展分区结构。扩展分区是以链表的形式串接起来的。为了支持扩展分区,要在主分区表的四个表项中分一个表项给扩展分区,这个叫做主扩展分区,用来描述主扩展分区的起始地址和大小。因此,在主分区表中,就最多有三个主分区和一个主扩展分区。而在主扩展分区中,也含有一个分区表,叫做二级分区表。但是Windows只利用前面两项分区表项,剩余的两个没用。二级分区表项中,一个是二级分区,一个是二级扩展分区。在二级扩展分区中,也有一个分区表,这个分区表中也只能使用前两个表项。如此类推,可以创建很多的二级分区。
    二级分区,也就是我们常见的逻辑分区。在操作系统看到的,主分区和逻辑分区都是一样的。但是在底层,是不同的。主分区和二级分区在划分结构上都是不相同的。但是使用分区的文件系统时,则没有什么差异。
    整理一下,如果分区最多为4个,就可以将四个分区全部划分为主分区。当然,此时也可以只用主分区的一个两个或者三个,把其他的分区都放在二级分区中,也是可以的。不同的分区软件,是有所不同的。但是二级分区表中,Windows规定必须只能使用前两个分区表项,一个作为分区项,一个作为扩展分区项。
    在决定分区和扩展分区的地址问题上,DOS分区体系规定是这样的:主分区和主扩展分区的起始地址是相对于整个磁盘的0扇区的。而在主扩展分区的范围中,含有所有的二级分区和二级扩展分区。因为二级分区表示链式的,因此有很多级,都叫做二级分区和二级扩展分区。二级分区的起始地址,都是相对于此分区表项所在二级分区表所在的位置的。而二级扩展分区的起始的地址,则不是相对于二级分区表的位置的,是相对于主扩展分区的起始位置的。不管二级扩展分区是多少级,都是相对于主扩展分区起始地址。
    很可能你会想,为什么二级分区是相对于二级分区表的,而二级扩展分区则是相对于主扩展分区的。是不是挺麻烦的?我一开始也这么想的。但是我觉得,设计这个分区体系的人自然有他设计的原因。我就反向假设,如果按照统计的做法,把二级扩展分区也相对于所在的分区表的位置,是不是简单理解呢?后来是想想,发现不好。如果把二级扩展分区的起始地址,相对于分区表,实际上会带来麻烦,会导致计算起来麻烦。二级分区相对于二级分区表,并且记录了二级分区的大小。如果二级扩展分区相对于分区表,那么就要将二级分区考虑进去。因为二级扩展分区是接在二级分区后面的,要知道二级扩展分区的起始地址,首先要知道分区表所在的位置,还要知道二级分区的起始地址和二级分区的大小,这样就可以用分区表地址 + 二级分区的起始地址 + 二级分区的大小,最后算出二级扩展分区的起始地址。如此一来,二级扩展分区的起始地址就依赖了二级分区。如果二级分区修改了起始地址或者缩小了大小,就会导致二级扩展分区的起始地址发生变化。而特定的数据是写在特定的扇区的。如果一个二级分区有所变化,则会导致后面的分区全部出问题。这样耦合性太大,牵连太多的东西,因此,导致这个设计是不健壮的。
    如果二级扩展分区使用相对于主扩展分区,相对来说,主扩展分区的起始位置,可以让所有的二级扩展分区参考,如果二级分区的大小和起始地址稍有错误,二级扩展分区的起始地址也是准确的。因而不会影响后面的分区。所以从设计来讲,这样也就降低了二级扩展分区对二级分区的依赖,从而提高了健壮性。
    并且,因为二级扩展分区相对于主扩展分区,也是计算变得容易。假如二级分区有10级,如果要计算最后一级的二级扩展分区的起始地址,如果是相对于二级分区表的,那么计算层次就很多了,计算就变得麻烦,效率就变低了。而现在采用的是将二级扩展分区起始地址相对于主扩展分区,因此,也使每一级的分区都可以直接通过主扩展分区起始地址 + 二级扩展分区的起始地址,就可以定位到二级扩展分区的绝对地址,因为二级扩展分区的地址相对于主扩展分区的地址,加起来就是绝对的地址。而此级的二级分区相对于此级的二级扩展分区,仅仅通过相对于二级分区表,也能快速的的、计算出绝对的二级分区起始地址。
    这也就是二级扩展分区的起始地址要相对于主扩展分区起始地址的原因,既能快速的定位二级扩展分区,也是此二级分区也能快速定位,摆脱了单纯的链接方式的分区表。所以,扩展分区链表,不是简单的链表。因为二级扩展分区地址给了一个快速定位的特性。这也是设计的巧妙之处。
    其他具体的分区表的字段定义,请参考相关分区表介绍资料,本文是给分区表深入理解而准备的。如有表述不准确或者错误之处,请指出。