基于NAND FLASH的虚拟扇区管理.doc_第1页
基于NAND FLASH的虚拟扇区管理.doc_第2页
基于NAND FLASH的虚拟扇区管理.doc_第3页
基于NAND FLASH的虚拟扇区管理.doc_第4页
基于NAND FLASH的虚拟扇区管理.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NAND FLASH 的虚拟扇区管理(FLASH的具体读写擦的过程)一 前提 1Flash存储编程特点Flash写:由1变为0,变为0后,不能通过写再变为1。Flash擦除:由0变为1,不能按位擦除,必须将整个block一起擦除,把一个block或整个Flash的内容都变成1。 当在一个block中进行存储时,一旦对某一block中的某一位写0,再要改变成1,则必须先对整个block进行擦除,然后才能修改。2. 没有VFS(虚拟扇区管理)之前的Flash数据存取方式先把整个block读到RAM中,在RAM中修改其内容,再擦除整个block,最后写入修改后的内容。3. 缺陷:1) 在Flash擦写过程中掉电,会造成整个块的数据丢失2) 每修改一次数据,对块进行了一次擦除,频繁的读-擦除-写操作,会影响Flash的使用寿命,每次需要花比较多的时间来完成数据修改操作,影响系统性能3) 每次进行Flash擦写之前,至少需要一个块大小的RAM为其备份,有时可能会造成RAM资源紧张4) 一旦出现坏块,则存储在该块的相关信息永久失效,造成系统崩溃4. VFS主要特点1) 动态映射逻辑扇区到物理地址;2) 物理块进行寿命均衡,记录Flash的擦写次数;3) 掉电数据恢复4) 记录坏块 二基本原理1嵌入式系统中数据读写擦的大体过程:应用程序嵌入式操作系统文件系统Flash存储管理Flash底层驱动Flash介质2概念VFS对应用数据使用的Flash块空间进行管理,将每个物理块划分成若干个物理扇区, 以扇区为最小单位进行数据存取, 每个物理扇区由512+4字节=516字节组成 ,512字节为有效数据空间,另外4字节(32位)用于存放逻辑扇区id和当前状态。定义如下:扇区状态(属性)逻辑扇区 (VSS ID)有效数据空间4位28位512字节VSS(Visual Small Sector),虚拟小扇区:以它为单位读写Flash内容。 VSS ID(Visual Small Sector Identity),虚拟小扇区号:只通过虚拟扇区号进行存储,不用考虑它的真实物理地址。 SI(Sector Identity),分割号:一个擦写逻辑块中物理扇区的顺序分割号。 BI(Block Identity),块号:Flash芯片中按擦除进行划分的块号。 SAT(Sector Allocate Table),扇区分配表:一个擦写逻辑块中的扇区分配表。一个SAT由许多SAT单元组成,一个SAT表对应一个Block,一个SAT单元对应一个VSS。 每个SAT单元最高两位为属性位,后面各位为VSS ID号。如果一个SAT单元由16位组成,则VSS ID最大可以达到161024;而如果SAT单元由8位组成,则VSS ID最大可以达到64,具体约定由应用情况而定。 3实现原理:把每个block分为更小的虚拟逻辑块(visual small sector),称为虚拟扇区,扇区大小根据应用而定。每个block前面的一固定单元用于记录本block中扇区分配的使用情况(即扇区分配表),包括扇区属性及扇区逻辑号。在进行数据读写和修改时,以虚拟扇区块的大小为单位。要修改某一扇区的数据时,先读出这个扇区的内容,重新找一个未使用的扇区,把修改后的内容写入这个新扇区。然后,修改原来扇区的属性值为无效,修改这个新扇区的属性为有效,拷贝VSS ID号到新扇区对应的SAT单元中。 这样,当某一个block中的SAT属性都标为无效时,才对当前block进行擦写。可见,以虚拟扇区大小为单位的存储管理,对Flash块的擦写次数可大大减少,从而提高了系统性能。 下图为示意图:扇区有五种状态(属性): 1)VFS_SECTOR_FREE (0xF) 空闲状态不需要主动设置,块被擦除后块内各扇区自动置成该状态2)VFS_SECTOR_INVALID (0xE)以扇区为单位存储数据时,先将扇区置成该状态,然后存储实际数据3)VFS_SECTOR_VALID (0xC)数据存储完后,将VFS_SECTOR_INVALID状态置成VFS_SECTOR_VALID状态4)VFS_SECTOR_USE (0x8)将旧数据存放的扇区状态由VFS_SECTOR_USE状态置成VFS_SECTOR_DISABLE状态后,将新数据存放的扇区置成该状态,完成用新数据替换旧数据的过程5)VFS_SECTOR_DISABLE (0x0) 新数据存储完成后,新数据扇区状态由VFS_SECTOR_INVALID置成VFS_SECTOR_VALID,将老数据扇区状态由VFS_SECTOR_USE置成VFS_SECTOR_DISABLE状态,然后再将新数据扇区状态置成VFS_SECTOR_USE状态以物理块大小64K为例,可以计算出每个块可以划分出127个扇区;(65536/516 = 127 余4) 剩下4个字节可以用来记录块的状态和该块被累计擦写的次数.块有五种状态(用4个bit表示):VFS_BLOCK_FREE: 空闲块VFS_BLOCK_WORK: 当前工作块VFS_BLOCK_OCCUPY: 已使用块VFS_BLOCK_DISABLE: 等待被回收的块VFS_BLOCK_BAD :坏块 4逻辑扇区映射: 由于Flash只能以块为单位进行擦除,如果逻辑扇区和物理地址是简单的一一对应关系,那么对扇区进行修改就必须先将整个块的内容擦除,然后再将新的数据写入Flash,势必会造成时间和Flash寿命的损失。因此我们就建立了扇区分配表(逻辑扇区映射表),使逻辑扇区与物理地址进行动态的匹配。这样,在修改某个扇区的内容时只要将数据写入一个新的扇区,然后将原扇区标记为disable就可以了。这样,还可以消除频繁修改某个块带来的寿命不均的影响。 映射表是建立在内存中,以逻辑扇区id为索引,项数为M(逻辑扇区总数)的数组,每项占用4字节,用于存放对应的物理地址。当某项为空(0xffffffff)时,说明该逻辑扇区id所对应的那部分应用数据因为所需的存储空间较小,未使用到该逻辑扇区. 因此,我们需要根据扇区分配表计算具体的所对应的物理地址。要对某个VSS ID进行读写操作,必须先找到其物理地址。 定位某个VSS ID物理地址的过程如下。 查找这个VSS ID所在的块号(BI)以及在这个块中所处的分割号(SI)。 从第一个block开始,搜索这个块的SAT表。首先搜索属性,只有属性为有效的才比较VSS ID号。如果条件满足,记录所在的块号BI及SAT的位置,即扇区分割号SI;否则,block号增加,继续按照上面步骤查找。找到VSS ID所在的块号及分割号(SI)后,这个VSS ID的物理地址为: ADDR=整个Flash的偏地址+ BLOCKID*BLOCKSIZE+SATSIZE+SI*SEC三操作过程1 写数据: a) 记录增加(写数据)。增加一个记录时,根据提供的 号,首先查找这个记录号是否在使用。如果还没有使用,则申请一个未使用的,把相在内容写入这个,修改其对应的单元,写入有效属性值和号;否则,进入记录修改过程。 存取数据的具体过程:说明:由于我们使用的service表等信息,一部分数据就占用一两个块(以上)空间,这个数据是一个整体,全部写入后数据才是有效的。所以,有必要把Flash写操作切割成三个步聚VFS_Data_Write_BeforeVFS_Data_Write_SectorVFS_Data_Write_After VFS_Data_Write_Before1)根据写入数据所需要的Flash大小,如果空间不够,就进行空间整理2)进入空间整理前,如果当前空闲空间不足一个块,则认为是2M Flash,沿袭旧有存储方式存储注:每次开机扫描flash后,可以得知应用数据使用了flash多少扇区(use扇区数),有多少disable扇区,有多少free扇区;只要free扇区数大于use扇区最小的块的use扇区数,即可以启动空间整理,按VFS新的存取方式存取又注:若使用过程中,应用数据所需的Flash空间越来越大,以致Flash无法保持一个块的空闲空间时,则把备用的空闲块释放出来给数据使用,数据存储方式变成旧方式3)如果判断即使把备用块用上,仍然达不到新数据所需的存储空间,则把老数据所用扇区disable,然后进行空间整理注:对于一次性所需空间把所有的空间利用上仍不够时,先把老数据所用的空间释放出来,再决定是否释放备用块,转成旧的存储方式4)如果空间足够,将新数据将要使用的扇区都置成invalid注:对于整体数据进行整体操作 VFS_Data_Write_Sector循环调用VFS_Data_Write_Sector,一次完成一个扇区的数据写入让外部循环调用,外部就不需要一次分配很大的RAM,RAM分配大小完全可由外部控制 VFS_Data_Write_After1) 把新数据使用的扇区都置成valid注:如果在此过程掉电,掉电恢复时判断有一个扇区是valid,则认为所有invalid扇区都是valid的,如果没有valid扇区,则掉电前写入的新数据无效,如果因为空间受限的原因,原数据已经disable了,则还是会出现数据丢失,这是因为空间受限无法备份引起,无法避免2) 老数据扇区置成disable注:如果在此过程中掉电,因为已经有valid扇区存在,会用valid/invalid替换掉use3) 新数据扇区置成use4) 更新逻辑扇区映射表b) 记录修改(修改数据)。当要修改一名片记录时,由 先把这个记录读入到中,然后修改其内容,重新找一个未使用的扇区,把修改后的内容写入到这个新扇区中,并拷贝其 号到这个新扇区对应的单元,修改其属性为有效,修改原来的扇区属性为无效。 2 删除数据 记录删除:要删除一个记录时,根据提供的 号,查找表。如果找到,修改其对应的属性为无效(disable);否则,说明这个记录不存在。3 .读取数据 (首先从RAM中查找,如果没有,进入记录查找过程)记录查找:由 号进行的查找:根据提供的 号,查找所有的表中属性为有效的 ,返回相应的及。根据名片的用户名查找:检测所有的表中属性为有效的 ,得到相应的及,由及定位到指定Flash物理地址读入用户各到中,比较是否相等。如果相等,读取并返回单元的 ;否则,继续查找。调用函数:VFS_Data_Read_Sector由外部循环调用VFS_Data_Read_Sector,一次完成一个扇区的读取4 Flash 空间整理 在存取数据时,如果Flash空间不够,就需要空间整理1) 取出disable扇区最多的块2) 判断当前剩下的free扇区数是否可以放下待整理块内所有的use扇区 ,如果可以,则启动整理模块,如果不可以,仍然沿袭原来的存储读写方式3) 整理过程中,只移动use扇区(只有use扇区是有效的,invalid/valid扇区在开机时调用V

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论