欢迎来到博主的专栏:从0开始Linux
博主ID:代码小豪
文章目录
- CHS寻址模式
- LBA寻址
前面我们介绍了文件管理系统,我们说,当我们使用系统调用open时,操作系统会将磁盘当中的文件加载到内存当中,创建一个struct file结构,通过struct file实现对文件的管理,比如被打开的文件会被创建文件描述符(fd),有文件缓冲区等等,这些操作都是由文件系统实现的,而针对于管理内存当中的文件的文件系统,我们称其为内存级文件管理系统。
被打开的文件,会被加载到内存中,而未打开的文件都是在磁盘当中,它们都有各自的路径,以便我们找到对应的文件,那么我们有没想过一件事情,未打开的文件的路径是谁维护的?为什么内存级文件管理系统可以在磁盘当中轻松的找到文件?这是因为不仅仅要管理内存当中被加载的文件,也要管理好磁盘当中的文件,而执行这些操作的,就是磁盘级文件管理系统。
CHS寻址模式
CHS寻址模式是根据机械硬盘的机械结构的特性建立的,因此我们要先了解机械磁盘的保存数据的原理。
首先我们的计算机只能读取二进制,在我们的内存或者cpu当中,二进制的表现形式为高低电平,即高电平为1,低电平为0。而磁盘则是通过磁性来表现二进制。
磁性分为正负极,也是一种二进制的体现,比如正极为1,负极为0。
这是我们机械磁盘的内部结构,其中红圈画中的部分,就是机械磁盘用来保存数据的盘面,通常称之为磁面,我们可以将这个磁面视为N个小磁铁的集合,每个小磁铁都有其正负的磁场,通过这些磁场的磁性,用于记录二进制数据。
磁盘的运作原理如下:主轴旋转带动磁盘转动,而磁头的主要作用是定位,以及读写数据的作用。这个工作原理有点像是留声机,唱片负责记录声音的数据,而唱针则是负责读写这些声音的数据,如果磁盘造成了损坏,那么磁盘上的数据也会造成对应的丢失问题。
磁头是可以移动的,如我们图中黑色笔迹所示,由于磁盘会转动,相应的磁头也会与磁盘进行相对运动,其运动轨迹是一个圆。而磁头该可以移动,因此会在磁盘上留下多个圆轨迹。我们将这些轨迹称为磁道,而磁道上又有着磁盘数据。
我们的磁头可以移动,每次移动就相当于来到了不同的磁道,而不同的磁道又有着不同的数据,因此如果我们想要在磁盘当中找到我们想要的数据,首先要让磁头定位到正确的磁道。
而一个磁道可以保存非常多的数据,为了精准找到我们想要的数据,我们还要继续将磁道划分下去,根据规定,我们将磁道上512B的数据,称为一个扇区,即扇区是磁盘的基本单位。不同的磁道,其磁道上的扇区的数量不一定相等,但是扇区的大小一定是512B。
综上所述,一个磁面可以划分N个磁道,而每个磁道都有其对应数量的扇区,每个扇区的大小是512B,因此一个磁面可容纳的数据为:
磁面大小=磁道×磁道的扇区总数×512B
一个磁盘,可以有多个磁片,而每个磁片,都有正反两磁面,而正面能保存数据,反面也能,因此对应的,每张磁片都有正、反两面磁头。因此一个磁盘的大小为:磁面个数×磁面大小
,扩展开来即
磁盘大小=磁面个数×磁道×磁道的扇区总数×512B
关于机械磁盘的机械结构,我们已经简单的了解完了,但是CHS到底是什么?我们还没有搞清楚,首先,我们要知道,CHS其实是一个逻辑结构,其中C代表柱面(Cylinder),H代表磁头(Heads),S代表扇区(sector)。扇区和磁头我们都清楚是什么样的,那么柱面是什么呢?
在前面剖析机械硬盘的结构时,我们知道磁道是磁头在磁面上旋转一周的运动轨迹,但是磁面不止一个,这也说明了所有磁片中半径相同的同心磁道也不止一个,我们将在与主轴相同半径的磁道的集合
,我们称其为柱面。
柱面是一个逻辑上的概念,即将每个磁面上,相同半径的同心磁道,在逻辑上构成柱面。所以通过柱面,我们可以在逻辑上将机械磁盘看成是一个由柱面构成的硬件设备,有点像这样:
OK,根据这种方式组成的磁盘结构,其构成是这样的:
(1)每个磁盘,有多个柱面
(2)每个柱面,多个磁头(磁道)
(3)每个磁头(磁道),有多个扇区
因此磁盘的容量=磁头数(磁道数)×扇区数×柱面数×512B
。
根据这种概念,我们可以用下图,画出一个磁盘的所有空间分布:
现在我们将文件保存在磁盘当中,一个文件最少会占用一个扇面或者多个扇面。因此所谓的再磁盘当中找到文件,实际上是在磁盘当中找到文件对应的扇区。
因此如果我们要在磁盘当中定位某个文件,先找到文件所在的柱体,再找到文件所在磁头,最后找到文件所在的扇面,这样我们相当于是在磁盘当中,找到了文件。这种通过柱体,磁头,扇面寻找文件所在磁盘的方式,我们就称为CHS寻址模式。
LBA寻址
但是我们的磁盘并非都是机械硬盘,比如我们现在的家用pc更多使用的是固态硬盘,固态硬盘的结构与机械硬盘完全不同。其采用是电子存储芯片,而非磁片。
因此使用CHS模式来描述磁盘结构并不通用,因此我们有没有更通用的磁盘结构呢?我们回顾一下CHS的结构,其实用C/C++的角度来看,我们会将这种结构称为三维数组
,而三维数组是可以展开成一维数组的。展开后的结构如下:
但是一个扇区才512B,对于我们现在一个硬盘动不动512GB,1TB的情况来看,扇区实在是太小了,拆分的太细其实也是不方便管理的,因此我们设计用块来代替扇区作为基础单位,通常一个块会是1KB,2KB,4KB的大小,比如linux系统就以4KB大小作为一个块的大小,因此在linux系统当中,其磁盘结构则是这样:
通过这种转换方式,我们的磁盘结构就从CHS形式的三维数组,变成了以块为单位的一维数组。
这种以块为单位,划分磁盘空间的定址方式,我们将其称为LBA定址,LBA的全称为:Logical Block Address(逻辑区块地址),即在逻辑上将磁盘空间划分成一个个的块。