一、磁盘

1. 特点:

  • 机械磁盘是计算机中唯一的一个机械设备
  • 磁盘— 外设
  • 容量大,价格便宜

在这里插入图片描述

2. 物理结构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

磁盘的读写的基本单位是一个扇区(512)!不同位置可能疏密不一样

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3. 如何写入?

(初步理解CHS)

写入数据,就得找最小写入单元:扇区

(1)找到哪一面,磁头编号header)

(2)在当前面中,哪一个磁道cylinder)

(3)磁道中第几个扇区sector)

CHS定位

(逻辑结构LBA)

在这里插入图片描述

每个磁道将其想象成一条直带,每个扇区就是上面的一个区域。

在这里插入图片描述

在这里插入图片描述

这样每一个扇区就有了一个线性地址,也就是数组下标,这种地址叫LBA(Logical Block Address)

(真实过程)

因为所有磁头的运动都是相同的,那么每个磁头在其对应盘片的运动也相同,所以我们要把所有磁头的运动整体来看;

现在我们不再关注到盘面,把角度放在每一个柱面上:

在这里插入图片描述

再理解CHS定位:首先找到柱面(Cylinder),再通过磁头(Head)找对应磁道,再确定扇区(Sector)。

那么也就变成了二维扇区数组;那么整个磁盘就是多个柱面,也就是有多个二维数组表(磁盘就成了个三维数组)。注意:尽管我们知道这个多维逻辑,但是实际上,终究还是一维,就像C/C++中的二维数组,本质还是一维线性一样。

在这里插入图片描述

所以每一个扇区都有一个下标:叫做**LBA地址,也就是线性地址。OS只要用LBA**就行了。

(LBA与CHS的转换)

(1)CHS -> LBA(三维转一维):

  • C(柱面):从0开始编号;

  • H(磁头):从0开始编号;

  • S(扇区):从1开始编号;

  • LBA地址:从0开始的下标。

给一组CHS**<4, 5, 6>**,转成LBA

已知:单个柱面总扇区数(A) = 磁头数 (M)* 单磁道扇区数(N);

CHS**<4, 5, 6>**:在第5张柱面上,在第6个磁头对应磁道上,在第6个扇区上。

直接得:LBA = 4 * A + 5 * N + 6 - 1.

(2)LBA -> CHS(一维转三维):

“//”: 表示除取整

CLBA // A

H(LBA % A) // N

S(LBA % N) + 1

二、文件系统

1. 最小“块”

硬盘属于典型设备。操作系统读取硬盘数据时,不会逐个扇区读取,效率过低,而是一次性连续读取多个扇区,也就是读取一个数据块

硬盘分区会被划分成若干数据块,块的大小在格式化时设定,设定后无法修改,常见大小为 4KB,通常由连续8 个扇区组合构成。

块是文件存储与存取的最小单位

注意

知道LBA:块号 = LBA/8

知道块号:LAB=块号*8 + n. (n是块内第几个扇区)

2. 磁盘“分区”

磁盘可以划分成多个分区。在 Windows 系统里,一块磁盘常会分出 C、D、E 等盘符,这些盘符对应的就是磁盘分区,分区本质上也是对硬盘的格式化操作。(分治思想)

而 Linux 系统中所有设备均以文件形式呈现,分区同样遵循对应的分区规范来划分管理。

柱面是分区的最小单位,可通过参考柱面编号划分分区,本质就是设定每个分区的起始柱面结束柱面编号。

3. 盘区“分组”

在分区之后,文件系统还会对其分组:

在这里插入图片描述

4. 块组结构

1. 文件 = 内容 + 属性。在Linux中,文件内容和文件属性分开存储;

**2. 一个组里应该包含什么内容?**文件数据 + 管理数据的数据

在这里插入图片描述

文件属性inode Table 与 文件内容Data Blocks

在这里插入图片描述

管理数据Block Bitmap

在这里插入图片描述

管理数据inode Bitmap

在这里插入图片描述

管理数据GDT

整个分区 只有一张 GDT(块组描述符表),放在 分组 0 的开头

这张 GDT 里有 所有块组的描述信息(每个分组占 32 字节)

为了防损坏,这张 同一份 GDT 会在某些块组里做备份(不是每个组都有)

GDT 到底存什么?

每个分组在 GDT 里对应一条 “描述符”,记录:

  • 这个组的 块位图 在哪一块
  • 这个组的 inode 位图 在哪一块
  • 这个组的 inode 表 从哪块开始
  • 空闲块数、空闲 inode 数、目录数……
    在这里插入图片描述

管理数据Super Block

1. 作用

整个文件系统的总档案、总账本

2. 存放位置

分区开头,块组 0 里

3. 存核心全局信息
  • 分区总块数、总 inode 数量
  • 块大小、inode 大小
  • 空闲块、空闲 inode 总数
  • 块组数量、挂载状态、文件系统版本
4. 特点
  • 损坏 = 整个分区大概率打不开、数据读不出
  • 会在多个块组做冗余备份,防止丢失
5. 和 GDT 区别
  • 超级块:管整个分区全局整体信息
  • 块组描述符表 GDT:管每一个小块组的明细信息

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐