基于NAND FLASH的高速嵌入式系统

基于NAND FLASH的高速嵌入式系统

嵌入式存储系统的均衡磨损控制
NAND Flash芯片对于数据块本身,可根据其使用情况,将其分为四种:已坏块、已用块、有效块和无效块。已坏块是不能再次使用的数据块,已用块则代表了系统中写入了有用数据的数据块,有效块则代表可以向其写入新数据的数据块,无效块则是由已用块转换得来的,代表块中数据可被擦除的数据块。为了节省在对NAND Flash芯片写入操作前的数据块擦除时间,需要将存储空间进行分区,以分离写入和擦除操作。本文中设计将系统分为三个区:可用区、交换区和坏块区,如图所示:
在这里插入图片描述
NAND Flash系统分区示意图
区域分配的意义主要是为了管理可用的自由空间,当用户要进行写入操作时,需要先申请自由空间当中的数据块,系统可根据现有的使用情况,决定分配哪一种属性的自由区块。其中坏块区是专门用来存放系统已坏块的空间,交换区是专门用来存放有效块的空间,可用区一部分存放的是已用数据的已用块,另一部分存放的是等待擦除的无效块。为了平均每一个数据块的使用次数,方便系统进行数据块的管理,本文将系统中的物理地址和逻辑地址进行区分。采用全相连映射,不仅实现坏块管理的功能,保证坏块不被映射到逻辑地址中,还能够保证不同属性区域的灵活调动。在数据块被操作后,只要改变其地址的映射关系和区块属性即可,实现了地址的连续性管理。
如图中的序号标识所示,当执行新的写入操作时,若发现被更新的文件的物理地址已用,则选择交换区中的空间进行写入。同时,将原文件的地址标记为无效状态,当前空间标记为已用状态,并将其区域属性转换为可用区。在系统空闲且无效的区块数量达到一定程度时,系统在特定的时机启动对无效区块的清除操作,回收无效资料占用的存储空间,转存至交换区,以备下次的文件更新使用。对于系统空闲时的无效块管理的流程如图所示:

在这里插入图片描述

无效块管理流程图
针对上述基本的文件更新过程,在数据块的擦除次数相对均匀的时候,每次选取任意一个空闲的物理区块写入数据即可。但是,当数据块的擦除次数出现不平均的现象时,需要遵循“最少擦除块优先”的策略,选取擦除次数少且空闲的数据块作为写入对象。

在这里插入图片描述
软件操作流程图
然而,在文件的存储过程中,随着过渡的擦除倾斜会使得剩余的空闲数据块的擦除次数接近极限。而对于另一些数据块,由于一直存放的文件没有被更新,使其被擦除次数很少。这时就需要在系统空闲的时候,将所有的冷文件(很久没有更新的文件)搬移到擦除次数比较多的数据块中,而把擦除次数比较少的数据块空闲出来,以供后续使用。这样,就实现了NAND Flash存储空间利用的最大化,平均了每一个数据块的擦除次数,延长了存储系统的使用寿命。
存储介质坏块管理
为了避免因为NAND Flash工艺原因产生的坏块对存储系统的数据影响,本文设计了一套动态的坏块管理方案,不仅能够在初始坏块表的基础上实时地添加随机产生的坏块,并且能够实现数据的实时缓存,确保被误存入坏块中的一部分信息完整地被保留下来,存储到有效的数据块之中。
首先,必须通过识别初始坏块,建立坏块表。在NAND Flash的处理器系统中,独立地维护M×N套坏块表,每个坏块表中记录着各组芯片坏块的编号。在进行擦除、写入或读取操作之前,先将此次操作的数据块的序号与本组芯片的坏块表中的数据进行对比。若当前操作的数据块是坏块,则进行跳过,屏蔽坏块对存储信息的影响。然后,检测下一数据块,直到找到一个有效块,将信息存储到数据块中。
在芯片的使用过程中,可能出现新的坏块,这就要求在每次进行擦除或写入后读取状态寄存器,判断是否操作成功。如果失败,则认为此块为新增坏块,将其编号更新到坏块表。如果在写入过程中发现,则还需将块内已写数据使用复制(Copy Back)命令搬移到下一个有效块。其操作如图所示,本文在NAND Flash的FPGA控制器中设计了一个缓存区,其空间能够缓存一页大小的数据量,对数据起到备份的作用。
在这里插入图片描述
新增坏块操作示意图
具体坏块表的建立和维护流程如图所示。若在第n页的写入过程中发现操作失败,首先标记此块为坏块,将其块编号更新到坏块表中。然后,立即寻找下一个有效的替换块,一方面将n-1坏块中的前页的数据搬移到新的数据块,另一方面将出现错误的第n页的数据从缓存区中取出,存入替换块的相同页地址之中。最后,继续将前端的数据依次存入未用的NAND Flash空间。

在这里插入图片描述

坏块表建立与维护流程图
坏块的产生导致了芯片物理地址的不连续,此设计通过FPGA控制器实现了芯片物理地址的透明化,屏蔽了系统产生的坏块,从而让用户可以使用连续的逻辑地址实现对数据的正确存取。

文件管理
嵌入式存储系统可以采用FAT32 文件系统或extfs等嵌入式文件系统实现文件的管理配置。同时也可采用简单非标准的链表文件系统。由上文所述的动态坏块管理和均衡损耗策略可知,本文将存储模块中的物理地址空间映射为简单的逻辑地址空间。使系统在实际使用过程中,达到对数据信息更加直观透明的操作,提高了数据的访问的效率。

地址映射层次
针对基于FPGA的嵌入式NAND Flash存储模块,本文设计了一个层次化的地址映射关系网络。在如图中的层次结构中,实现了自底向上的地址规划策略。通过坏块管理层的处理,使实际物理地址中坏块及比特错误获得屏蔽,获得了一级的物理地址与逻辑地址的映射。动态坏块管理层主要实现了针对一级逻辑地址的属性的划分和操作次数的统计,在这一层中可以根据不同的区块使用频率,得出统计和计算结果,为上层的均衡损耗做好准备。均衡损耗管理层会依据底层统计的数据,将地址进行合理的调度,同时扩充系统的剩余可用空间。最顶层即为文件管理层,在这一层中,系统可以直接利用经均衡损耗处理过的二级逻辑地址,实现区块的直接调用,根据不同的文件大小,选择可用的区块数量进行数据的存储。其地址的层次划分示意图如图所示:

地址映射分层示意图
一级逻辑地址和物理地址的映射
一级逻辑地址是在坏块管理层中产生的,所谓的一级逻辑地址,主要实现了针对底层物理地址中坏块的屏蔽。所以,一级逻辑地址实际上是物理地址中仅去除坏块的地址,将剩余的地址连续起来,能够为上层接口提供所有可分配的一级逻辑空间。
在这里插入图片描述
二级逻辑地址和一级逻辑地址的映射
二级逻辑地址是在均衡损耗管理层中产生的,均衡后的地址既解决了对新数据写入操作地址的选择问题,实现了有效数据块使用次数的均匀化,又实现了对冷、热数据的定期位置交换,最小化了整个存储系统中的已用数据块、有效数据块、和无效数据块之间擦除次数的差异。所以,二级逻辑地址实际上对一级逻辑地址做了很大的映射变更,根据每一个数据块的擦除次数,近乎实现了地址空间中所有数据块有序的排列。从而极大地解决了上层文件系统管理时的有效地址调用问题。
文件管理设计
如下图所示,为本文提出的一种基于ARM软件控制的嵌入式NAND Flash文件管理架构,其文件管理主要是在ARM内部实现,利用两级节点链表,实现一个二维的文件信息组织架构。
图34 存储单元文件管理链表示意图
其链表的结构可以分为两级,第一级是以文件头串连起来的文件信息链表。文件信息链表中的每个节点都表示一个记录文件,空闲空间作为一个特殊的节点位于文件信息链表的起始位置。每个文件信息节点中标记了记录文件的索引信息,包括文件索引号、文件类型和文件数据长度等信息。每个文件信息节点对应一个存储单元链表,这些链表组成第二级的链表。每个存储单元链表又由若干个存储单元节点构成,每个存储单元节点对应NAND Flash存储空间的一块物理空间,存储单元节点对应物理空间大小可以通过软件配置。由于NAND Flash芯片中每块大小约为128K,所以其每个存储单元可以由若干个物理数据块组成。存储单元节点记录文件数据存储的物理空间地址和时间戳等信息。
对于此文件系统链表的管理,可以分为五种基本操作,分别为链表初始化、链表格式化、新建文件、读取文件和删除文件操作。初始化存储单元链表时,先将物理存储空间按照固定大小分成若干个单元(Block),记录每个单元的物理存储空间起始地址,按地址增加方向为每个存储空间分配一个索引号。格式化操作时,ARM处理器采用深度优先遍历的方式遍历文件信息链表。将每个文件对应存储单元链表中的节点删除并增加至空闲空间对应存储单元链表的末尾位置。格式化完成后,文件链表中的文件信息链表中仅包含空闲空间一个节点,该节点对应的存储单元链表覆盖存储节点的所有数据区,此时所用记录空间都被释放。
新建文件仅在记录和读取时进行。新建文件时,上位机下发新建文件命令给ARM,ARM接收到新建文件命令后执行新建文件操作。新建文件过程包括“新建文件信息”、“更新新建文件节点存储单元链表”和“完成新建文件”三个步骤。其过程示意图如下图所示:
记录或读取开始时,首先执行“新建文件信息”操作,主要完成在文件信息链表中增加一个新节点、将文件名、文件备注信息和文件开始时间等信息添加到文件信息链表的新建文件节点中。记录过程中,执行“更新新建文件节点存储单元链表”操作,每次开始记录一个存储单元之前,将空闲空间节点对应存储单元链表的第一个节点删除,并增加到新建文件对应存储单元链表的末尾位置。每次完成一次记录后,增加文件信息链表新建文件节点的“文件大小”选项。记录结束时,执行“完成新建文件”操作。“完成新建文件”同样将空闲空间节点对应存储单元链表的第一个节点删除,并增加到新建文件对应的存储单元链表末尾。记录最后一个存储单元中有多少是有效数据。每次记录完成后将ARM处理器内存中的文件链表存储到外部的NOR FLASH存储空间。
在这里插入图片描述
新建文件链表示意图
读取文件时,上位机同样向ARM下传读取文件命令,并下传读取文件的标识。ARM接收到读取文件命令后,根据文件索引号遍历文件信息链表查找对应的文件。回放过程中,根据文件信息链表的回放文件节点对应的存储单元链表依次读取文件内容,每读完一个单元节点对应物理空间的内容之后,继续读取下一个单元节点对应物理空间的内容,直到读取到最后一个存储单元节点,当读取最后一个单元节点对应物理的内容时,根据已记录的最后一个单元中有效数据的长度读取文件内容。
删除文件时,ARM处理器通过判断上位机发送下来的删除文件标识,根据文件索引号遍历文件信息链表查找到对应的文件。执行删除操作时,保留该文件对应文件信息节点,但将“文件类型”标识标记为“已删除文件”,将该文件对应存储单元链表中的全部节点删除并增加至空闲空间对应存储单元链表的末尾位置。

arm FPGA nor flash 外部指令 DDR NAND FLASH 启动坏块侦测 坏块信息数据表 存储坏块信息数据表 开始数据写入,循序写入模式 读取文件链表,转换物理地址 启动写入,物理首地址为X,写入长度为Xpage 数据缓存 启动多通道NAND FLASH 写入 数据写入完成,中断,已写入数据xpage 写入已完成。 完成后arm 更新文件链表 arm FPGA nor flash 外部指令 DDR NAND FLASH