毫无疑问,大多数人都有过对硬盘分区的经验。一块刚买来的新硬盘,必须要经过分区之后才能使用。但是具体的分区信息在硬盘上是怎么存储的呢?分区后的硬盘上有一个重要的数据结构,叫做硬盘分区表。这个数据结构就是保存分区信息的地方。
一般来说,硬盘分区表的第一部分(主分区表)位于硬盘的第一个扇区(主引导记录)中。占据这个扇区的第 446-510 个字节。这是一个 4 个元素的数组,每一项代表硬盘上的一个分区。硬盘分区表项结构可以用下面的 C++ 结构表示
下面我们来解释一下这个结构中的各个字段
对于现在的硬盘, CHS 地址已经基本不用,所以我们可以不用理会那两个 CHS 地址的字段。剩下的 4 个字段中,两个 LBA 地址不用说大家也知道是什么意思。剩下的文件系统标志字节,表明了每个分区上的文件系统,比如对于 FAT16 分区来说,这个字节是 0x06
现在我们来解释一下分区的几总类型。第一种分区类型叫做主分区,也就是在硬盘 MBR 中的分区表中描述的普通分区。但是大家可以看到,主分区表中只能描述 4 个分区。也就是说一块硬盘上只能有 4 个分区。但是假如我们希望一块硬盘上有多余 4 个分区该如何操作呢?为了解决这个问题,人们定义了一种特殊的分区格式:扩展分区。如果一个分区表项的 fileSystem 字段为 0x05 或 0x0F ,那么这个分区表项就描述了一个扩展分区。一个扩展分区就相当于一块逻辑硬盘。在每个扩展分区的第一个扇区中也有一个分区表,格式和主分区表一样。里面可以定义 4 个分区。每个分区既可以是逻辑分区(可以建立文件系统的分区),也可以是嵌套的扩展分区。以这种方法,我们可以就在硬盘上划分任意多的分区了
下图是一个典型的硬盘分区结构
现在我们可以来看一下上次的主引导记录关于分区表的代码了,注意,这段代码暂时不支持扩展分区。
现在,读者应该可以看懂这段代码了