文件系统(一):存储介质、原理与架构

liwen01 2024.01.01

前言

从系统角度来看,文件系统是对文件存储器空间进行组织、分配、负责文件存储并对存入的文件进行保护和检索的一个系统。

它的目的是使用户和应用程序能够方便地管理存储器上的文件和目录,比如常见的对文件的增、删、改、查。

每当我们操作一个文件的时候,实际都会涉及到存储器、管理系统、被管理文件,还有就是实施文件管理所需的数据结构。

存储器,我们也叫存储介质,也就是电子设备用来存储数据信息的器件。

(一)存储介质介绍


存储介质,也就是用来存储信息的介质,从远古的石壁刻画,到古代的笔墨纸砚记录,再到电气时代的磁存储、光存储、半导体芯片存储。

光盘存储已近逐渐地退出大众的视野,我们这里主要介绍磁存储和半导体存储。磁存储的代表就是机械硬盘,半导体存储已近被非常广泛地应用了,比如我们常用的U盘、SD卡、TF卡、固态硬盘等。

  • 机械硬盘因为它容量大、价格低,在个人电脑中广泛使用,
  • 固态存储速度快,功耗低,无噪音,同等容量的价格也比较的平民,在各种便携式存储设备中广泛使用。

(二)固态存储


固态存储,也就是不依赖机械传动,直接使用半导体芯片为介质的一种存储。大的分类可以分为两种: RAM和ROM。

Flash其实也算是ROM的一种变种,现在广泛使用的 ROM 大部分都是基于Flash设计的。大部分固态硬盘的存储介质也是Flash。

(1)RAM与ROM

RAM(随机访问存储器):

是一种临时存储器,用于保存正在运行时所需的数据和程序,可读可写,允许在需要时快速读取或写入数据,但它也是易失性存储器,设备断电时里面的数据会丢失。

ROM(只读存储器) :

用于存储固定的、不经常变化的数据和程序,它是只读的,通常在制造时被写入,并且其内容在正常操作期间不可更改。但它存在一些变种,如可擦写可编程只读存储器(EPROM)和闪存(Flash),它们允许有限次的可编程操作。

Flash存储器

它是一种非易失性存储技术,广泛用于各种电子设备、USB、固态硬盘等产品。它分为NOR Flash 和NAND Flash 两种

(2) NOR Flash

它采用 NOR(不或非)门结构,与NAND Flash相比,NOR Flash具有一些特定的特性和优势:

  • 读取速度快
  • 随机访问能力
  • 适用于代码存储
  • 写入擦除速度较慢
  • 低功耗

NOR门结构

NOR Flash, NOR就是"非或"的意思

NOR门是由两个输入端(A和B)和一个输出端组成的。其输出取决于输入信号的状态,具体逻辑运算规则如下:

  • 输出为高电平(1)的条件:只有当A和B都为低电平(0)时,NOR门的输出才为高电平。
  • 输出为低电平(0)的条件:如果A或B中至少有一个为高电平,NOR门的输出就会是低电平。

NOR门的逻辑运算符号通常用符号"+"表示,其输出(Y)可以表示为:Y = A + B(其中,"+"表示逻辑或运算)。

NOR门的逻辑符号如下所示:

    -----
A --|     |
    | NOR |---- Y
B --|     |
    -----

(3) NAND Flash

NAND Flash采用NAND门结构,与NOR Flash相比,它具有一些独特的特点和优势。

  • 高密度存储
  • 相对低成本
  • 擦写熟读快
  • 适用于大容量数据存储
  • 顺序访问

NAND门结构:

NAND门由两个输入端(A和B)和一个输出端组成。其输出取决于输入信号的状态,具体逻辑运算规则如下:

  • 输出为高电平(1)的条件:当A和B都为高电平时,NAND门的输出为低电平(0)。

  • 输出为低电平(0)的条件:只有当A和B中至少有一个为低电平时,NAND门的输出才为高电平。

NAND门的逻辑运算符号通常用"⊼"(或称"AND非")表示,其输出(Y)可以表示为:Y = A ⊼ B(其中,"⊼"表示逻辑AND非运算)。

NAND门的逻辑符号如下所示:

    -----
A --|     |
    | NAND|---- Y
B --|     |
    -----

(4)基于Flash的应用


嵌入式设备中的应用

在嵌入式设备,一般是直接使用Flash存储器来存储程序和代码,按总线类型,可以分为串行和并行总线接口,在嵌入式设备中使用的比较多的是SPI串行总线。

比如常用来存储程序的SPI NOR Flash: PY25Q128HA、MX25L51245G、FM25Q128A、EN25QH128A、BY25Q128AS

它的特点是容量较小,可以随机访问。

组合应用

我们日常生活中使用到的固态存储器,比如U盘、SD卡、TF卡、固态硬盘等,它里面除了Flash存储芯片外,还有主控芯片、DDR内存、接口、PCB电路板。

  • Flash存储芯片:是主要的存储介质,通常采用NAND型闪存。
  • 主控芯片:是固态硬盘的核心控制单元,负责管理数据的读写、错误校正、垃圾回收和性能优化等任务。
  • DDR(双数据速率缓存): 用于缓存数据和提高读写速度
  • 接口:决定了存储设备与主板之间的数据传输速度和通信方式
  • PCB电路板:提供了这些组件之间的电气连接

下面是一个固态硬盘的内部器件,其它的固态存储设备也类似。

我们日常使用到的固态存储设备,比如TF卡、SD卡、U盘等,一般内部使用的都是NAND flash,它的优点是:存储密度高、改写速度快,同等容量下价格相对比较便宜。

(三)固态存储架构体系

(1)NAND flash 特性

我们在上面看到一块固态硬盘内部包括了主控芯片、DDR内存、接口、PCB电路板,为啥需要这么复杂?为什么不能直接操作Flash芯片呢?主要原因是跟NAND flash 的特性有关系。

NAND flash 有些独特的物理组成和使用特性:

(a)写入的最小单元是页

NAND Flash 存储器的最小可编程单元是页。每次写入操作都需要覆盖整个页,而不能仅修改其中的一小部分。这使得写入操作的最小单元限定在一页的大小,即使只有一页中的一小部分数据需要更新,整个页也需要被写入。

(b)擦除的最小单元是块

NAND Flash 存储器的最小可擦除单元是块。在擦除之前,需要将整个块的数据读取出来,修改后的数据写回。由于擦除操作是比较慢且磨损较大的操作,为了降低擦除的频率,设计选择以页为单位进行写入,而不是以块为单位。

典型的页大小为2KB、4KB或8KB,常见的块大小为64页或128页。

(c)擦写次数有限制

每个块都有一个有限的擦写寿命,即可以执行的擦写次数是有限的。频繁地在原地更新数据可能导致某些块更快达到擦写寿命上限,进而影响整个NAND Flash的寿命。因此,设计者更倾向于采用写入新页并擦除旧块的策略,以减少擦写次数的集中发生。

(d)随机位翻转

NAND Flash芯片中会因为自然放电、电场噪声、辐射等原因出现随机位翻转的现象,导致存储的数据位发生不可预测的变化。

(2)flash FTL

因为 nand flash 有擦写次数的限制、有随机位翻转的问题、还有写入和擦除大小不一致的限制,现有针对机械磁盘设计的文件系统是不能直接应用在Flash上的,需要借助一个特殊的软件层------闪存转换层(FTL),来屏蔽闪存的底层差异,使上层系统可以透明地使用闪存。

相应的,固态存储的软件架构也要复杂很多。

(3)地址映射

FTL 中的地址映射确保上层文件系统可以使用逻辑块地址,而不用担心 NAND Flash 存储器的底层细节。这种映射关系的管理是 FTL 在保障 NAND Flash 数据稳定性、提高寿命以及提供高效读写的关键功能之一

逻辑块地址(LBA):

这是上层文件系统使用的块地址,通常是顺序递增的逻辑块编号。应用程序或文件系统将数据按逻辑块地址组织,而不需要关心底层 NAND Flash 存储的特性。

物理块地址:

这是 NAND Flash 存储器中实际的物理块的地址。由于 NAND Flash 进行擦写时只能对整个块进行,FTL 负责将逻辑块地址映射到物理块地址,并处理擦写时的块移动操作。

映射表

FTL 维护一个映射表,记录逻辑块地址到物理块地址的映射关系。这个映射表通常存储在 Flash 存储器的特殊区域,如页或块中。

写入时的地址映射:

当应用程序向 NAND Flash 写入数据时,FTL 将逻辑块地址映射到一个可用的物理块。如果该物理块已经被写入过数据,FTL 需要擦除该物理块,将其标记为可用,并将新数据写入。这一过程需要更新映射表。

擦除时的块移动:

由于 NAND Flash 存储器的特性,每次擦写操作都会引发整个块的擦除。当需要擦除一个物理块时,FTL 需要将该块中的有效数据移动到其他块,然后标记该块为可用。这一过程同样需要更新映射表。

(4)垃圾回收

为什么会产生垃圾?

(a)不可原位更新:

当需要更新NAND Flash中的数据时,无法直接在原地进行更新。相反,新的数据必须写入一个新的空白页中,而原有的数据所在的页则被标记为无效。这导致存储器中同时存在有效和无效的数据,即产生了垃圾。

(b)擦写操作的不可细粒度

NAND Flash的最小擦除单位是一个块,而最小写入单位是一页。如果需要更新某个页面的数据,整个块都需要被擦除,然后将更新后的数据写入。由于擦写和写入的单位不同,更新操作可能会导致未更改的数据也被重新写入,形成了垃圾。

(c)擦除前数据的标记:

当需要删除数据时,NAND Flash通常会将相应的页标记为无效,而不是立即擦除。这样,数据被删除后,原来的页仍然存在,但被标记为无效状态,形成了垃圾。

(d)写入放大:

写入放大是指为了写入少量数据而触发的大量物理写入。由于不可原位更新和擦写操作的不可细粒度,写入操作可能导致更多的物理页被写入,从而增加了实际写入量,也增加了垃圾的产生。

这些因素共同作用,导致NAND Flash中垃圾的产生。为了解决这个问题,存储系统采用垃圾回收机制,定期清理无效的数据,擦除无效块,以便重新利用存储空间,并最大程度地减少擦写次数,延长NAND Flash的寿命。

垃圾回收的一般流程:

  • 标记无效页
  • 选择目标块
  • 数据迁移
  • 擦除目标块
  • 更新元数据

(5)坏块管理

为什么会产生坏块?

(a)擦写次数限制:

NAND Flash的每个块都有一个有限的擦写寿命,即可以执行的擦写次数是有限的。当某个块达到了其擦写寿命上限,该块就会被标记为坏块,不再可用。这是由于擦写操作引起的物理损耗。

(b)随机位翻转:

存储器单元可能受到环境中的辐射、电场噪声或其他干扰,导致数据位发生随机翻转。当这种情况发生在存储器中的某个块时,该块可能变成坏块,因为存储的数据无法正确读取。

(c)存储介质的不稳定性:

NAND Flash使用的存储介质(通常是浮栅)可能因为制造过程或质量问题而导致某些块不稳定。这种不稳定性可能导致块的性能下降,或者在使用中产生坏块。

(d)擦写时的错误:

在擦写操作中,由于电压不稳定、温度变化或其他因素,可能发生错误。这些错误可能导致擦写操作未能正确完成,从而使得块成为坏块。

(e)制造过程中的缺陷

制造过程中可能存在一些缺陷,导致某些块在生产阶段就不完整或有问题。这些块可能在设备制造过程中被标记为坏块。

坏块管理的一般流程

(a)坏块检测:

  • 初始化阶段:在系统初始化时,进行坏块检测。这包括检查 NAND Flash 存储器中是否存在已经标记为坏块的块。
  • 运行时检测:在系统运行时,定期或在需要时进行坏块检测。这可以通过读取存储器中的坏块表或直接尝试读取每个块的方式来实现。

(b)坏块标记:

如果检测到坏块,将其标记为坏块。这可以通过在坏块表中记录坏块的位置或使用其他元数据方式来实现。

(c)坏块替代:

一旦坏块被检测并标记,系统需要寻找可替代的块。这通常包括从备用块池中选择一个可用的块来替代坏块。备用块通常是在 NAND Flash 设备制造时预留的。

(d)更新坏块表:

如果替代块被选择,需要更新坏块表,将新块的位置标记为有效块。这确保了系统在后续操作中不会再使用已标记为坏块的块。

(e)数据迁移:

如果坏块替代发生在运行时,系统可能需要将原始块中的有效数据迁移到替代块中,以确保数据的完整性和可靠性。

(6)损耗均匀(磨损平衡)

磨损均衡是为了最大程度地平衡 NAND Flash 存储器中擦写寿命的消耗,从而提高存储器的性能、可靠性和寿命。

磨损均衡的策略一般有:

(a)块循环使用:

块循环使用是最简单的磨损均衡策略之一。它通过轮流使用存储器中的块,而不是过度依赖于特定的块。这有助于分散擦写操作,减轻存储单元的磨损。

(b)Wear Leveling(磨损均衡)算法: Wear Leveling 算法是一种专门设计的算法,旨在在整个存储器中均匀分配擦写操作。这种算法考虑每个块的使用情况,优化写入和擦除操作的分布,以降低存储单元的不均匀磨损。常见的 Wear Leveling 算法包括静态均衡和动态均衡算法。

(c)动态坏块管理:

动态监测并管理坏块,确保它们不会集中在特定区域。当检测到新的坏块时,系统可以调整块的分布,以确保损耗均匀。

(d)块交换:

进行块交换,将频繁写入的块与很少写入的块进行交换。这有助于平衡擦写操作,减缓块的磨损。块交换可以是静态的,也可以是动态的,根据系统的需要进行调整。

(e)备用块池的合理使用:

在 NAND Flash 制造时,通常会预留一些备用块。合理使用备用块池,确保块的磨损相对均匀。

(f)周期性的擦除操作:

定期执行擦除操作,即使块中没有无效页。这有助于重置块的状态,减小块的磨损程度。

(7)为什么手机越用越卡

手机越用越卡,除了器件的老化问题之外,还有一个原因就是存储设备里面的数据接近存储卡容量,导致存储设备写数据变慢了。

为什么容量满了就会变慢了呢?这主要与写放大和垃圾回收有关系。

假设要写入一个4KB的数据,但已经没有干净空间了,只有失效的数据可以擦除,所以主控就把所有的数据读取到缓存存,然后擦除一个块,再加上这个4KB新数据写回去,这就造成了写入放大,本来是需要写4K的数据,却写入了512K的数据,也就是128倍放大。

上面只是个假设,实际有垃圾回收策略的接入,不会是128倍这么大。下面是IBM Zurich Research Laboratory做的研究,实际证明写放大与空闲净块关系极大

上图可以看出,空闲块少后,写放大可以到达3~4倍

(四)机械硬盘

尽管固态存储设备发展迅猛,但传统的机械硬盘存储还是有很大的市场占有量,因为它数据稳定,同等价格下,存储容量更大。

(1)外部结构

我们从外部看,一个机械硬盘上有:主控芯片、高速缓存、电源接口、主从设置电路、数据接口、控制电路板。

  • 主控芯片:是机械硬盘的核心控制器,负责管理硬盘的整体操作。它控制数据的读写、定位磁头、管理电机旋转等。
  • 高速缓存:是一块用于临时存储数据的内存。它能够提高读取和写入数据的效率,尤其在处理频繁访问的数据时。
  • 电源接口: 为硬盘提供电力
  • 主从设置电路: 用于配置硬盘在IDE链路上的身份。
  • 数据接口:用于与主板或控制器通信的接口

(2)内部结构

机械硬盘的内部结构主要有:磁头组件、盘片、主轴组件、电机、接口等

  • 磁头组件: 负责在盘片上读取和写入数据。它是机械硬盘中的核心组件之一,通过悬浮在盘片表面上并移动,实现对数据的访问。
  • 盘片: 是机械硬盘内的磁性圆盘,数据存储在其表面上。硬盘通常包含多个盘片,它们叠放在主轴上。
  • 主轴组件 : 包含主轴电机,负责旋转盘片。盘片通过主轴组件旋转,磁头组件通过它来读取和写入数据。
  • 电机:提供硬盘所需的动力,主要包括驱动主轴组件的主轴电机和控制磁头的定位电机。

(3) 盘面、磁道、柱面与扇区

我们用一张唱片的盘面来类比硬盘的的盘面,可以看到上面有明显的盘面、磁道、柱面,机械硬盘的内部盘面也类似。

盘面(Platter):

  • 盘面是硬盘内部的物理圆盘,通常由非磁性材料制成,表面涂有可磁化的材料,用于存储数据。
  • 一个硬盘通常包含多个盘面,它们叠在一起并通过主轴电机旋转

磁道(Track):

  • 磁道是盘面上的一个圆形路径,从盘片的中心延伸到边缘。数据在硬盘上以磁道的形式存储
  • 一个盘面上通常有多个同心圆状的磁道,每个磁道上的数据可以被磁头读取或写入

柱面(Cylinder)

  • 柱面是多个盘面上相同磁道的集合,它们在垂直方向上对齐,构成一个立体的数据存储结构
  • 通过沿着同一柱面的不同盘面上的磁道进行读写,可以提高数据的访问效率

扇区(Sector):

  • 扇区是磁道上的一个小块,是硬盘中最小的数据存储单元。数据按磁道和扇区的组合方式进行存储。
  • 一个磁道上通常被划分成多个扇区,每个扇区可以存储一定容量的数据,通常是512字节或4K字节

(4)机械硬盘工作原理

1. 盘片旋转:

  • 机械硬盘内部有多个盘片,这些盘片通过主轴组件旋转。主轴电机提供动力,使得盘片以高速旋转,通常以每分钟转数(RPM)来度量。

2. 数据的磁性存储:

  • 每个盘片的表面被分成许多磁道和扇区。数据以磁性的形式存储在这些磁道和扇区上。磁道是圆形的环,而扇区是磁道上的一个小片段。

3. 磁头的运动:

  • 机械硬盘中有多个磁头,每个磁头对应一个盘片的表面。磁头悬浮在盘片表面上,可以通过机械臂的运动进行定位。
  • 机械臂负责将磁头移动到指定的磁道上,以读取或写入数据。磁头的精确定位是机械硬盘关键的技术之一。

4. 读写数据:

  • 当需要读取数据时,控制电路会指示磁头移动到特定的磁道上,并从磁盘上的扇区读取磁性信息。这些信息会被转换为电信号,传递到计算机系统进行处理。
  • 当需要写入数据时,磁头会根据指令移动到指定位置,然后将电信号转换为磁性信息,写入到磁盘的相应扇区。

(5)寻址模式

CHS寻址模式(Cylinder-Head-Sector)

  • 在CHS寻址模式中,数据的物理位置由柱面(Cylinder)、磁头(Head)和扇区(Sector)三个参数确定
  • 计算机使用上面参数来指定硬盘上的数据位置,每个柱面上的磁道由多个扇区组成,磁头负责在柱面上移动,读取或写入指定磁道的指定扇区
  • 这种寻址方式已经逐渐过时,因为它在处理大容量硬盘时存在限制,难以管理大量柱面、磁头和扇区的信息

逻辑块地址(LBA)寻址模式

  • LBA是一种更为直观和简化的寻址方式
  • 在LBA寻址模式中,硬盘被视为一个线性的地址空间,每个扇区都有一个唯一的逻辑编号
  • 计算机系统直接使用这个逻辑块地址来访问硬盘上的数据,而无需考虑具体的物理位置
  • LBA寻址模式对于大容量硬盘和简化操作系统的数据管理来说更为方便,因为它不涉及复杂的CHS参数
  • 现代计算机系统几乎都使用LBA寻址模式,这种方式提供了更高的灵活性和可扩展性,同时简化了硬盘管理

(五)分区格式化

我们买的U盘、SD卡等存储设备,一般我们买回来就可以直接使用,并不需要做什么分区格式化。那是因为在设备出厂之前,厂家已经预先做了这些工作。

一个存储设备在出厂之前,一般都是需要做:

  1. 低级格式化
  2. 选择分区方式
  3. 建立分区
  4. 格式化

详细的分区格式化我们在下一章在介绍。

结尾

计划将文件系统相关的知识点整理输出成一个系列的文章:存储介质介绍、分区格式化、系统启动、FAT系列文件系统、ext系列文件系统、NTFS文件系统、嵌入式文件系统、文件IO等

---------------------------End--------------------------- 如需获取更多内容 请关注liwen01 公众号

相关推荐
憧憬一下1 天前
PCIe_Host驱动分析_设备枚举
arm开发·嵌入式硬件·嵌入式·pcie·linux驱动开发
憧憬一下3 天前
PCIe_Host驱动分析_地址映射
arm开发·嵌入式硬件·嵌入式·linux驱动开发·pci/pcie
aspirestro三水哥8 天前
Linux: 通过/proc/pid/stack查看程序卡在内核的什么地方
linux·运维·服务器·嵌入式
@启智森9 天前
【C语言】浮点数的原理、整型如何转换成浮点数
c语言·开发语言·嵌入式·float·int·浮点数
@启智森9 天前
【Uboot】Uboot启动流程分析
linux·c++·嵌入式·uboot·启动·底层
不想写代码的我9 天前
基于ZYNQ-7000系列的FPGA学习笔记11——IP核之单端RAM读写
笔记·学习·fpga开发·嵌入式·zynq
7yewh9 天前
嵌入式 linux Git常用命令 抽补丁 打补丁
linux·arm开发·git·嵌入式硬件·ubuntu·嵌入式·嵌入式软件
Jason_zhao_MR10 天前
基于米尔全志T527开发板的OpenCV进行手势识别方案
人工智能·mcu·opencv·计算机视觉·嵌入式
昊虹AI笔记11 天前
Source Insight的使用经验汇总
嵌入式
7yewh11 天前
LeetCode 力扣 热题 100道(十九)最长连续序列(C++)
c语言·数据结构·c++·算法·leetcode·嵌入式