装系统不求人——硬盘的秘密深入

**写在前面:**本篇是在本系列之前文章《装系统不求人——硬盘的秘密》的基础上,对一些技术细节的补充。有利于对装系统过程中一些问题的理解,不看的话对学习装系统影响不大。难度略大,也难以举出一些通俗易懂的例子什么的,全靠个人理解力了,适合对计算机技术很感兴趣的读者看

还要说明的是,这篇文章里面介绍的内容以MBR硬盘为主,部分内容适用于GPT硬盘。GPT硬盘目前还没有完全普及,资料较少,也没有去做详细研究。

磁道、柱面、磁头、扇区、CHS寻址

下图分别是整个硬盘和单个硬盘盘片简单的示意图,盘片被分为一圈一圈用于保存数据。

  • 每一圈的轨迹,称为磁道(Track)
  • 多个盘片重叠起来,直径相同的一组磁道组成圆柱形,称为柱面(Cylinder)
  • 盘片可以是单面,也可以是双面的,在每个可用盘面,都有一个用于数据读写的磁头(Head)
  • 磁道按照一定的弧度被分割成一个一个的扇形区域,称为扇区(Sector)

硬盘的读写以扇区为基本单位,为了确定扇区位置,可以使用CHS寻址方式来表示,即柱面(C)、磁头(H)、扇区(S)序号。

ZBR(区位记录)

ZBR = Zoned-bit Recording,区位记录

在前面的示意图中,每个磁道包含的扇区数相同,因此外圈的扇区弧长远比内圈大,好处是硬盘的控制技术实现容易,坏处是没有充分利用存储空间。于是就有了ZBR技术,将硬盘从内到外分成多个区,同一个区每个磁道有相同数目的扇区,但靠外的区包含的扇区要比靠内的区多。示意图如下。

对于现代磁盘,CHS方式已经不能满足需要,常使用LBA模式来进行寻址。具体可自行学习。

详细解释MBR

典型的扇区容量为512字节。MBR格式硬盘的第一个扇区,称为主引导扇区。在这512字节中,保存了这些内容:

  • 446字节的主引导程序。准确说来,主引导记录MBR指的是就这里446B的主引导程序。
  • 64字节的分区表,分为四条,每条16字节,分别记录一个主分区或扩展分区,这就是主/扩展分区总量不能超过4个的根本原因。
  • 由于每条分区记录只有16字节,并按照一定的格式保存信息,长度限制使得MBR只能支持2TB硬盘分区。
  • 2字节的分区有效标志,即十六进制的0x55AA。它是硬盘被正确识别的前提,通过修改这个标志位,可以让硬盘无法被常规软件识别,从而实现硬盘加密。

习惯性的也用MBR指代整个主引导扇区(即广义的理解)。主引导扇区示意图如下:

用DiskGenius软件打开硬盘,选择扇区编辑,就能看到主引导扇区了。而在地址为0x1FE的地方,就是硬盘分区的有效标志55AA了,如图右下角。

在BIOS设置中,我们已经说了系统开机的过程:BIOS --> BootLoader --> 操作系统。对于MBR格式的硬盘来说,MBR本身就保存了BootLoader,例如我们可以将grub安装到MBR中。

由于MBR空间较小,实际上grub只是部分被安装进去,另外一部分grub则会在MBR执行完成后,被加载到内存中继续运行,之后再由BootLoader启动操作系统。

GPT

根据网上的资料,简单解释下GPT的实质。

  • 在MBR硬盘中,分区表直接保存在第一个扇区即MBR中。

  • 在GPT硬盘中,为了兼容性,第一扇区仍然保留给MBR,称为保护MBR

  • 在GPT硬盘中,保护MBR之后是GPT头,保存了分区表等硬盘信息。

  • 不支持GPT的软件,会将GPT硬盘视为MBR类型,从保护MBR读取信息,只能识别出一个未知类型的分区,从而不会误操作GPT分区(所以起到了保护作用)。

    除非删除整个硬盘的分区,然后重新建MBR分区(这时整个硬盘的GPT头和其后的GPT分区都会被破坏掉,硬盘又变成了MBR类型)。

PBR / DBR / OBR

  • PBR = Partition Boot Record,分区引导记录
  • DBR = DOS Boot Record,DOS引导记录
  • OBR = OS Boot Record,系统引导记录

在Windows系统中,每个主分区或逻辑分区的第一个扇区,存放了PBR,这个记录在格式化时就被写入到分区。

活动分区的PBR又被称为DBR,改名为OBR更准确。原因是,DBR特指DOS引导记录,OBR表示系统引导记录,包含了Windows。

DOS是比较早的操作系统,之后才有了图形化的Windows系统。

OBR的作用是加载该分区的操作系统内核或BootLoader:

  • 对于DOS / Win 9x,加载的是IO.SYS文件
  • 对于Win 2000 / XP / 2003,加载的是NTLDR
  • 对于Win Vista / 2008 / 7 / 8,加载的是BootMgr
  • 对于安装了Grub的分区,加载的是grldr

注意区别,主引导记录MBR保存在整个硬盘的第一个扇区,而PBR保存在每个分区的第一个扇区。

  • PBR在分区格式化时会被写到磁盘上,可以通过fixboot命令修复
  • 和主引导记录MBR一样,PBR最后两个字节也是0x55AA标志
  • 开机提示"Error loading operating system",表明读取OBR出错
  • 开机提示"Missing operating system",是因为OBR末尾没有标志位0x55AA

下图是我的硬盘活动分区中的OBR信息:


EBR与逻辑分区

EBR = Extended Boot Record,扩展分区引导记录

EBR是和MBR相对应的概念。主引导扇区的分区表DPT中只有四项,因此主/扩展分区最多只能有四个。扩展分区只能有一个、逻辑分区最大数量限制,都是受到操作系统的限制。

主/扩展分区的分区表,保存在硬盘的主引导扇区的DPT中;而逻辑分区的分区信息是链式的。

每个逻辑分区前都有一个扇区,格式类似主引导扇区,称为扩展引导记录EBR。其分区表的第一项指向该逻辑分区本身的引导扇区PBR,第二项指向下一个逻辑分区前面的EBR,第三、第四项没有用到。

下图是我的硬盘中的第一个EBR,可以看出前面446字节对应主引导扇区中MBR的区域均为空,而后面64字节的分区表只用了前两项,结束符为0x55AA。

完整硬盘结构图

Windows下完整的硬盘结构图如下。

完整的Windows启动过程

根据前面的介绍,最后完整的Windows启动过程通常如下:

  • BIOS(基本输入输出系统)
  • MBR(主引导记录)
  • DPT(分区表)
  • OBR(系统引导记录,即活动分区的PBR)
  • BootLoader(启动器,如NTLDR、BootMgr)
  • 操作系统

分区编号补充

Linux系统中,实际的硬盘分区通过分区编号访问。但是在进入Linux系统读写文件的时候,各种存储设备以及硬盘分区,常会被挂载到根目录下的特定目录,从而进行访问。例如基于Linux的安卓手机SD卡,其路径通常是"/mnt/sdcard/",而不是Windows中的盘符。

由于Grub4dos最初来源于Linux,它的配置文件menu.lst中的路径就是按照设备名、设备编号和分区编号来写的。

例如下面代码中的(hd0,0)

  1. title 启动Win7PE精简网络版
  2. map (hd0,0)/boot/imgs/win7pe.iso (hd32)
  3. map --hook
  4. chainloader (hd32)
  5. boot

参考资料