硬盘

硬盘如上图所示,包括:
- 盘片:类似光盘中的一个圆盘,上面布满了磁性介质。
-
扇区:扇区是硬盘读写的基本单位,它在磁道上均匀分布,与磁头和磁道不同,扇区从 1 开始编号。扇区的大小字节数=256×N。 N为自然数。通常取 N 为 2,因此扇区大小为 512 字节。
- 磁道: 盘片上的一个个同心圈就是磁道,它是扇区的载体,每一个磁道由外向里从 0开始编号。同一盘片上的每一个磁道上都由扇区组成,即磁道其实是一圈扇区。磁盘上的磁道数取决于制作工艺。离圆心近的磁道与最外圄的磁道周长肯定不一致,那这两种磁道上的扇区数一样吗?答案是:老硬盘是一样的,新式硬盘中已经改进了,外圈磁道会容纳更多的扇区,在新硬盘中有个地址转换器来兼容老硬盘的扇区寻址, 因此依然可以认为硬盘中每个磁道上的扇区数一样多。
- 磁头:用来读盘片上的数据。一个盘片分为上下两个面,各面都有一个磁头,因此一个盘片包括两个磁头,磁头号就表示盘面,平时所说的盘面号就是磁头号。虽然单个盘片的容量不断在增长,但其潜力毕竟是有限的。为了实现大容量,硬盘中必须由多个盘片来组成。既然有多个盘片,两个磁头就自然不够用了,肯定要有盘片× 2 个磁头,磁头编号由上到下从 0 开始。
- 柱面 :硬盘是整个计算机系统中很大的瓶颈了,如何才能让硬盘的读写更快,工程师们想到了并行写入的方式。这个并行就是指多个磁头同时写入。也就是通常我们在写一个文件时,是由多个磁头同时写入到不同的盘面中编号位置相同的磁道上,采用并行的方式,读写速度是单盘的(磁头数)倍。这些由不同盘面上的编号相同的磁道(这些编号相同的同心圆大小一致)从上到下所组成的圆柱体的回转面就称为柱 面,因此柱面的大小等于盘面数(磁头数〉乘以每磁道扇区数。既然一组编号相同的磁道是柱面,而且柱 面上的所有磁道号都相同,所以磁道号就称为柱面号。
- 分区:是由多个编号连续的柱面组成的,因此分区在物理上的表现是由某段范围内的所有柱面组成的通心环,并不是像“饼图”那种逻辑表示,当然若整个硬盘只有 1 个分区,那这个分区就是个所有柱面组成的圆柱体。分区不能跨柱面,也就是同一个柱面不能包含两个分区,一个柱面只属于一个分区,分区的起始和终止都落在完整的柱面上,并不会出现多个分区共享同一柱面的情况,这就是所谓的“分区粒度”。 因此,分区大小等于“每柱面上的扇区数”乘以“柱面数”,这就是我们实际分区时,键入的大小往往与实际大小不同的原因,分区大小总会是“每柱面上的扇区数”的整数倍,也就是会以柱面向上取整。
分区表
分区是逻辑上划分磁盘空间的方式,归根结底是人为的将硬盘上的柱面扇区划分成不同的分组,每个分组都是单独的分区。各分区都有“描述符”来描述分区本身所在硬盘上的起止界限等信息,在硬盘的 MBR 中有个 64字节“固定大小”的数据结构,这就是著名的分区表,分区表中的每个表项就是一个分区的“描述符”,表项大小是 16 字节,因此 64 字节的分区表总共可容纳 4 个表项,这就是为什么硬盘仅支持 4个分区的原因。
在这个“描述符”中有个属性是文件系统 id,它表示文件系统的类型, 为支持更多的分区,专门增加一种 id属性值(id为 5),用来表示该分区可被再次划分出更多的子分区,这就是逻辑分区。因为只是在分区表项中通过属性来判断分区类型,所以这 4 个分区中的任意一个都可以作为扩展分区。扩展分区是可选项,有没有都行,但最多只有 1 个, 1 个扩展分区在理论上可被划分出任意多的子扩展分区,因此 1 个扩展分区足够了。硬盘本来没有扩展分区的概念,为了突破 4 个分区的限制才提出了扩展分区,为了区别这一概念,将剩下的 3 个区称为主分区。
发明扩展分区的目的是为了支持任意数量的分区,但具体划分出多少分区,完全是由用户决定的,所以,扩展分区是种抽象、不具实体的分区,它类似于一种“宣告”, 告诉大家此分区需要再被划分出子分区,也就是所谓的逻辑分区,逻辑分区才可以像其他主分区那样使用。 因此,逻辑分区只存在于扩展分区,它属于扩展分区的子集。
综上所述,分区表中共 4个分区,哪个做扩展分区都可以,扩展分区是可选的,但最多只有 1 个,其余的都是主分区。在过去没有扩展分区时,这 4 个分区都是主分区,为了兼容 4 个主分区的情况,扩展分区中的第 1 个逻辑分区的编号从 5 开始。
最初的磁盘分区表位于 MBR 引导扇区中,MBR (Main Boot Record)即主引导记录,它是一段引导程序,其所在的扇区称为主引导扇区,该扇区位于 0 盘 0 道 1 扇区(物理扇区编号从 1 开始,逻辑扇区地址 LBA 从 0 开始),也就是硬盘最开始的扇区,扇区大小为 512 宇节,这 512 字节内容由三部分组成。
- 主引导记录MBR
- 磁盘分区表 DPT
- 结束魔数 55AA,表示此扇区为主引导扇区,里面包含控制程序
MBR 引导程序位于主引导扇区中偏移 0~Ox1BD 的空间,共计 446 字节大小,这其中包括硬盘参数及部分指令(由 BIOS 跳入执行),它是由分区工具产生的,独立于任何操作系统。
磁盘分区表位于主引导扇区中偏移 Ox1BE ~ Ox1FD 的空间,总共 64 字节大小,每个分区表项是 16字节,因此磁盘分区表最大支持 4 个分区 。
魔数 55AA 作为主引导扇区的有效标志,位于扇区偏移 Ox1FE~Ox1FF,也就是最后 2 个字节。
扩展分区结构
扩展分区中包含多少个逻辑分区,扩展分区的分区表中就该有多少表项,可是任何时候新事物的发展都要把“向上兼容”当成头等大事,它既要兼容此固定长度为 4 个分区的分区表,又要突破固定分区数的限制,这似乎有点为难,该怎样设计扩展分区的分区表呢? 一个两全其美的方案是视这个扩展分区为总扩展分区,将它划分成多个子扩展分区,每个子扩展分区“在逻辑上”相当于硬盘,因此每个子扩展分区都可以有 1 个分区表。这样一来,各个分区表的长度依然固定为 4,但是允许有无限多个分区表,分区 表项多了,自然支持的分区数就多了。如何将这些分区表组织到一起呢?扩展分区表采用链式结构,将所有子扩展分区的分区表串在一起,形成可容纳无限个分区表的单向链表。链表是要有结点的,这里的每个分区表就是结点,一般的链表结点除了包括数据外,还必须要包括下一个结点的地址,分区表也采用了这种结构,其表项就分为两部分, 一部分是描述逻辑分区的信息,另一部分是描述下一个子扩展分区的地址。
要想使用分区,就离不开分区表,逻辑分区也是分区,为了使用它,也需要有元信息来描述它的范围、 边界、类型等信息,因此在子扩展分区中也要有分区表来描述这些逻辑分区。分区表本身也要在子扩展分区中占磁盘空间,因此实际情况是每个子扩展分区的空间并不是只有逻辑分区,在每个子扩展分区中最开始的扇区(此扇区称为 EBR 引导扇区,马上要介绍它)用于存储此子扩展分区中的分区表, 此扇区中的内容也是前 446 字节是引导程序,中间 64 字节是分区表,后 2 字节是 0x55 和 0xAA,您看, 它同 MBR 引导扇区的结构相同。紧随其后的是空闲的一部分扇区,其余剩下的大部分扇区才被用作存储数据的分区,即逻辑分区。
扩展分区被划分出多个子扩展分区,每个子扩展分区都有自己的分区表,所以子扩展分区在逻辑上相当于单独的硬盘,各分区表在各个子扩展分区最开始的扇区中,该扇区同 MBR 引导扇区结构相同,由于是经扩展分区划分出来的,所以它们称为 EBR,即扩展引导记录。MBR 只有 1 个, EBR 理论上有无限个, MBR 和 EBR 所在的扇区统称为引导扇区,它们的结构是相同的, MBR 中有的 EBR 中 也有。
每一个逻辑分区所在的子扩展分区都有一个与 MBR 结构相同的 EBR, EBR 中分区表的第一分区表项用来描述所包含的逻辑分区的元信息,第二分区表项用来描述下一个子扩展分区的地址,第三、四表项未用到。位于 EBR 中的分区表相当于链表中的结点,第一个分区表项存的是分区数据,第二个分区表项存的是后继分区的指针。
这两个分区表项都是指向一个分区的起始,起始地址都是个扇区地址,只不过第一个分区表项指向的是该逻辑分区最开始的扇区,此扇区称为操作系统引导扇区,即 OBR 引导扇区 。第二个分区表项指向下一个子扩展分区的 EBR 引导扇区。
同样结构的分区表项是如何存储不同类型分区数据的?如下分区表项结构:

活动分区标记是给 MBR 或其他需要移交 CPU 使用权的程序看 的,它们通过此位来判断该分区的引导扇区中是否有可执行的程序,也就是引导程序,这个引导程序通常是操作系统内核加载器,故此引导程序通常被称为操作系统引导记录,即 OBR (OS Boot Record)。 如果 MBR 发现该分区表项的活动分区标记为 0x80,这就表示该分区的引导扇区中有引导程序(这是 MBR 与 分区工具或操作系统约定好的), MBR 就将 CPU 使用权交给此引导程序, 如果此引导程序是操作系统或其加载器,此时操作系统便掌握了 CPU使用权,也就是大家平时所说的加载内核。这里一直说的“分区引导扇区”是位于分区最开始的扇区,是分区引导程序所在的扇区,由于此引导程序通常都是操作系统内核加载器,故此扇区被称为操作系统引导扇区,也就是 OBR 所在的扇区,即 OBR 引导扇区。注意啦, OBR 引导扇区并不是 EBR 或 MBR 引导扇区,它们虽然都包含引导程序,并且都以 0x55 和 0xAA结束,但它们最大的区别是分区表只包含在 MBR 和 EBR 中, OBR 中可没有分区表。 MBR 和 EBR 所在的扇区不属于分区范围之内,它们是由分区工具创建并管理的,因此不归操作系统管理,操作系统不可以随意往里面写数据,尽管操作系统有能力这样做。而 OBR 引导扇区是分区中最开始的扇区,归操作系统的文件系统管理, 因此操作系统通常往 OBR 引导扇区中添加内核加载器的代码,供 MBR 调用以实现操作系统自举,总之 OBR 引导扇区中绝不包括分区表。
重点关注“分区起始偏移扇区”和“分区容量扇区数”。 “分区起始偏移扇区”是个相对量,它表示各分区的起始扇区地址是相对于某“基准”的偏移扇区数,各分区的绝对扇区 LBA 地址=“基准”的绝对扇区起始 LBA 地址+各分区的起始偏移扇区,这个“基 准”是指分区所依赖的上层对象,或者说是创建该分区的父对象。
下图是一个典型的硬盘分区结构:


浙公网安备 33010602011771号