zoukankan      html  css  js  c++  java
  • 浅尝硬盘分区表

    【0】README

    0.1) text description from orange’s implemention of a os;
    0.2) there are a number of analysis and attention proves to be essence of this page, I think;
    0.3)Conclusion about hd partition table

    • C1)存在一个硬盘的情况下:

      • C1.1) 1~4这4个数字 为 主引导扇区 中的分区表项所用(主引导扇区分区表可以储存最多1个扩展分区 和 不大于4个 的主分区,总数量==4), 从5 开始依次表示逻辑分区;(主引导扇区是硬盘的第一个扇区,而其他引导扇区是各个分区的第一个扇区)
      • C1.2)主设备号告诉os 应该用哪个驱动程序来处理,次设备号告诉driver 这是具体哪个设备(分区);
    • C2)存在两块硬盘的情况:

      • C2.1)主盘是hd0,次设备号是0,它的主引导扇区分区表对应的四个分区分别是 hd1、hd2、hd3、hd4;
      • C2.2)每个扩展分区中最多有16 个逻辑分区,逻辑分区的次设备号以hd1a 为基准递增的;
      • C2.3)这种编号的好处是, 给定一个次设备号可以很容易计算出它是主分区还是扩展分区,或者是哪个扩展分区的哪个逻辑分区;
    • C3)百度总结:

      • C3.1) 一个硬盘主分区至少有1个,最多4个,扩展分区可以没有,最多1个。且主分区+扩展分区总共不能超过4个。逻辑分区可以有若干个;
      • C3.2) MBR(主引导记录)的分区表(主分区表)只能存放4个分区,如果要分更多的分区的话就要一个扩展分区表(EBR),扩展分区表放在一个系统ID为0x05的主分区上,这个主分区就是扩展分区,扩展分区能可以分若干个分区,每个分区都是个逻辑分区;

    【1】intro to hard disk partioning tab

    • 1.1) 硬盘分区表其实就是一个数据结构,数组的每个成员是一个 16字节的结构体;这个结构体数组位于引导扇区的1BEh处,共有四个成员——因为IBM 当时觉得一台PC最多会装四个os;
    • 1.2) 现在我们的计算机中 每块硬盘经常划分为不止四个分区, 这是因为 每个主分区可以进一步分成多个逻辑分区;
      这里写图片描述

    • 1.3) 对硬盘进行分区操作,如何创建虚拟硬盘,参见http://blog.csdn.net/PacosonSWJTU/article/details/48846887
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述

    如上图所示,我们把一个80M 的硬盘映像分成了一个主分区和一个扩展分区,然后扩展分区又分成了 五个逻辑分区;我们的orange’s os 安装在 第一个逻辑分区上(标有 ‘*’ 号);


    【2】我们实际看一下分区表是什么样子,用二进制查看器看一下引导扇区:

    这里写图片描述

    • Alert):

      • A1)要知道,分区表就是个结构体数组, 共有四个成员,每个成员16个字节,那分区表结构体数组共占64字节,也即是除外引导扇区标志 0xAA55 后 的 最后64字节了;
      • A2)这个分区表结构体数组 存在于 引导扇区中除开 0xAA55 后的最后64个字节;
        这里写图片描述
        这里写图片描述

        第一个分区:00 ,01 ,01 ,00 ,83 ,0F ,3F ,13  ,3F 00 00 00 ,81 4E 00 00
        第二个分区:00 ,00 ,01 ,14 ,05 ,0F ,3F ,A1 ,C0 4E 00 00 ,20 2F 02 00
        

        这里写图片描述


    【3】利用引导扇区中记录的扩展分区的起始字节(0x4EC0 * 512 = 0x9D8000),我们来查看扩展分区的信息:

    Attention):扩展分区的起始字节,也即是扩展分区的第一个逻辑分区的起始字节;
    这里写图片描述

    第一个分区:80 ,01 ,01 ,14 ,99 ,0F ,3F ,3B  ,3F 00 00 00 ,41 9D 00 00
    第二个分区:00 ,00 ,01 ,3C ,05 ,0F ,3F ,59 ,80 9D 00 00 ,20 76 00 00
    

    这里写图片描述

    3.1)对上表的分析-Analysis:

    • A1)当前扩展分区的第一个分区的起始扇区LBA 是0x3F,这个是相对于扩展分区基地址的LBA,它的真正LBA 是 4EC0h + 3Fh = 4EFFh;
    • A2)当前扩展分区的第二个分区的分区类型是 0x05,可知它又是一个扩展分区,起始扇区LBA 为 4EC0h + 9D80h = EC40h,字节偏移为 EC40h * 512 = 1D88000h,我们转到该起始字节;

    3.2)利用上述扩展分区的第一个逻辑分区的分区表数据结构 记录的嵌套扩展分区的起始字节(EC40h * 512 = 1D88000h),我们来查看嵌套扩展分区的信息:
    (因为,扩展分区中的第一个逻辑分区的分区表记录着 另一个扩展分区的起始扇区,所以我们把这种扩展分区 叫做 嵌套扩展分区)
    这里写图片描述

    第一个分区:00 ,01 ,01 ,3C ,83  ,0F ,3F ,59 ,3F 00 00 00 ,E1 75 00 00
    第二个分区:00 ,00 ,01 ,5A ,05 ,0F ,3F ,83 ,A0 13 01 00 ,60 A5 00 00
    

    这里写图片描述

    3.3)对上表的分析-Analysis:

    • A1)从分区类型值可以看出(0x05),在这个分区中, 又包含了一个普通分区和一个扩展分区,你可能一下子明白了,多个逻辑分区是由嵌套来实现的;
    • A2)一个扩展分区包含一个普通分区的同时, 又可以嵌套一个扩展分区;
    • A3)当前扩展分区的第一个分区的起始扇区LBA 是0x3F,这个是相对于扩展分区基地址的LBA,它的真正LBA 是 EC40h + 3Fh = EC7Fh;
    • A4)当前扩展分区的第二个分区的分区类型是 0x05,可知它又是一个扩展分区,起始扇区LBA 为 4EC0h + 0x113A0h = 16260h,字节偏移为 16260h * 51与2 = 2C4C000h,我们转到该起始字节;

    Attention)为什么 第一个分区的 起始扇区LBA 最后要加上 EC40h, 而第二个分区的 起始扇区LBA 最后要加上 4EC0h 呢?

    • A1)这里需要留意一点, 前一个表项(当前扩展分区的第一个分区)中的 起始扇区LBA 是相对于当前扩展分区的,而后一个表项(当前扩展分区的第二个分区)中的起始扇区——也就是下一个扩展分区的起始扇区——是相对于硬盘主引导扇区所指明的扩展分区的起始扇区的;
    • A2)很显然,当前扩展分区的第一个分区(前一个表项)的起始扇区LBA是相对于 当前扩展分区,而当前扩展分区的基扇区号为 EC40,当然其要 加上 EC40了;
    • A3)还有,当前扩展分区的第二个分区(后一个表项)的起始扇区LBA是相对于 硬盘主引导扇区所指明的扩展分区的起始扇区而不是 当前扩展分区基扇区号,而引导扇区记录的扩展分区起始扇区为 4EC0,当然其要 加上 4EC0了(表a所示);
    • A4)还有一个重要问题就是,为什么第二个分区表示的是扩展分区,因为我们通过它的分区类型 为 0x05,看出来的;
    • A5)就这样,扩展分区的分区表信息就像一个链表一样,我们可以一步一步地遍历所有分区;

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    编译原理词/语法分析
    【转】 c# 中为何load事件中不能画图
    [原创]GAMITGLOBK数据处理报告
    Google Earth上的点标记
    序贯平差
    【原创】C#写的水准网平差程序
    楼梯问题:一次最多跨两个阶梯,有多少种走法
    springMVC + Dubbo + zooKeeper超详细 步骤
    Git(to be continued...)
    autoconf & automake
  • 原文地址:https://www.cnblogs.com/pacoson/p/4893144.html
Copyright © 2011-2022 走看看