浅尝硬盘分区表

【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)就这样,扩展分区的分区表信息就像一个链表一样,我们可以一步一步地遍历所有分区;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值