硬盘物理结构
先看下硬盘物理结构
硬盘物理上主要是盘片、机械手臂、磁头、和主轴等组成。在盘片逻辑划分上又分为磁道、扇区,例如下图:
磁道:
当硬盘盘片旋转时,磁头若保持在一个位置上,则磁头会在盘片表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。以盘片中心为圆心,由此可以划分出很多磁道来, 这些磁道用肉眼是根本看不到的,因为它们仅 是盘面上以特殊方式磁化了的一些磁化区,硬盘上的信息便是沿着这样的轨道存放的,盘片上的磁道 由外向内 依次从 “0” 开始进行编号。
柱面:
由于硬盘可以由很多盘片组成,不同盘片的相同磁道就组成了柱面 (cylinder) ,如图 1 所示。
磁头:
假设有 N 个盘片组成的硬盘,那么有 2N 个盘面 ( 一个盘片有 2 面 ) ,那么磁头也就有 2N 个,即每个盘面有一个磁头。
扇区 :
早期的硬盘盘片的盘面以圆心开始向外放射状将磁道分割成等分的弧段,这些弧段便是硬盘的扇区 ( 如图 2) 。每个扇区一般规定大小为 512byte ,这里大家应该比较疑惑,外圈周长很明显比内圈要长,怎么可能每个扇区都是 512byte? 其实答案早期硬盘外圈存储比内圈存储密度低一些,所以外圈很长但是仍然只能存储 512byte ,因此如果我们知道了柱面数 ( 磁道数 ) Cylinders 、磁头数 Heads 、扇区数 Sectors ,基本上硬盘的容量我们能够计算出来 硬盘总容量 = Cylinders * Heads * Sectors * 512byte 。 但是由于早期硬盘外圈密度低,导致盘片利用率不高,现在的硬盘盘片则采用内外存储密度一致的方式,每个磁道都划分成以 512byte 大小的弧段,这样也造成了内外磁道上扇区数量会不一样,外圈上的扇区数要多于内圈扇区数。
硬盘寻址方式
硬盘存取、读取数据,首先要做的就是寻址,即定位到数据所在的物理地址,在硬盘上就要找到对应的柱面、磁头以及对应的扇区,那么怎么寻址呢? 有两种方式: CHS 和 LBA
CHS 模式:
CHS ( Cylinder/Head/Sector )寻址模式也称为 3D 模式,是硬盘最早采用的寻址模式,它是在硬盘容量较小的前提下产生的。
硬盘的 C/H/S 3D 参数既可以计算出硬盘的容量,也可以确定数据所在的具体位置。这是因为扇区的三维物理地址与硬盘上的物理扇区一一对应,即三维物理地址可完全确定硬盘上的物理扇区。三维物理地址通常以 C/H/S 的次序来书写,如 C/H/S 为 0/1/1 ,则第一个数字 0 指 0 柱面,第二个数字 1 指 1 磁头(盘面),第三个数字 1 指 1 扇区,表示该数据位于硬盘 1 盘面上的 0 磁道 1 扇区。现在定位已完成,硬盘内部的参数和主板 BIOS 之间进行协议,正确发出寻址信号,从而正确定位数据位置。
早期硬盘一个磁道上分 63 个扇区,物理磁头最多 16 个( 8 个盘片,盘片多了硬盘那就真要加厚了)。采用 8 位寻址方式, 8 位二进制位的最大值是 256 ( 0-255 ),可以表示磁头数,而扇区只有 63 个( 1-63 ),只需要其中 6 个二进制位即可表示,剩下 2 位拿去表示柱面,柱面数用 10(8+2) 位来表达,达到 1024 个柱面( 0-1023 ),因此总扇区数( 1024×16×63 )。前面说一个扇区大小为 512byte ,这也就是说,如果以 C/H/S 寻址模式寻址,则 IDE 硬盘的最大容量只能为 1024×16×63×512B= 500MB 左右。
可以思考下,在 8 位寻址模式下,其实可以寻址的硬盘最大容量为 1024×256×63×512B =8G, 那为啥 CHS 模式硬盘只支持到 500MB 呢?原因很简单,我们的硬盘盘片不可能让 128 片盘片重叠起来吧,那会是多厚??如果采用 28 位寻址方式,那么可以寻址 137G ,盘片也不可能一直堆叠下去。
LBA(Logical Block Addressing)
经常去买硬盘的人都知道,目前硬盘经常都说单碟、双碟,其实意思就是说硬盘盘片只有 1 个或者 2 个,而且都只是用一面,单碟一个磁头而已,但是硬盘容量确是几百 G ,而且硬盘柱面往往都大于 1024 个柱面, CHS 是无法寻址利用完这些硬盘容量的。
另外由于老硬盘的扇区划分方式对硬盘利用率不高,因此出现了现在的等密度盘,外圈的扇区数要比内圈多,原来的 3D 寻址方式也就不能适应这种方式,因此也就出现了新的寻址方式 LBA ,这是以扇区为单位进行的线性寻址方式,即从最外圈柱面 0 开始,依次将扇区号编为 0 、 1…. 等等,举个例子,假设硬盘有 1024 个柱面,由于是等密度硬盘,柱面 0( 最外圈 ) 假设有 128 个扇区,依次编号为 0-127 ,柱面 1 有 120 个扇区,则依次编号为 127-246 , ….. 依次最内圈柱面 127 只有扇区 64 个,则编号到最后。因此要定位到硬盘某个位置,只需要给出 LBA 数即可,这个就是逻辑数。
在 LBA 模式下,为了保留原来 CHS 时的概念,也可以设置柱面、磁头、扇区等参数,但是他们并不是实际硬盘的物理参数,只是为了计算方便而出的一个概念, 1023 之前的柱面号都一一物理对应,而 1023 以后的所有柱面号都记录成 1023 磁头最大数可以设置为 255 ,而扇区数一般是每磁道 63 个, 硬盘 控制器会把由柱面、磁头、扇区等参数确定的地址转换为 LBA 数。这里我们再此明确两个概念:
物理扇区号:
一般我们称 CHS 模式下的扇区号为物理扇区号,扇区编号开始位置是 1
逻辑扇区号:
LBA 下的编号,扇区编号是从 0 开始。
CHS 模式转换到逻辑扇区号 LBA
计算公式
LBA( 逻辑扇区号 )= 磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 – 1
例如: CHS=0/0/1 ,则根据公式 LBA=255 × 63 × 0 + 63 × 0 + 1 – 1= 0
也就是说物理 0 柱面 0 磁头 1 扇区,是逻辑 0 扇区。
硬盘分区
我们知道,一般使用硬盘,我们首先会对硬盘进行分区,然后对分区使用某个文件系统格式 (NTFS 、 FAT 、 ext2/ext3) 进行分区格式化,然后才能正常使用。那么分区是怎么回事呢?我们常见的 windows 中说到的 c 、 d 、 e 盘是怎么划分出来的呢?其实,在装 windows 系统过程中,一般我们只需要填写每个分区的大小,看不出来分区过程的实际工作情况,我们可以从 linux 系统分区过程反而能反应底层实际分区情况。
柱面是分区的最小单位,即分区是以某个某个柱面号开始到某个柱面号结束的。
如图,柱面 1~200 我们可以分为一个区,柱面 201~500 再划分为一个区, 501~1000 再划分为一个区,以此类推。大家可以看到,柱面 0 没有在任何分区里面,为何?这里说说,前面说到硬盘从外圈 ( 柱面 0) 到内圈扇区是依次编号,看似各个扇区没有什么区别,但是这里硬盘的柱面 0 的第一个扇区 ( 逻辑扇区 0 , CHS 表示应该是 0/0/1) 却是最重要的,因为硬盘的第一个扇区记录了整个硬盘的重要信息,第一个扇区 (512 个字节 ) 主要记录了两部分:
① MBR(Master Boot Record) :主引导程序就放在这里,主引导程序是引导操作系统的一个程序,但是这部分只占 446 字节。
② DPT(Disk Partition table) :硬盘分区表也在这里,分区表就是用来记录硬盘的分区情况的,例如 c 盘是 1~200 柱面, d 盘是 201~500 柱面,分区表总共只占 64 字节,可以看出,分区其实很简单,就是在这个表里面修改一下记录就重新分区了,但是由于只有 64 字节,而一条记录就要占用 16 字节,这个分区表最多只能记录 4 个分区信息,为了继续分出更多分区来,引入了扩展分区的概念,也就是说,在这 4 个分区中,可以使用其中一条记录来记录扩展分区的信息,然后在扩展分区中再继续划分逻辑分区,而逻辑分区的分区记录则记录在扩展分区的第一个扇区中,如此则可以像链表一样划分出很多分区来。但是请注意,一个分区表中可以有 1~4 条主分区,但是最多只能有 1 个扩展分区。
举例,主分区可以是 P1:1~200 ,扩展分区 P2: 2~1400 ,扩展分区开始的第一个扇区可以用来记录扩展分区中划分出来的逻辑分区。
分区表链
分区表之间是如何关联的,详细讲一下,分区表是一个单向链表,第一个分区表,也就是位于硬盘第一个扇区中的 DPT ,可以有一项记录扩展分区的起始位置柱面,类似于指针的概念,指向扩展分区 ( 图 3) ,根据这项记录我们可以找到扩展分区的某柱面 0 磁头 1 扇区 (CHS) ,而这个扇区中又存放了第二个分区表,第二个分区表第一项记录一般表述了当前所在的逻辑分区的起始 / 终止柱面,第二项记录表述了下一个逻辑分区所在的 0 磁头 1 扇区 (CHS), 第三、第四项记录不存任何信息 ( 图 4) 。
请看下图,主引导记录 / 分区表所在的是硬盘第一个分区,基本分区 1 、基本分 2 、基本分区 3 都是主分区、扩展分区内有 2 个逻辑分区,每个逻辑分区的第一个扇区都是分区表,至于引导扇区 (DBR) ,在系统启动一节中会提及。
系统启动:
之前提到 MBR 中安装的引导加载程序,他的作用是什么?
① 提供开机菜单选项:可以供用户选择启动哪个操作系统,这是多重引导功能。
② 加载操作系统内核:每个操作系统都有自己的内核,需要引导程序来加载
③ 转交给其他引导程序:可以将工作移交给其他引导程序来进行上述操作。
其实引导加载程序除了可以安装在 MBR 中,还可以直接安装在每个分区的引导扇区 (DBR) 中,注意下,每个分区 ( 主分区、逻辑分区 ) 都有一个自己的启动扇区,专门用来安装引导加载程序,如上图标 3 结构图。
系统启动过程:
① 首先 ,BIOS 启动后,读取硬盘第一个扇区 MBR 中的引导加载程序 ( 可能是 windows 或者 linux 的 grub)
② MBR 中的引导程序提供开机菜单,你可以选择 1) 直接加载 windows 内核 2) 将工作转交给 windows 分区内的引导扇区中的加载程序,让他自己去加载内核 3) 转交给 linux 分区内引导扇区,让他去加载 linux.
③ 根据用户选择的选项和引导加载程序中记录的分区,到分区表找对应的分区柱面号等分区信息,启动内核或者分区加载程序。
Window 安装时默认会自动将 MBR 和 windows 所在分区的引导扇区都装上引导程序,而不会提供任何选项给用户选择,因此如果之前装过其他操作系统,然后再另外装一个 windows 时,会把公用的 MBR 覆盖掉,如此,原来的操作系统就无法启动了。如果先装 windows ,然后装 linux , linux 会覆盖 MBR ,然后让用户选择是否将 windows 等其他操作系统的启动项添加进来,如果你选择了添加进来,那么你在开机时就会有两个选项让用户进行选择了。
后记
l 这里讨论的全部是硬盘相关的东西,光盘不在此列,而且光盘的磁道并不是从外圈到内圈编号,而是从内圈开始编号,这点注意。
l 硬盘第一个扇区是由 MBR 和分区表占据,因此 0 柱面 0 磁头上剩下的 62 个扇区一般会空出来保留(这部分保留称为隐藏扇区,因为操作系统读取不到这部分扇区,这部分扇区是提供给 BIOS 读取的),而系统分区则从 0 柱面 1 磁头 1 扇区开始,折算成 LBA=255 × 63 × 0 + 63 × 1 + 1 – 1= 63 ,即从 LBA 63 号扇区开始分区。不过查阅有的资料提及到另外一种说法,那就是有的硬盘可能 0 柱面全部空下来,如果真是这样,那浪费可就真的大了。
l 对于扩展分区的分区表我们知道也是由扩展分区的第一个扇区开始写,而且是写到每个逻辑驱动器的第一个扇区,同样,扩展分区内的第一个扇区所在的磁道剩余的扇区也会全部空余出来,这些保留的扇区操作系统也是无法读取的,注意在扩展分区的第一个扇区里面是没有引导加载记录的。引导加载记录都是放在隐藏扇区后面的。可以看图 3 ,图 4