主要介绍:
1.总揽:
a. Flash的结构:Partitions and Blocks
b. 编程数据;
c. 数据完整性;
2.文件系统功能:
a.读写平衡;
b.资源回收;
c.读写同时;
d.空间管理;
e.代码管理;
3.文件系统结构:
4.可靠性:
a.掉电保护;
b.纠错;
c.坏块管理(仅NAND);
5.文件系统性能
6.小结
Partitions
Flash设备通常会划分成一块或数块称为“区”(Partitions)。多区结构可以使处理器在一个区读的时候在另一个区完成写/擦操作,单块设备类似的多任务同样可以由软件来处理
Blocks
除了“区”之外,Flash设备还被进一步分成更小的存储部分称为“块”(Blocks),根据块的大小是否相同,分为对称和非对称的块结构,前者拥有大小完全相同的块,后者有一些比主要阵列小很多的块,通常小块或参数块用来存放少量数据或引导代码,典型的,块的大小从64Kb到256Kb变化。
数据编程(Programming Data)
Flash设备允许编程数据值从单个“1”变成单个“0”,但不能从单个“0”变成单个“1” 。要将值恢复到“1”需要对整个块进行擦除。通常情况下,当数据编辑后,需要写到新的位置并且是旧的数据无效,最后,无效的数据会被回收,这通常会作为后台程序处理
数据完整性(Data integrity)
在硬件层面,写入Flash的数据完整性是由ECC算法实现的。对于NAND,坏块管理是另一个数据完整性问题,NAND本身的可信度会较NOR差,在其生命周期,会部分出现坏块。
另一数据完整性问题是掉电
读写平衡(Wear Leveling)
Flash的每个存储块都是有擦写次数限制的,为了延长使用寿命,擦写需要尽可能的遍及所有的块,这需要有软件来处理
回收(Reclaim)
编辑文件通常不是在当前的位置,更合适的数据会写到新的位置,旧的数据会无效,无效的数据会在固定的间隔清除——这叫做垃圾收集或回收。对块进行回收操作时,有效的数据会被复制到一个干净/已擦的块称做备用块,回收过程完成后,旧块会被擦除从而成为新的备用块。通常,回收会作为一个优先级较低的后台任务执行。但是,当文件系统在空闲空间比较小时,文件系统会调用“紧急状态”使回收优先执行。智能回收算法可以减少碎片、优化系统性能。
读写并行(Read While Write)
多区Flash会比较容易实现,而单区Flash通常就更多的需要软件来协调支持
存储器阵列管理(Memory Array Management)
Flash配置涉及单区和多区,对称、非对称块,顶端、底段引导等等。另外,多片Flash还可能堆叠一起,进一步增加了配置的难度。为了最优化的使用Flash和支持不同的配置,Flash文件系统必须有应用需要的映射存储空间能力。
间隙支持(gap support)即为其中之一,两个Flash堆叠时,用户看到的是一个连续的地址的存储空间。
另一功能是虚拟分区支持。应用程序通常将代码和数据写到独立的区上,单区(或比较大的区),文件系统可以使设计者通过软件指定虚拟代码和数据分区的大小和边界。
代码管理
Flash设备会同时存储代码(软件可执行的)和数据。针对嵌入式系统,有两种代码管理技术:存储下载(Store and Download——SnD)和现场执行(eXecute in Place——XiP)
SnD:将代码全部或部分(分页支持)拷贝到RAM再执行;
XiP:无须拷贝到RAM,直接执行;
XiP需要随机存储设备,所以此种方式只能被NOR支持,可执行的代码还需写到连续地址空间并且满足OS的要求,如分页管理。NAND只支持块存储,因此只能使用SnD方式
文件系统结构
大多数文件系统包含下列部分:
API层;
文件系统核;
块驱动(基于扇区的文件系统);
存储设备层;
API层:外部应用程序访问文件系统功能的通道,允许文件系统内部改变不影响外部应用;
基于扇区的文件系统(如FAT)会提供扇区的读、写、删除操作——API
MTD:提供Flash的一些信息,如:类型、缓冲大小,块/区大小,读写限制等等
可靠性
掉电恢复
如果掉电发生在读操作期间,可以认为读操作没有完成;
若掉电发生在编程期间,文件系统需要返回到上一步认为完好的状态
掉电恢复通常使用状态标志位或CRC(Cyclic Redundancy Check)标志
ECC(Error Code Correction)
广泛使用在NAND中,能够检测纠正一位错误
坏块管理(仅NAND)
文件系统性能:
可靠性历来是嵌入式文件系统的重要性能指标。
一些关键的可量化指标有:
读速率;
写速率;
回收;
初始化时间;
文件操作(创建、打开/关闭、重命名、删除、查找).
The end
整理参考:《Flash File Systems Overview》—— Intel