磁盘详细讲解

磁盘的结构图:
磁盘详细讲解_第1张图片
image.png

磁头:磁盘一般都有上下两个面,每一个面上都对应一个磁头。
磁道:读写硬盘时,磁头依靠磁盘的高速旋转引起的空气动力效应悬浮在盘面上,与盘面的距离不到1微米(约为头发直径的百分之一)。由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。我们称这样的圆周为一个磁道(Track)。磁道的排序是最外圈是0,然后由外往内依次0,1,2,3....
柱面:不同盘片的相同编号的磁道构成的圆柱面就被称之为柱面,磁盘的柱面数与一个盘面上的磁道数是相等的
扇区:每个磁道都别切分成很多扇形区域,每个磁道的扇区数量相同,每个扇区大小为512字节。扇区在磁道上并不是按规律排列的,因为如果规律排列1扇区后面是2扇区的话,就会出现一个问题,由于磁面是高速旋转的,会出现来不及读取就转过去的情况,所以扇区的排列规律是根据磁面的旋转速度交叉排列的,比如1扇区后面是5扇区,2扇区在5扇区后面的。

磁盘的定位是根据磁头,柱面以及扇区来定位的,而存储的方式也是先扇区,再磁头,最后柱面。这就说起磁盘磁道,磁头的路径转换了。下面是路径转换的方式:
由于磁面是高速运转的,如果想要变换磁道,需要磁面旋转的速度改变,属于机械操作
而磁头只需要电子信号改变,就可以改变磁头,属于电子操作
机械操作理所当然的没有电子操作迅速,所以如果要读完一个磁道上所有扇区,立马转换磁道,这样接着读取下一个磁道,一个磁面读取完了,换下一个磁面,这样明显没有读完一个磁道上的所有扇区,转换磁头读同一个柱面上磁道上的扇区速度快,所以才会出现先磁道上扇区,再磁头,最后柱面的情况。

扇区上的数据讲解:
扇区上512字节都有些什么数据呢?扇区的第一个主要部分是标识符。标识符,就是扇区头标,包括组成扇区三维地址的三个数字:扇区所在的磁头(或盘面)、磁道(或柱面号)以及扇区在磁道上的位置即扇区号。头标中还包括一个字段,其中有显示扇区是否能可靠存储数据,或者是否已发现某个故障因而不宜使用的标记。有些硬盘控制器在扇区头标中还记录有指示字,可在原扇区出错时指引磁盘转到替换扇区或磁道。最后,扇区头标以循环冗余校验(CRC)值作为结束,以供控制器检验扇区头标的读出情况,确保准确无误。扇区的第二个主要部分是存储数据的数据段,可分为数据和保护数据的纠错码(ECC)。在初始准备期间,计算机用512个虚拟信息字节(实际数据的存放地)和与这些虚拟信息字节相应的ECC数字填入这个部分。

MBR引导:

1、引导代码

上图中黄色框内的部分即为引导程序,占扇区前446字节。计算机在上电完成BIOS自检后,会将该主引导扇区加载到内存中并执行前面446字节的引导程序,引导程序首先会在分区表中查找活动分区,若存在活动分区,则根据活动分区的偏移量找到该活动分区上的引导扇区的地址,并将该引导扇区加载到内存中,同时检查该引导扇区的有效性,然后根据该引导扇区的规则去引导操作系统。在一些非启动磁盘上,MBR引导代码可能都是0,这对磁盘使用没有任何影响。

2、分区表

上图中蓝色框内的部分即为分区表,占扇区中间64字节。分区表是磁盘管理最重要的部分,通过分区表信息来定位各个分区,访问用户数据。分区表包含4个分区项,每一个分区项通过位置偏移、分区大小来唯一确定一个主分区或者扩展分区。每个分区项占16字节,包括引导标识、起始和结束位置的CHS参数、分区类型、开始扇区、分区大小等,具体描述如下表所示:


磁盘详细讲解_第2张图片
image.png

解释一下这个值:0x代表的是16进制,剩下2位是第一位前4个bit,后一位4个bit,因为毕竟2^4=16,4Byte类似。
分区项的第1个字节表示该分区是否是活动分区,即是否包含系统引导扇区,用来引导操作系统。每个磁盘只能同时有一个活动分区,活动分区的引导指示符是0x80,其他均为0x00;尽管我们可以通过一些工具来手动修改引导指示符,但是引导程序只会查找并使用第一个引导指示符为0x80的活动分区。
结束标志
上图中最后的"55 AA"即为结束标志,或者称魔数,占扇区最后2字节。每次执行系统引导代码时都会检查MBR主引导扇区最后2字节是否是"55 AA",若是,则继续执行后续的程序,否则,则认为这是一个无效的MBR引导扇区,停止引导系统。

下面我们来说明一下为什么mrt引导只能引导小于2TB,因为我们可以看到上图中对于扇区总个数的说明。

image.png

因为分区表中扇区个数为2 32个,然后一个扇区512Byte,然后计算232*512/1024^3=2TB,计算机读取分区大小的时候只能读取2TB
我的疑惑:
不是已经确定了起始扇区位置和终止扇区位置了,为什么不能通过两者直接计算呢?
还有为什么要多一个相对扇区数呢,不是已经有起始扇区位置了吗?
第一个问题的解答,首先扇区是交叉排列的,根本不可能通过起始扇区和终止扇区之差来判断扇区个数,然后我又想到能不能在读取的过程中计数呢,就是从头到尾读取完然后每过一个扇区+1,我又想到这根本不可能,因为这是启动阶段,引导代码是来检测分区表,并不可能出现挨个读取判断,这也太耗费时间了。
第二个问题不懂

你可能感兴趣的:(磁盘详细讲解)