首先简单认识一下硬盘的物理结构,硬盘内部的物理结构很复杂,只能从大的颗粒度去看内部的结构
总体来说,硬盘结构包括:盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份。所有的盘片(一般硬盘里有多个盘片,盘片之间平行)都固定在一个主轴上。在每个盘片的存储面上都有一个磁头,磁头与盘片之间的距离很小(所以剧烈震动容易损坏),磁头连在一个磁头控制器上,统一控制各个磁头的运动。磁头沿盘片的半径方向动作,而盘片则按照指定方向高速旋转,这样磁头就可以到达盘片上的任意位置了。
先上几张美图:
基本的结构就是这样子的,至于硬盘是如何进行读写的,必须要知道磁盘盘片是如何划分的?否则你只知道磁头在盘片上动来动去。
盘片上涉及的基本概念
整个硬盘上一般有很多的盘片组成,每个盘片如同切西瓜一样被“切”成一块一块的扇面,同时沿着半径的方向被划分成了很多同心圆,就是传说中的磁道,每条磁道被扇面切成很多的扇形区域叫做扇区(扇区是从磁盘读出和写入信息的最小单位,通常大小为512字节),不同盘片上的同半径磁道组成了柱面,这些都是磁盘物理上的概念,知道便可。有了这些概念,我帮便可以计算磁盘的容量:
磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区字节数
l 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头;
l 磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据;
l 柱面(cylinder)数:同磁道数量;
l 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同;所以相对来说,外圈的密度小,
l 圆盘(platter)数:就是盘片的数量。
硬盘上的数据定位
每个扇区可存储128×2的N次方(N=0.1.2.3)字节的数据(一般为512B),扇区为数据存储的最小单元,从上图可知,外圈的扇区面积比内圈大,为何存储的数据量相同,这是因为内外圈使用的磁物质密度不同,但现在的硬盘已经采用内外圈同密度物质来存储数据了,以减少类似“大面积小数据”的浪费情况。(此时的内外磁道的扇区数量将不同,具体细节省略)
有了扇区(sector),有了柱面(cylinder),有了磁头(head),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS(也称3D),对早期的磁盘(上图所示)非常有效,知道用哪个磁头,读取哪个柱面上的第几扇区就OK了。CHS模式支持的硬盘容量有限,用8bit来存储磁头地址,用10bit来存储柱面地址,用6bit来存储扇区地址,而一个扇区共有512Byte,这样使用CHS寻址一块硬盘最大容量为256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是8.4GB)
但现在很多硬盘采用同密度盘片,意味着内外磁道上的扇区数量不同,扇区数量增加,容量增加,3D很难定位寻址,新的寻址模式:LBA(Logical Block Addressing)。在LBA地址中,地址不再表示实际硬盘的实际物理地址(柱面、磁头和扇区)。LBA编址方式将CHS这种三维寻址方式转变为一维的线性寻址,它把硬盘所有的物理扇区的C/H/S编号通过一定的规则转变为一线性的编号,系统效率得到大大提高,避免了烦琐的磁头/柱面/扇区的寻址方式。在访问硬盘时,由硬盘控制器再将这种逻辑地址转换为实际硬盘的物理地址。
LBA下的编号,扇区编号是从0开始。
逻辑扇区号LBA的公式:
LBA(逻辑扇区号)=磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 �C 1
例如:CHS=0/0/1,则根据公式LBA=255 × 63 × 0 + 63 × 0 + 1 �C 1= 0
也就是说物理0柱面0磁头1扇区,是逻辑0扇区。
了解硬盘基本机械构造以及运行原理之后,我们还想知道硬盘上的盘片是如何进行分区的、有哪几种分区、如何存储分区信息的?
磁盘的分区
装过系统的人都知道必须要分区后才能安装系统,形象点的说比如windows里C:,D:之类的东西;如果你要问硬盘为什么要分区,我也说不上来很严格的原因,首先从使用习惯上来讲,我们不希望数据杂乱无章堆积在一起,其次,如果不分区,如何才能在一块硬盘上使用不同的文件系统(下面讲到)呢,学院派的说法是:数据安全和性能考虑。
先要说硬盘中最最重要的第一扇区,因为整块硬盘的重要信息都在这里:
MBR(Master Boot Record 主启动记录):开机引导程序就是安装在此,占用446byte;
DPT(Disk Partition table 硬盘分区表):记录硬盘上的分区元信息,占用64byte。
512-446-64=2,是55h,AAh,标记可启动的。
MBR是如何工作的呢,不用深究,反正就是系统开始时会主动读取数据的地方,这样才能引导进行操作系统的启动;
DPT要仔细的讲讲,分区的大致意思就如同抢地盘,不过人家比较规矩,按照柱面(最小的分区单位)分配,比如第一个分区从柱面1-200,第二个分区201-500,第三个分区501-1000...(省略并非可以无限分配下去哦)
为啥说不能一直分配下去呢,技术柱面数量足够,因为上面说到硬盘分区表只有64个字节,每条分区记录需要占用16字节,最多只能分4个,疑问在此:我的电脑怎么分了5个(c\d\e\f\g)?
其实我说的4个分区是所谓的主分区,为了能支持很多分区引入了扩展分区的概念, 也就是说,可以使用DPT中一条记录来记录扩展分区的信息,然后在扩展分区中再继续划分逻辑分区,而逻辑分区的分区信息则记录在扩展分区的第一个扇区中,如此则可以像链表一样划分出很多分区来。但注意,一个分区表中可以有1~4条主分区,但是最多只能有1个扩展分区
分区表之间是如何关联的,详细讲一下,分区表是一个单向链表,第一个分区表,也就是位于硬盘第一个扇区中的DPT,可以有一项记录扩展分区的起始位置柱面,类似于指针的概念,指向扩展分区(图3),根据这项记录我们可以找到扩展分区的某柱面0磁头1扇区(CHS),而这个扇区中又存放了第二个分区表,第二个分区表第一项记录一般表述了当前所在的逻辑分区的起始/终止柱面,第二项记录表述了下一个逻辑分区所在的0磁头1扇区(CHS),第三、第四项记录不存任何信息(图4)。
请看下图,主引导记录/分区表所在的是硬盘第一个分区,基本分区1、基本分2、基本分区3都是主分区、扩展分区内有2个逻辑分区,每个逻辑分区的第一个扇区都是分区表。
分区后的系统启动
之前提到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等其他操作系统的启动项添加进来,如果你选择了添加进来,那么你在开机时就会有两个选项让用户进行选择了。
文件系统
文件系统也是很大很复杂的话题,我们仍然以比较通俗、粗颗粒度来讲解,试想一下,我们的文件如何对应到磁盘的扇区上呢,所以光有底层的概念 磁道 扇区是没有用的,需要更加抽象的数据类型或结构来抽象底层的细节。
文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型(Abstract data type)。
文件系统是一种用于向用户提供底层数据访问的机制。它将设备中的空间划分为特定大小的块(扇区),一般每块512字节。数据存储在这些块中,大小被修正为占用整数个块。由文件系统软件来负责将这些块组织为文件和目录,并记录哪些块被分配给了哪个文件,以及哪些块没有被使用。
不过,文件系统并不一定只在特定存储设备上出现。它是数据的组织者和提供者,至于它的底层,可以是磁盘,也可以是其它动态生成数据的设备(比如网络设备)
只是简单介绍,具体的文件系统要具体分析。
感谢那些无私奉献的blogger!