硬盘分区

懒人版

遍历硬盘分区,分两种情况处理。

第一种,遍历主分区。

每个硬盘都有一个MBR。在MBR中,有一个分区表。分区表有四个表项。每个表项存储一个主分区的元数据,例如,分区的初始位置的LBA、分区的扇区数量。

遍历主分区,实际上就是遍历MBR中的分区表。

第二种,遍历主扩展分区。

主扩展分区也有一个结构和MBR相同的元数据区,名称是EBR。

EBR中也有一个分区表。这个分区表的前两个表项有用。第0个表项描述一个逻辑分区,第1个表项描述下一个子扩展分区。

每个子扩展分区也有一个EBR。通过EBR中的分区表,能找到下一个子扩展分区。

如果EBR中的分区表的第1个分区表项的system id是0,那么,包含这个EBR的分区是最后一个分区,不用再往下遍历了。

简单地说,获取一块硬盘,只需要遍历一个数组和一个链表。

就这么简单。

详细版

  1. 一块硬盘最多只能分为四个主分区。这是由硬盘的 MBR 中的 DPT 决定的。
  2. 硬盘的 DPT 只有 64 个字节。每个分区表项需要 16 个字节。因此,一个 DPT 最多只能容纳 4 个分区表项。
  3. 每个主分区都能作为扩展分区。但是,在四个主分区中,最多只能有一个主分区能作为扩展分区。
  4. 扩展分区分为主扩展分区和子扩展分区。
  5. 主分区充当扩展分区,就是主扩展分区。
  6. 从主扩展分区中分割出来的扩展分区,就是子扩展分区。
  7. 硬盘有一个 MBR,而扩展分区(主扩展分区和子扩展分区)有一个 EBR。
  8. MBR 和 EBR 的结构相同,差异在于:
    1. MBR 的 DPT 有四个表项,EBR 的 DPT 有二个表项。
    2. MBR 的 DDP 的四个表项存储的数据都是主分区的元数据。
    3. EBR 的 DPT 的两个表项存储的数据分别是:逻辑分区和下一个子扩展分区的元数据。
  9. 每个主扩展分区理论上能拥有无限个子扩展分区,但是,我规定,每个扩展分区只有 16 个子扩展分区。
    1. 无限多个子扩展分区,我没有看到必要性。
    2. 方法一样。我能计算 16 个子扩展分区的情况,就能计算出 32 个、64 个等子扩展分区的情况。
  10. 我只关注分区表项中的两个数据:
    1. 起始扇区的 LBA。
      1. 这个 LBA 并不是相对于硬盘的 LBA,而是相对于本分区表所在的分区的初始地址。
      2. 因此,分区的初始扇区相对于硬盘的 LBA 地址 = 本分区的初始扇区相对于硬盘的 LBA 地址 + 分区表项中的起始扇区的 LBA 地址。
      3. 如果我愿意,我也可以把本数据叫做分区(表项描述的分区)在本分区的扇区偏离量。
    2. 分区的扇区数目。
  11. 逻辑分区和子扩展分区 A 的关系
    1. 在子扩展分区中,最开始的数据是 EBR。
    2. 根据 EBR,我能找到逻辑分区,还能找到下一个字扩展分区 B。
    3. 我的疑问是:A 是否包含 B?
      1. 怎么回答这个问题?
      2. A 能不能包含 B?
      3. A 有没有包含 B?
        1. 从 EBR 的表项,我能计算出 A 的范围。
        2. 比较 B 在不在 A 的范围,就知道答案了。
    4. 主扩展分区包含所有子扩展分区和逻辑分区,这很好理解。
    5. 子扩展分区之间是前后关系还是包含关系,这需要验证。
    6. 子扩展分区只包含 EBR、逻辑分区,还是也包含了下一个子扩展分区,这也需要验证。
求道之人,不问寒暑。
原文地址:https://www.cnblogs.com/chuganghong/p/15053962.html