linux内核原理剖析——磁盘寻址、分区

继上一篇<<linux内核原理剖析——内存寻址(一)>>之后,发现大家
对底层技术关注度比较高之后,今天继上一篇的内存寻址一文后,补
充一篇关于更为底层的——磁盘寻址,让我们更清楚的了解计算机在
硬盘上是如何寻址的。

磁盘模型

磁盘结构

上图显示了计算机系统中磁盘的形态。其中磁盘会在主轴上通过机械摇臂旋转,一个磁盘上下会有2个磁头(图中为了方便,只画了一个),当旋转时,磁头在磁盘上画出磁道(一个磁盘上有多个磁道),每个磁道的立面称为柱面,两个磁道之间会分割成一小块一笑块区域,称为扇区。

寻址方式

数据是存储在计算机的磁盘上的,那么cpu是如何通过内存在磁盘上找到需要找的数据呢?答案当然也是需要寻址的,即为磁盘寻址。磁盘寻址分为CHS和LBA。

CHS

最开始我们的磁盘有8个磁片,每个磁片上有2个磁头,每个磁片上有21024个磁道,每个磁道有63个扇区,每个扇区大小相等,为512byte。即整个磁盘大小:82102463*512byte = 500M。但是我们会发现个问题,如果每个磁道都是63个扇区,那么外层磁道分的每个扇区一定是要比内层磁道分的每个扇区要大,所有为了保证每个扇区大小相等,外层扇区采用稀疏的存储方式存储,但是这样浪费了存储空间,所有产生了LBA。在聊LBA之前,我们先看下CHS是如何寻址的。

磁道是有编号的,最外层磁道编号为0,然后依次为1、2、3…越靠近圆心的磁道编号越大。

扇区:每个磁道的扇区也是从0开始编号,0、1、2、3…

CHS是柱面 磁道 扇区的缩写,用CHS方式表示的地址为0/0/1,那么表示当前的物理地址所对应的是第0个柱面第0个磁道上的第一个扇区,那么即定位到了寻址0/0/1所对应的物理位置为第0个柱面的第0个磁道的第一个扇区。

LBA

目前我们的磁盘和之前有所不同,盘片外层的磁道划分的扇区数多于内层的扇区,这样内外层扇区大小就保持了一致。

扇区编号方式也有所不同,扇区编号从0开始,0盘片0磁道第一个扇区为0,第二个扇区为1,以此类推。如0磁道扇区范围为0-127,那么1磁道的扇区就从128开始,即可能128-256。因此要定位某个磁盘的位置,只需给出扇区编号即可。

LBA线性地址的计算公式为:磁头数 × 每磁道扇区数 × 当前所在柱面号 + 每磁道扇区数 × 当前所在磁头号 + 当前所在扇区号 – 1

例如:CHS=0/0/1,则根据公式可以LBA=255 × 63 × 0 + 63 × 0 + 1 – 1= 0

也就是说物理0柱面0磁头1扇区,是逻辑0扇区。

磁盘分区

在我们计算机中,利用磁盘是需要分区的,比如我们windows操作系统,在做系统时,可分为c、d、e、f盘,这就是对磁盘的分区。磁盘分区的最小单位是柱面,如c盘可以对应磁盘的0-100柱面,d盘对应101-200柱面… …以此类推。

但磁盘的0扇区是不可使用的,它需要存放主引导程序,446byte。剩下的64byte是存放分区表的。

主引导程序:系统启动的时候负责加载启动菜单。引导每个分区的引导程序启动。

分区表:记录着基本分区表信息。

因为一个分区表只有64byte,所以一个分区表只能记录4个分区信息,所以要分出更多的分区,那么就需要在分区表中拿出一个分区记录单独记录拓展分区的信息。

分区结构
上图描述了基本分区和扩展分区的结构关系,主引导记录中存放主引导程序和分区记录,分区记录中分别记录了每个分区的信息,记录了每个分区的指针。图中列举了3个基本分区和2个扩展分区,其中扩展分区也有单独的扩展分区表来记录扩展分区信息,见下图。
扩展分区
拓展分区中,每一个扩展分区中都包含了分区表,也是4个分区表项,分区表项1记录当前分区的信息,指向当前分区,分区表项2指向下一个扩展分区,分区表项3和4未使用,这样就构建了一个单向链表,来记录分区之间的关系。

最后

如果本文对你有价值,哪怕一点点,请记得关注、点赞,有不足或疑问之处请留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章