资源描述:
《基于NAND FLASH的虚拟扇区管理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、NANDFLASH的虚拟扇区管理(FLASH的具体读写擦的过程)一.前提1.Flash存储编程特点Flash写:由1变为0,变为0后,不能通过写再变为1。Flash擦除:由0变为1,不能按位擦除,必须将整个block一起擦除,把一个block或整个Flash的内容都变成1。当在一个block中进行存储时,一旦对某一block中的某一位写0,再要改变成1,则必须先对整个block进行擦除,然后才能修改。2.没有VFS(虚拟扇区管理)之前的Flash数据存取方式先把整个block读到RAM中,在RAM中修改其内容,再擦除整个
2、block,最后写入修改后的内容。3.缺陷:1)在Flash擦写过程中掉电,会造成整个块的数据丢失2)每修改一次数据,对块进行了一次擦除,频繁的读-擦除-写操作,会影响Flash的使用寿命,每次需要花比较多的时间来完成数据修改操作,影响系统性能3)每次进行Flash擦写之前,至少需要一个块大小的RAM为其备份,有时可能会造成RAM资源紧张4)一旦出现坏块,则存储在该块的相关信息永久失效,造成系统崩溃4.VFS主要特点1)动态映射逻辑扇区到物理地址;2)物理块进行寿命均衡,记录Flash的擦写次数;3)掉电数据恢复4)记录
3、坏块二.基本原理1.嵌入式系统中数据读写擦的大体过程:应用程序→嵌入式操作系统→文件系统→Flash存储管理→Flash底层驱动→Flash介质2.概念VFS对应用数据使用的Flash块空间进行管理,将每个物理块划分成若干个物理扇区,以扇区为最小单位进行数据存取,每个物理扇区由512+4字节=516字节组成,512字节为有效数据空间,另外4字节(32位)用于存放逻辑扇区id和当前状态。定义如下:扇区状态(属性)逻辑扇区(VSSID)有效数据空间4位28位512字节VSS(VisualSmallSector),虚拟小扇区:
4、以它为单位读写Flash内容。VSSID(VisualSmallSectorIdentity),虚拟小扇区号:只通过虚拟扇区号进行存储,不用考虑它的真实物理地址。SI(SectorIdentity),分割号:一个擦写逻辑块中物理扇区的顺序分割号。BI(BlockIdentity),块号:Flash芯片中按擦除进行划分的块号。SAT(SectorAllocateTable),扇区分配表:一个擦写逻辑块中的扇区分配表。一个SAT由许多SAT单元组成,一个SAT表对应一个Block,一个SAT单元对应一个VSS。每个SAT单元
5、最高两位为属性位,后面各位为VSSID号。如果一个SAT单元由16位组成,则VSSID最大可以达到16×1024;而如果SAT单元由8位组成,则VSSID最大可以达到64,具体约定由应用情况而定。3.实现原理:把每个block分为更小的虚拟逻辑块(visualsmallsector),称为虚拟扇区,扇区大小根据应用而定。每个block前面的一固定单元用于记录本block中扇区分配的使用情况(即扇区分配表),包括扇区属性及扇区逻辑号。在进行数据读写和修改时,以虚拟扇区块的大小为单位。要修改某一扇区的数据时,先读出这个扇区的
6、内容,重新找一个未使用的扇区,把修改后的内容写入这个新扇区。然后,修改原来扇区的属性值为无效,修改这个新扇区的属性为有效,拷贝VSSID号到新扇区对应的SAT单元中。这样,当某一个block中的SAT属性都标为无效时,才对当前block进行擦写。可见,以虚拟扇区大小为单位的存储管理,对Flash块的擦写次数可大大减少,从而提高了系统性能。下图为示意图:扇区有五种状态(属性):1)VFS_SECTOR_FREE(0xF)空闲状态不需要主动设置,块被擦除后块内各扇区自动置成该状态2)VFS_SECTOR_INVALID(0x
7、E)以扇区为单位存储数据时,先将扇区置成该状态,然后存储实际数据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_INVAL
8、ID置成VFS_SECTOR_VALID,将老数据扇区状态由VFS_SECTOR_USE置成VFS_SECTOR_DISABLE状态,然后再将新数据扇区状态置成VFS_SECTOR_USE状态以物理块大小64K为例,可以计算出每个块可以划分出127个扇区;(65536/516=127余4)剩下4个字节可以用来记录块的