• 硬盘分区


    懒人版

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

    第一种,遍历主分区。

    每个硬盘都有一个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、逻辑分区,还是也包含了下一个子扩展分区,这也需要验证。
    求道之人,不问寒暑。
  • 相关阅读:
    Linux学习——在虚拟机上的Linux进行磁盘分区
    Linux命令学习3——用户管理
    linux 命令学习2
    linux 命令学习1——tr命令
    基于netty的一个简单的时间服务器的实现(netty学习)
    JavaNIO
    JavaNIO中的内存映射io
    打造高效的工作环境 – SHELL 篇
    linux下怎么清理缓存
    清理系统缓存
  • 原文地址:https://www.cnblogs.com/chuganghong/p/15053962.html
Copyright © 2020-2023  润新知