Linux学习笔记——硬盘逻辑结构
(版权所有,如需转载,请注明出处:http://www.cnblogs.com/rockyzhao/archive/2012/06/07/2541078.html)
盘片
硬盘有多个圆形磁盘组成,每个磁盘都有上下两个盘面,现在大多数硬盘的磁盘的两个面都会存储数据,这种存储数据的盘面又称为有效盘面。在下面的描述中,我们说盘面都是指有效盘面
磁头(Head)
磁头是用来读写盘面上的数据的,为了高速读写数据,磁头的质量都很小。它被固定在机械手上。每个盘面上都有且只有一个磁头,也就是说一般情况下每个磁盘上下各有一个磁头。
盘面号/磁头号
每个磁盘都有上下两个盘面,每个这样的盘面都有一个盘面号,按顺序从上到下从“0”开始依次编号。在硬盘系统中,盘面号又叫磁头号,因为每个盘面都有一个对应的磁头。
磁道(Track)
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在盘面上划出出一个圆形轨迹,这些轨迹就叫磁道。这样说只是为了更加形象而已,磁头并不是真 的在盘面上划出划痕,仅仅是在格式化硬盘的时候,磁头以特殊方式在盘面上磁化的些磁化区。相邻的磁头之间并不是相连的,这是因为太近的话磁性会相互产生影响,同时也为磁头读写定位带来困难。
盘面在靠近圆心的那部分区域是一个特殊区域,它是不存放数据的,称之为停止区或着陆区(Landing Zone),这个区域以外就是数据区。硬盘停止工作时磁头就在停止区,硬盘开始工作时磁头就会滑向数据区上方。
磁道的编号从外到里,从“0”开始依次排序,所以最外圈的就是0磁道。
柱面(Cylinder)
所有盘面上同一磁道构成一个圆柱,通常称为柱面。
数据的读写按柱面进行,而不是按盘面进行。也就是说磁头读写数据时首先在同一柱面的0磁头开始操作,依次向下在同一柱面的不同盘面即磁头上进行操作,只有在同一柱面的所有磁头全部读写完毕后磁头才转到下一个柱面,因为选取磁头(即上下切换盘面)通过电子切换即可,而选取柱面(即切换磁道或者说扇区)必须通过机械切换。
柱面是分区时的最小单位。
扇区(Sector)
盘面上的一个磁道被等分成若干个弧段,这些弧段就是扇区,磁头在读写数据时是以扇区为单位同时读写的。每个扇区可以存储128X2n个字节数据(n=0,1,2,3),一般情况下是n取2,也就是说一个扇区可以存储512个字节数据。可以存储512个字节并不表示每个扇区只占512个字节的存储空间,因为每个扇区还要记录扇区本身的一些信息和数据属性信息。总的来说一个扇区有两部分组成:ID段包括扇区三维地址的三个数字(柱面号、盘面号、扇区号),扇区能否正确存储数据的一个标识,一个可在原扇区出错时指引磁盘转到替换扇区或磁道的指示字,最后,ID段以循环冗余校验(CRC)值作为结束,以供控制器检验扇区ID段的读出情况,确保准确无误。
数据段包括:真正的数据和保护这些数据的纠错码(ECC)
另外扇区与扇区之间、扇区ID段与数据段之间都有间隔。
扇区的编号是从“1”开始的,并且每个磁道相互独立,也是说一个磁道有编号为1,2,3的扇区,另外一个磁道也有编号为1,2,3的扇区。其实扇区的编号或者说磁头读取扇区的顺序(因为你不可能在盘面上写上1,2,3……,给扇区编号就是为了读写的顺序)并不是按照扇区在磁道上的物理位置顺序编号的,因为如果顺序编号的话,当磁头读写完一个扇区后接着要读写下一个扇区的时候该扇区已经被转过了几个扇区的距离,如果要完成对这个扇区的读写就要等到下一圈了。所以就有了一个称之为交叉因子的概念,就是根据磁盘的转速来定义一个比例,这个比例标示同一磁道上每几个扇区中有一个目标扇区(这个表达有点蛋疼),这个比例就是交叉因子。举例来说:一个读取动作,如果交叉因子为3:1表示每三个连续扇区的第一个扇区为目标扇区,或者说每隔两个扇区就有一个目标扇区,这样磁头读完一个扇区后,正好(快)转到下一个目标扇区,当然这些数据在写入的时候也是这个交叉因子。
在众多的扇区中,我们要注意的是主引导扇区(MBS:Master Boot Sector),该扇区的CHS(Cylinder,Head,Sector)三维坐标是0磁头、0柱面、1扇区,该扇区并不参与分区,预留用于存放MBR。另外该扇区所在的整个磁道都会被预留,整个磁道都成为隐藏扇区。
主引导记录(MBR:Master Boot Record)
以上的逻辑结构都是由对硬盘的低级格式化产生的,这样的硬盘只能存字节数据,还要经过分区、高格(建立文件系统)才能存文件。
分区,说白了就是在逻辑上把硬盘切成几块,理论上来说你想怎么切就怎么切,如在CHS参数方式下,你完全可以把0面全部扇区当作一个区。但是硬盘最终是给操作系统使用的,如果你随意切,那你只有自己搞个操作系统来,所以要有一个标准来规定硬盘的切法,也就是分区的标准。我们常用的分区标准就是MBR分区标准。这个标准规定:
1.MBR所有数据都存放在三维坐标为(0柱面,0磁头,1扇区)的扇区中。所以很多时候MBR也代表主引导扇区的意思。
2.MBR包括三个部分:
引导程序最多可占MBS前446字节的空间,这里的引导程序就是引导软件的第一阶段代码,如LILO,GRUB;
硬盘分区表(DPT:Disk Partition Table)占据主引导扇区的64个字节(偏移01BEH--偏移01FDH),可以对四个分区的信息进行描述,其中每个分 区的信息占据16个字节,这也是为什么采用此种分区的硬盘最多只能有4个主分区的原因。具体每个字节的定义可以参见下表。如果某一分区在硬盘分区表的信息如下
80 01 01 00 0B FE BF FC 3F 00 00 00 7E 86 BB 00
则我们可以看到,最前面的"80"是一个分区的激活标志,表示系统可引导;"01 01 00"表示分区开始的磁头号为01,开始的扇区号为01,开始的柱面号为00;"0B"表示分区的系统类型是FAT32,其他比较常用的有 04(FAT16)、07(NTFS)、82(Linux)83(Linux Swap)05(扩展分区);"FE BF FC"表示分区结束的磁头号为254,分区结束的扇区号为63、分区结束的柱面号为764;"3F 00 00 00"表示首扇区的相对扇区号为63;"7E 86 BB 00"表示总扇区数为12289662。
其实,对于一个操作系统而言,系统分区设为活动分区并不是必须的,这主要视引导程序而定,如果使用的引导程序是GRUB4DOS,MBR中的引导代码仅仅按照分区的顺序依次探测第二阶段引导器grldr的位置,并运行第一个探测到的grldr文件。也就是这个标准位的作用就是方便第一阶段引导程序找到第二阶段引导程序的。
MBR有效标志55,AA(偏移1FEH——1FFH)是MBR的最后两个字节,是检验MBR是否有效的标志。
偏移 | 长度(字节) | 意义 |
00H | 1 |
分区状态 00:非活动分区 80:活动分区 其它数值没有意义 |
01H | 1 | 分区起始磁头编号,用到全部8位 |
02H | 2 |
分区起始扇区编号,占据02H的0——5位; 分区起始柱面编号,占据02H的6——7和03H的全部8位 |
04H | 文件系统标志位 | |
05H | 1 | 分区结束磁头编号,用到全部8位 |
06H | 2 |
分区结束扇区编号,占据06H的0——5位; 分区结束柱面编号,占据06H的6——7和07H的全部8位 |
08H | 4 | 分区起始相对扇区号 |
0CH | 4 | 分区总扇区数 |
3.主引导扇区的大小限制了分区表的大小,从而限制了主分区的数目(最多四个),为了解决多分区的问题,MBR标准引入了扩展分区的概念:扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。作为扩展分区的主分区只用在MBR相应的DPT条目中设置04H处的值为05,表示为扩展分区,该DPT条目指向扩张分区第一个逻辑分区的EBR。
每一个逻辑分区前面一个扇区里面都有一个和MBR结构类似的扩展引导记录(EBR),它也是占一个扇区,共512个字节最后也是55AA结束,之是它放引导加载程序的466个字节全是0。其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到,全部用0填充。这些扇区和MBS一样也是隐藏扇区。
主引导扇区内的信息可以通过任何一种基于某种操作系统的分区工具软件写入,但和某种操作系统没有特定的关系,即只要创建了有效的主引导记录就可以引导任意一种操作系统(操作系统是创建在高级格式化的硬盘分区之上,是和一定的文件系统相联系的)。
引导扇区(记录)
每个主分区和逻辑分区内都有一个引导扇区, 这与控制整个磁盘的主引导扇区(或记录)不同,但在概念上类似。它也有时被称为 volume boot record 或 partition boot sector。每个引导扇区包含以下内容:
Disk Parameter Block: 有时也叫 media parameter block, 这是一个数据表,其中包含有关分区的特定信息,例如其规格(大小,包含的扇区数等),分区标签名称和该分区的 block 大小。
Volume Boot Code:这是和使用该分区的操作系统对应的代码,用于启动操作系统的加载程序。该代码由存储在主引导记录中的主引导代码调用,但仅适用于设置为活动的主分区。对于其他分区,此代码没用。
引导扇区是对分区进行高格( high-level format)时创建的。引导扇区的代码在磁盘启动时直接执行,使其成为病毒作者最喜欢的目标。操作系统使用 Disk Parameter Block 中包含的信息来确定分区的其他数据的位置,例如 file allocation tables。
主引导扇区的读取流程
- 系统开机或者重启。
- BIOS 加电自检 ( Power On Self Test -- POST )。BIOS执行内存地址为 FFFF:0000H 处的跳转指令,跳转到固化在ROM中的自检程序处,对系统硬件(包括内存)进行检查。
- 读取主引导记录(MBR)。当BIOS检查到硬件正常并与 CMOS 中的设置相符后,按照 CMOS 中对启动设备的设置顺序检测可用的启动设备。BIOS将相应启动设备的第一个扇区(也就是MBR扇区)读入内存地址为0000:7C00H 处。
- 检查0000:7DFEH-0000:7DFFH(MBR的结束标志位)是否等于55AAH,若不等于则转去尝试其他启动设备,如果没有启动设备满足要求则显示"NO ROM BASIC"然后死机。
- 当检测到有启动设备满足要求后,BIOS将控制权交给相应启动设备。启动设备的MBR将自己复制到0000:0600H处, 然后继续执行。
- 根据MBR中的引导代码(LILO的第一阶段)启动引导加载程序(LILO的第二阶段)。