**写在前面:**本篇是在本系列之前文章《装系统不求人——硬盘的秘密》的基础上,对一些技术细节的补充。有利于对装系统过程中一些问题的理解,不看的话对学习装系统影响不大。难度略大,也难以举出一些通俗易懂的例子什么的,全靠个人理解力了,适合对计算机技术很感兴趣的读者看。
还要说明的是,这篇文章里面介绍的内容以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)
:
title 启动Win7PE精简网络版
map (hd0,0)/boot/imgs/win7pe.iso (hd32)
map --hook
chainloader (hd32)
boot
参考资料
- 百度百科、维基百科相关词条
- 计算机是如何启动的? - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2013/02/booting.html - Primary, Extended and Logical Partitions
http://www.pcguide.com/ref/hdd/file/structPartitions-c.html - PCGuide - Ref - Major Disk Structures and the Boot Process
http://www.pcguide.com/ref/hdd/file/struct_Active.htm - 两大伏笔四种方法 揭秘Win8分区安装
http://memory.zol.com.cn/331/3312763_all.html - 引导加载程序:GRUB
http://www.linuxidc.com/Linux/2013-09/90294.htm