liwen01 2024.01.01
从系统角度来看,文件系统是对文件存储器空间进行组织、分配、负责文件存储并对存入的文件进行保护和检索的一个系统。
它的目的是使用户和应用程序能够方便地管理存储器上的文件和目录,比如常见的对文件的增、删、改、查。
每当我们操作一个文件的时候,实际都会涉及到存储器、管理系统、被管理文件,还有就是实施文件管理所需的数据结构。
存储器,我们也叫存储介质,也就是电子设备用来存储数据信息的器件。
光盘存储已近逐渐地退出大众的视野,我们这里主要介绍磁存储和半导体存储。磁存储的代表就是机械硬盘,半导体存储已近被非常广泛地应用了,比如我们常用的U盘、SD卡、TF卡、固态硬盘等。
Flash其实也算是ROM的一种变种,现在广泛使用的 ROM 大部分都是基于Flash设计的。大部分固态硬盘的存储介质也是Flash。
RAM(随机访问存储器):
是一种临时存储器,用于保存正在运行时所需的数据和程序,可读可写,允许在需要时快速读取或写入数据,但它也是易失性存储器,设备断电时里面的数据会丢失。
ROM(只读存储器) :
用于存储固定的、不经常变化的数据和程序,它是只读的,通常在制造时被写入,并且其内容在正常操作期间不可更改。但它存在一些变种,如可擦写可编程只读存储器(EPROM)和闪存(Flash),它们允许有限次的可编程操作。
Flash存储器 :
它是一种非易失性存储技术,广泛用于各种电子设备、USB、固态硬盘等产品。它分为NOR Flash 和NAND Flash 两种
它采用 NOR(不或非)门结构,与NAND Flash相比,NOR Flash具有一些特定的特性和优势:
NOR门结构
NOR Flash, NOR就是“非或”的意思
NOR门是由两个输入端(A和B)和一个输出端组成的。其输出取决于输入信号的状态,具体逻辑运算规则如下:
NOR门的逻辑运算符号通常用符号“+”表示,其输出(Y)可以表示为:Y = A + B(其中,“+”表示逻辑或运算)。
NOR门的逻辑符号如下所示:
----- A --| | | NOR |---- Y B --| | -----
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 --| | -----
嵌入式设备中的应用
在嵌入式设备,一般是直接使用Flash存储器来存储程序和代码,按总线类型,可以分为串行和并行总线接口,在嵌入式设备中使用的比较多的是SPI串行总线。
比如常用来存储程序的SPI NOR Flash: PY25Q128HA、MX25L51245G、FM25Q128A、EN25QH128A、BY25Q128AS
它的特点是容量较小,可以随机访问。
组合应用
我们日常生活中使用到的固态存储器,比如U盘、SD卡、TF卡、固态硬盘等,它里面除了Flash存储芯片外,还有主控芯片、DDR内存、接口、PCB电路板。
下面是一个固态硬盘的内部器件,其它的固态存储设备也类似。
我们日常使用到的固态存储设备,比如TF卡、SD卡、U盘等,一般内部使用的都是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芯片中会因为自然放电、电场噪声、辐射等原因出现随机位翻转的现象,导致存储的数据位发生不可预测的变化。
因为 nand flash 有擦写次数的限制、有随机位翻转的问题、还有写入和擦除大小不一致的限制,现有针对机械磁盘设计的文件系统是不能直接应用在Flash上的,需要借助一个特殊的软件层——闪存转换层(FTL),来屏蔽闪存的底层差异,使上层系统可以透明地使用闪存。
相应的,固态存储的软件架构也要复杂很多。
FTL 中的地址映射确保上层文件系统可以使用逻辑块地址,而不用担心 NAND Flash 存储器的底层细节。这种映射关系的管理是 FTL 在保障 NAND Flash 数据稳定性、提高寿命以及提供高效读写的关键功能之一
逻辑块地址(LBA):
这是上层文件系统使用的块地址,通常是顺序递增的逻辑块编号。应用程序或文件系统将数据按逻辑块地址组织,而不需要关心底层 NAND Flash 存储的特性。
物理块地址:
这是 NAND Flash 存储器中实际的物理块的地址。由于 NAND Flash 进行擦写时只能对整个块进行,FTL 负责将逻辑块地址映射到物理块地址,并处理擦写时的块移动操作。
映射表:
FTL 维护一个映射表,记录逻辑块地址到物理块地址的映射关系。这个映射表通常存储在 Flash 存储器的特殊区域,如页或块中。
写入时的地址映射:
当应用程序向 NAND Flash 写入数据时,FTL 将逻辑块地址映射到一个可用的物理块。如果该物理块已经被写入过数据,FTL 需要擦除该物理块,将其标记为可用,并将新数据写入。这一过程需要更新映射表。
擦除时的块移动:
由于 NAND Flash 存储器的特性,每次擦写操作都会引发整个块的擦除。当需要擦除一个物理块时,FTL 需要将该块中的有效数据移动到其他块,然后标记该块为可用。这一过程同样需要更新映射表。
为什么会产生垃圾?
(a)不可原位更新:
当需要更新NAND Flash中的数据时,无法直接在原地进行更新。相反,新的数据必须写入一个新的空白页中,而原有的数据所在的页则被标记为无效。这导致存储器中同时存在有效和无效的数据,即产生了垃圾。
(b)擦写操作的不可细粒度:
NAND Flash的最小擦除单位是一个块,而最小写入单位是一页。如果需要更新某个页面的数据,整个块都需要被擦除,然后将更新后的数据写入。由于擦写和写入的单位不同,更新操作可能会导致未更改的数据也被重新写入,形成了垃圾。
(c)擦除前数据的标记:
当需要删除数据时,NAND Flash通常会将相应的页标记为无效,而不是立即擦除。这样,数据被删除后,原来的页仍然存在,但被标记为无效状态,形成了垃圾。
(d)写入放大:
写入放大是指为了写入少量数据而触发的大量物理写入。由于不可原位更新和擦写操作的不可细粒度,写入操作可能导致更多的物理页被写入,从而增加了实际写入量,也增加了垃圾的产生。
这些因素共同作用,导致NAND Flash中垃圾的产生。为了解决这个问题,存储系统采用垃圾回收机制,定期清理无效的数据,擦除无效块,以便重新利用存储空间,并最大程度地减少擦写次数,延长NAND Flash的寿命。
垃圾回收的一般流程:
为什么会产生坏块?
(a)擦写次数限制:
NAND Flash的每个块都有一个有限的擦写寿命,即可以执行的擦写次数是有限的。当某个块达到了其擦写寿命上限,该块就会被标记为坏块,不再可用。这是由于擦写操作引起的物理损耗。
(b)随机位翻转:
存储器单元可能受到环境中的辐射、电场噪声或其他干扰,导致数据位发生随机翻转。当这种情况发生在存储器中的某个块时,该块可能变成坏块,因为存储的数据无法正确读取。
(c)存储介质的不稳定性:
NAND Flash使用的存储介质(通常是浮栅)可能因为制造过程或质量问题而导致某些块不稳定。这种不稳定性可能导致块的性能下降,或者在使用中产生坏块。
(d)擦写时的错误:
在擦写操作中,由于电压不稳定、温度变化或其他因素,可能发生错误。这些错误可能导致擦写操作未能正确完成,从而使得块成为坏块。
(e)制造过程中的缺陷:
制造过程中可能存在一些缺陷,导致某些块在生产阶段就不完整或有问题。这些块可能在设备制造过程中被标记为坏块。
坏块管理的一般流程
(a)坏块检测:
(b)坏块标记:
如果检测到坏块,将其标记为坏块。这可以通过在坏块表中记录坏块的位置或使用其他元数据方式来实现。
(c)坏块替代:
一旦坏块被检测并标记,系统需要寻找可替代的块。这通常包括从备用块池中选择一个可用的块来替代坏块。备用块通常是在 NAND Flash 设备制造时预留的。
(d)更新坏块表:
如果替代块被选择,需要更新坏块表,将新块的位置标记为有效块。这确保了系统在后续操作中不会再使用已标记为坏块的块。
(e)数据迁移:
如果坏块替代发生在运行时,系统可能需要将原始块中的有效数据迁移到替代块中,以确保数据的完整性和可靠性。
磨损均衡是为了最大程度地平衡 NAND Flash 存储器中擦写寿命的消耗,从而提高存储器的性能、可靠性和寿命。
磨损均衡的策略一般有:
(a)块循环使用:
块循环使用是最简单的磨损均衡策略之一。它通过轮流使用存储器中的块,而不是过度依赖于特定的块。这有助于分散擦写操作,减轻存储单元的磨损。
(b)Wear Leveling(磨损均衡)算法:Wear Leveling 算法是一种专门设计的算法,旨在在整个存储器中均匀分配擦写操作。这种算法考虑每个块的使用情况,优化写入和擦除操作的分布,以降低存储单元的不均匀磨损。常见的 Wear Leveling 算法包括静态均衡和动态均衡算法。
(c)动态坏块管理:
动态监测并管理坏块,确保它们不会集中在特定区域。当检测到新的坏块时,系统可以调整块的分布,以确保损耗均匀。
(d)块交换:
进行块交换,将频繁写入的块与很少写入的块进行交换。这有助于平衡擦写操作,减缓块的磨损。块交换可以是静态的,也可以是动态的,根据系统的需要进行调整。
(e)备用块池的合理使用:
在 NAND Flash 制造时,通常会预留一些备用块。合理使用备用块池,确保块的磨损相对均匀。
(f)周期性的擦除操作:
定期执行擦除操作,即使块中没有无效页。这有助于重置块的状态,减小块的磨损程度。
手机越用越卡,除了器件的老化问题之外,还有一个原因就是存储设备里面的数据接近存储卡容量,导致存储设备写数据变慢了。
为什么容量满了就会变慢了呢?这主要与写放大和垃圾回收有关系。
假设要写入一个4KB的数据,但已经没有干净空间了,只有失效的数据可以擦除,所以主控就把所有的数据读取到缓存存,然后擦除一个块,再加上这个4KB新数据写回去,这就造成了写入放大,本来是需要写4K的数据,却写入了512K的数据,也就是128倍放大。
上面只是个假设,实际有垃圾回收策略的接入,不会是128倍这么大。下面是IBM Zurich Research Laboratory做的研究,实际证明写放大与空闲净块关系极大
上图可以看出,空闲块少后,写放大可以到达3~4倍
尽管固态存储设备发展迅猛,但传统的机械硬盘存储还是有很大的市场占有量,因为它数据稳定,同等价格下,存储容量更大。
我们从外部看,一个机械硬盘上有:主控芯片、高速缓存、电源接口、主从设置电路、数据接口、控制电路板。
机械硬盘的内部结构主要有:磁头组件、盘片、主轴组件、电机、接口等
我们用一张唱片的盘面来类比硬盘的的盘面,可以看到上面有明显的盘面、磁道、柱面,机械硬盘的内部盘面也类似。
盘面(Platter):
磁道(Track):
柱面(Cylinder)
扇区(Sector):
1. 盘片旋转:
2. 数据的磁性存储:
3. 磁头的运动:
4. 读写数据:
CHS寻址模式(Cylinder-Head-Sector)
逻辑块地址(LBA)寻址模式
我们买的U盘、SD卡等存储设备,一般我们买回来就可以直接使用,并不需要做什么分区格式化。那是因为在设备出厂之前,厂家已经预先做了这些工作。
一个存储设备在出厂之前,一般都是需要做:
详细的分区格式化我们在下一章在介绍。
计划将文件系统相关的知识点整理输出成一个系列的文章:存储介质介绍、分区格式化、系统启动、FAT系列文件系统、ext系列文件系统、NTFS文件系统、嵌入式文件系统、文件IO等