CN108710578B - 基于闪存的数据存储方法和装置 - Google Patents
基于闪存的数据存储方法和装置 Download PDFInfo
- Publication number
- CN108710578B CN108710578B CN201810361678.0A CN201810361678A CN108710578B CN 108710578 B CN108710578 B CN 108710578B CN 201810361678 A CN201810361678 A CN 201810361678A CN 108710578 B CN108710578 B CN 108710578B
- Authority
- CN
- China
- Prior art keywords
- index
- data
- user data
- area
- size
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0238—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
- G06F12/0246—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory in block erasable memory, e.g. flash memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了基于闪存的数据存储方法,闪存分为索引区和数据区,写入用户数据的操作包括以下步骤:基于索引表获取数据区的起始块的位置、第一个空闲页的位置和剩余空闲页数;如果待写入的用户数据的大小小于数据区的剩余空闲页的大小,则从数据区的第一个空闲页起写入该用户数据;否则将先备份有效数据,再从数据区的起始块起顺次擦除相当于所述闪存的数据区所占块数的所有的块,再将备份的有效数据写入从数据区的起始块起的页,再将所述待写入的用户数据写入后续空闲页;更新索引表。还提供了基于闪存的数据存储装置,以克服闪速存储器的数据管理系统读取慢,大幅降低存储器寿命的问题。
Description
技术领域
本发明涉及存储器管理方法,特别涉及一种基于闪存的数据存储方法和装置。
背景技术
随着物联网的兴起,智能硬件给人们生活带来很多便利。智能硬件需要在本地储存一些设备数据,因考虑成本,其中很多智能硬件都是使用RTOS实时操作系统,挂载SPIFLASH来作为储存介质。但是因为SPI FLASH的一些特性(例如在基于NOR FLASH或者NANDFLASH技术的SPI FLASH芯片中,“块”是擦除操作的基本单位,每块大小一般是4KB,在擦除操作时将快内所有的位置置“1”;页是读写操作的最小单位,然后每块又分成页,每页大小一般是256字节,要修改SPI FLASH芯片中一个字节,必须重写整个数据块。不能直接覆盖写入,只能是擦除后再写),导致储存本地数据时,需要执行以下4个步骤:将闪存中的数据块读入内存;在内存中修改数据;擦除闪存的数据块;将修改后的内存中的数据存入闪存中的数据块。最终才能完成数据保存。这样操作方式具有以下缺点:耗时,由于SPI FLASH的最小块为4K,在修改的数据量较小时,需要同时操作以4K为单位的数据(即一整个数据块);降低SPI FLASH的寿命,由于SPI FLASH的块寿命是由擦除与写入的次数决定,传统的文件管理;容易丢失数据,由于这类产品随时都可能掉电,如果在擦除完成,还没有写入时掉电的话,将会丢失所有数据。
综上所述,智能硬件产品需要一种高效、稳定、可靠的存储管理方法来对小型文件(数据)的存储和读取进行管理。
发明内容
本公开的目的在于提供一种基于闪存的数据存储方法和装置,克服SPI FLASH等基于闪速存储器(闪存)的数据(文件)管理方法大幅降低存储器寿命的技术问题。
为了解决上述问题,根据本公开的第一个方面,提供了一种基于闪存的数据存储方法,其中闪存的存储空间被分为索引区和数据区,索引区和数据区分别包括不同的块,索引区包括具有1个以上的索引项的索引表,索引项包括用户数据标识、用户数据大小和用户数据位置;其中,写入用户数据的操作包括以下步骤:A1.基于索引表,获取数据区的起始块的位置、第一个空闲页的位置和剩余空闲页数;A2.比较待写入的用户数据的大小和数据区的剩余空闲页的大小,如果待写入的用户数据的大小小于数据区的剩余空闲页的大小,则从数据区的第一个空闲页起写入该用户数据;否则将先备份有效数据,再从数据区的起始块起顺次擦除相当于所述闪存的数据区所占块数的所有的块,再将备份的有效数据写入从数据区的起始块起的页,再将所述待写入的用户数据写入后续空闲页;A3.更新索引表。
进一步地,更新索引表的步骤包括以下子步骤:B1.读取索引区内的索引表;B2.查找在索引表内是否存在其用户数据标识对应为写入的用户数据分配的标识的索引项,如果存在该查找的索引项,则基于为写入的用户数据分配的大小和位置而更新该查找的索引项,以形成新的索引表;如果不存在该查找的索引项,则基于为写入的用户数据分配的标识、大小和位置而创建新的索引项;B3.在创建新的索引项时,如果索引表的索引项数未达到上限,则在索引表的最后一项后添加所述新的索引项,以形成新的索引表;否则将索引表中有效的索引项读入内存,再擦除索引区,并从索引区的起始页起写入有效的索引项和所述新的索引项,以形成新的索引表;B4.更新索引区。
进一步地,读取用户数据操作包括以下步骤:C1.读取索引区内的索引表;C2.查找在索引表内其用户数据标识对应待读取的用户数据的标识的索引项;C3.基于该查找的索引项的用户数据大小和用户数据位置,读取对应的用户数据。
进一步地,在写入用户数据时,如果待写入的用户数据的大小大于数据区的剩余空闲页的大小的次数大于预设的阈值,且剩余空闲页的大小大于索引区的大小时,将索引项写入剩余空闲页,以作为新的索引区。
进一步地,索引项的用户数据大小为用户数据的页数;索引项的用户数据位置为用户数据的起始页距离数据区的起始页的偏移页数。
根据本公开的第二个方面,提供了一种基于闪存的数据存储装置,其中闪存的存储空间被分为索引区和数据区,索引区和数据区分别包括不同的块,索引区包括具有1个以上的索引项的索引表,索引项包括用户数据标识、用户数据大小和用户数据位置,数据存储装置包括用户数据写入模块,用户数据写入模块包括以下子模块:第一写入子模块,用于基于索引表,获取数据区的起始块的位置、第一个空闲页的位置和剩余空闲页数;第二写入子模块,用于比较待写入的用户数据的大小和数据区的剩余空闲页的大小,如果待写入的用户数据的大小小于数据区的剩余空闲页的大小,则从数据区的第一个空闲页起写入该用户数据;否则将先备份有效数据,再从数据区的起始块起顺次擦除相当于所述闪存的数据区所占块数的所有的块,再将备份的有效数据写入从数据区的起始块起的页,再将所述待写入的用户数据写入后续空闲页;第三写入子模块,用于更新索引表。
进一步地,数据存储装置还包括索引表更新模块,索引表更新模块包括以下子模块:第一更新子模块,用于读取索引区内的索引表;第二更新子模块,用于查找在索引表内是否存在其用户数据标识对应为写入的用户数据分配的标识的索引项,如果存在该查找的索引项,则基于为写入的用户数据分配的大小和位置而更新该查找的索引项,以形成新的索引表;如果不存在该查找的索引项,则基于为写入的用户数据分配的标识、大小和位置而创建新的索引项;第三更新子模块,用于在创建新的索引项时,如果索引表的索引项数未达到上限,则在索引表的最后一项后添加所述新的索引项,以形成新的索引表;否则将索引表中有效的索引项读入内存,再擦除索引区,并从索引区的起始页起写入有效的索引项和所述新的索引项,以形成新的索引表,第四更新子模块,用于更新索引区。
本发明的有益效果在于:1:占用内存少,非常适合在小型的系统实施;2:更新数据速度非常快,在更新N个页的用户数据时,只要写N+1或N+2个页的时间,提升用户体验;3:因SPI FLASH在全部被使用完后才会被擦除一次,增加了产品的寿命,提高竞争力;4:在使用过程中,数据不易丢失,提供可靠储存,从而提升产品的整体竞争力。
附图说明
图1是根据本公开实施例的算法初始化方法的具体流程图;
图2是根据本公开实施例的用户数据写入方法的具体流程图;
图3是根据本公开实施例的用户数据读取方法的具体流程图。
具体实施方式
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接相合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在二个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在二个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域技术人员应当理解,在本申请的说明书中,“首先”、“其次”、“第一”、“第二”、“A”、“B”等用语,如无特别声明并不表示对先后顺序的限制。例如,“步骤三”可以在“步骤一”之前,“D”也可以和“A”同时进行。
闪存(Flash Memory,又称“闪速存储器”)是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器,数据删除不是以单个的字节为单位而是以固定的区块(Block,又称“块”)为单位,区块大小一般为256KB到20MB。闪存是电子可擦除只读存储器(EEPROM)的变种,闪存与EEPROM不同的是,EEPROM能在字节水平上进行删除和重写,而闪存的大部分芯片需要块擦除。由于其断电时仍能保存数据,闪存通常被用来保存设置信息,如在电脑的BIOS(基本程序)、PDA(个人数字助理)、数码相机中保存资料等。在过去的30年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码,或者直接当硬盘使用(U盘)。
闪存具有以下重大特性:
1、不支持本地更新(outplace-update,即不能在原数据位置进行覆盖写入或者直接更改,更改数据需要将更改后的数据搬迁至新的可用的页(Page),原有位置的页被标示为无效页,必须要先擦除无效页才能在原位置重新写入数据);
2、以页为单位写入,以块(Block)为单位擦除(如将该块内的所有位置“1”),擦除块需要先将可用页中的数据搬迁,那么,当有大量的块可以被选择擦除时,搬迁哪些块中的页并重新利用就关系到对不同块的擦除次数,每一次对块的擦除操作需要消耗大量的时间;
3、每个块有擦除次数限制,寿命主要取决于某块的擦除和写入的次数,经常被擦除的块会很快成为“坏块(bad Block)”因此,只有均衡每个块的擦除次数,才能让闪存具有更长的使用寿命。
因此,在智能硬件等嵌入式系统领域,当利用闪存(例如,SPI FLASH)作为存储介质时,由于存储的数据往往较小(小于1个块,或者略大于1到2个区块),且更新频繁,因此按照传统的存储管理方法存储和读取用户数据,则需多次反复擦除区块,耗费时间长,降低了SPI FLASH的寿命。
为了提供方便用户写入和读出用户数据,算法将整个闪存的物理存储区域划分为索引区与数据区这两个逻辑分区。其中,索引区占用1个或多个的区块,用于存储数据索引表;数据区占用其它剩余的块,用于存储用户数据本身。优选地,索引区和数据区分别包括不同的完整的区块,以保证不会有一个区块的一部分页属于索引区,而另一部分页属于数据区。
现对这两个分区进行分别介绍。
索引区,主要是用来储存将用户数据(例如小型数据)映射到数据区物理位置的数据索引表,数据索引表由一个或多个索引项组成,每个索引项包括用来指引相应用户数据的数据标识、数据大小和数据储存位置。在本例中,对每个同一类型的用户数据赋予一个标识,以用来判断内存中的用户数据和存储在闪存中的用户数据的同一性。因考虑空间的使用率和方便用户的使用,在本例中,储存用户数据的标识使用两级编号,例如1-1、1-2、2-2的方式。示例性的,每个索引项的储存的数据结构如下:
从上面可以看出,每个索引项占用5个字节,SPI FLASH每个页是256字节,因储存的数据索引表可能会大于一个页,所以对数据索引表的页进行编号,从0开始,第一个页的编号为0,第二个页编号为1,依次类推,第N个页编号为N-1。所以数据索引表的页的数据储存为:页编号+索引项1+索引项2+...+索引项50,每个索引页可以储存50条索引项,为了方便简化算法实现,当前设计只讨论最多包含2个索引页,也就是最多支持100个不同索引项及其对应的用户数据的保存,相对一些简单的RTOS系统来说是足够的。由于在本例中,索引区只占用了一个(区)块,因此以下也将索引区称为索引块。但是本领域技术人员应当理解,索引区的大小并不限于一个区块。
数据区,即用于存储用户数据储存区域。当用户要获取数据时,先通过读取存储在索引区内的数据索引表,从中查找到对应用户数据的标识的索引项,再使用索引区的数据大小和数据存储位置(例如,相对数据区首页的偏移页码数),找到位于数据区的相应物理位置(区块位置),进行数据读取。在本例中,数据区的大小为除了索引块外的剩余闪存存储空间。
下面先简要介绍一下数据写入闪存过程的基本原理。
例如,当用户使用一级ID为9,二级ID为0的用户数据向系统写大小为567字节时,因567>512=256*2,所以要用三个页才能保存这些用户数据。每个用户数据的写入都将分两个分区的写入,第一次是更新索引区,第二次是将用户数据写入数据区。
第一次的索引区的更新方式为:先将存储于索引区所有的有效的索引项(即用户数据标识、数据大小和数据存储位置不为空的索引项)读出来,如果存在用户数据标识的一级ID为9,二级ID为0的索引项,则修改该索引项(例如,修改其中的数据大小和数据存储位置);如果不存在,则根据用户数据的标识、数据大小和当前数据区的第一个空白页的地址,在索引区内的最后一个有效的索引项后插入新的索引项,从而完成对索引表的修改/插入。最后将修改/插入后的索引表回写到闪存的索引块(区)上(例如先将索引区的区块擦除,再重新写入修改/插入后的索引表)。从上面divoom_config_index_info可以得出,每个索引项占用5个字节,每个页为256字节,所以每个页使用索引页编号(一字节)+51个索引项(51*5),如果用户数据总类型数为M,将要使用N个索引页,(N-1)*52=<M<N*52。为了简单说明,在本例中考虑102个数据类型以下,即最多使用2个索引页的情况;在索引第一页中,各索引项的索引页编码开始一直是0,也就是用户数据总项一直是51以内。在不断地更新过程中,索引页编码0的索引项在不断地更新,直到后面用户数据的总项超过51时,一个索引页已经经无法储存了,从而出现索引页编码为了的页,后面再每次更新信息时,都同时更新索引编码0和索引编码1,因用户数据的总项不多,方便设计,所以就只考虑全部更新,简化设计复杂度。
我们先将索引区的最新的有效索引页的数据读出来,将所有的索引项读出来,查找所有的数据项中page_size+page_off最大的值,将做为要写的数据项的page_off,再查找对应ID的数据项,只对一级ID和二级ID进行比对,如果找到相同的,就更新数据(page_size和page_off);如果没有找到相同的,将在后面增加新的数据项索引,再将更新后的所有索引项,再写入到索引区。
第二次的数据区的数据写入方式为:以页为单位依次写入,每次都是将数据写最前面未使用的若干个页。在上文对索引区的进行信息统计的时候,统计了所有索引项里面最大的page_size+page_off,该页即第一个未使用的页。对数据区的数据写入过程如下:按上面的计算可知,567字节的用户数据需占用三个页,则从数据区的第一个未使用的页起,将用户数据写入三个连续的页,至此完成了数据区内的用户数据写入。
具体实施方式如下,根据本公开的实施例的基于闪存的数据存储方法,主要分为三部分:算法初始化、用户数据写入和用户数据读取。
第一部分:算法初始化。
参照图1,在本例中算法初始化主要是遍历索引区内的索引项,在内存中初始化divoom_config_ctrl成员,以方便后续数据的读写操作,下面是示例性的数据结构定义:
根据SPI FLASH的特性,未写过的页中数据全是0XFF(即每个位都为“1”);下面是整个初始化过程:
第一步:先将初始化变量index_num=0,index_page=0;然后从索引区起始部分开始进行读取,直到读到未尾或整页的数据全为0XFF的页,将此页信息记录到index_page,记录索引页的第一字节页编号,将最大的页编号写字入index_num;
第二步:如果没有索引部分为空,没有写过,也就是index_num等于0,则将index_num=1,完成初始化,进入第四步;否则进入第三步;
第三步:从index_page-index_num索引页读到index_page索引页,读出所有的divoom_config_index_info信息(索引项),记录所有信息中最大的page_off+page_size,将其记录到start_data_page(数据区的空闲页的起始位置);
第四步:完成初始化,退出程序。此时在SPI FLASH中建立了包含了索引区,等待用户读写数据。
在此,空闲页并不一定代表内容为0xff的未使用页,在索引区中,空闲页表示没有被写入索引项的页或者没有被写入当前有效的索引项的页;在数据区中,空闲页表示未被索引表映射(不属于从有效的索引项的用户数据位置起到其后相当于用户数据大小的范围)的页。与空闲页相对的是有效页,在索引区中,有效页表示被写入当前有效的索引项(即用户数据标识、数据大小和数据存储位置这三者不为空的索引项)的页;在数据区中,有效页表示被索引表映射(属于从有效的索引项的用户数据位置起到其后相当于用户数据大小的范围)的页。优选地,当将索引项的用户数据标识、数据大小任一项设置为空(或者特定标识),或者将索引项数据存储位置变更时,该索引项原来对应的数据区的数据所占的页从有效页变为无效页。
第二部分:用户数据写入。
参照图2,在本例中,用户使用两级索引cur_item和cur_id作为标识,并带相应的信息(包括用户数据data和用户数据大小size)进行写入动作。
第一步:先检查start_data_page+size所占用的页大小是否超过最大的数据页,即表示数据区的可用空闲页是否少于待写入的用户数据大小(size),如果超过,将跳转到第三步,否则跳转到第二步;
第二步:检查index_page+index_num+1是否超过最大的索引页,即表示索引区的可用页是否少于index_num,如果超过,将跳转到第三步,以进行数据整理,删除重复的旧用户数据,否则跳转到第十步,即进行用户数据的正常写入;
第三步:从index_page-index_num索引页读到index_page-1索引页,将所有的divoom_config_index_info信息加载到内存中。
第四步:将data_block设置为0,start_data_page设置为0;
第五步:如果data_block小于有效的用户数据总块数(数据区的有效页所占的块数),将跳转第六步,以进行有效数据搬移;否则跳转到第九步,以完成数据搬移,开始新数据的索引表更新;
第六步:先将在序号data_block数据块上的有效数据,读到内存中,擦除此数据块;
第七步:将在内存中的有效数据项依次写入start_data_page数据页,并将start_data_page写入相应的item和id对应的page_off,将start_data_page=start_data_page+page_size所占用页大小;
第八步:data_block=data_block+1;再跳转到第五步;
第九步:擦除索引块,将所有的更新后的索引信息写入索引页0,到索引页index_num-1;将index_page=index_num;
第十步:遍历所有的索引信息,查找与cur_item等于item并且cur_id等于id的索引项,如果查找到匹配的索引项,跳转到第十一步,表明只是更新数据;否则跳转到第十二步进入新类型数据的插入;
第十一步:修改索引项的page_off为start_data_page;跳转到第十三步;
第十二步:在索引信息表中增加一项,将item=cur_time,id=cur_id,page_size=data_size,page_off=start_data_page;根据实际索引项总数修改index_num,跳转第十三步;
第十三步:更新索引页信息,将索引信息表更新到索引块中,并修改index_page=index_page+index_num;
第十四步:将用户数据保存到从数据页偏移start_data_page后的连续页,并修改start_data_page=start_data_page+data_size占用的页数;
第十五步:完成数据写入过程,释放申请的内存资源,退出写流程。
其中,在更新索引表时,首先读取索引区内的索引表。其次,查找在该索引表内是否存在其用户数据标识item和id对应为写入的用户数据分配的标识cur_item和cur_id的索引项,如果存在该查找的索引项,则基于为写入的用户数据分配的大小和位置而更新该查找的索引项,即用为写入的用户数据分配的大小和位置替换该索引项中的用户数据的大小和位置项目,以形成新的索引表;如果不存在该查找的索引项,则基于为写入的用户数据分配的标识、大小和位置而创建新的索引项;再次,在创建新的索引项时,如果索引表的索引项数未达到上限,则在索引表的最后一项后添加所述新的索引项,以形成新的索引表;否则将索引表中有效的索引项读入内存,再擦除索引区,并从索引区的起始页起写入有效的索引项和所述新的索引项,以形成新的索引表。最后,更新索引区。在更新索引区时,如果原有的索引项发生变化,则擦除原索引区的该索引项所在的块,写入新的索引表;如果原有的索引项未发生变化,仅创建新的索引项,则无需擦除索引区,仅在原索引表后的空闲页上写入新索引项即可。
第三部分:用户数据读取。
参照图3,在本例中,用户使用两级索引cur_item和cur_id进行数据读取。
1:从index_page-index_num索引页读到index_page-1索引页,比对每项的divoom_config_index_info信息,直到item=cur_time,id=cur_id,如果查找到,将跳转到第三步进行数据读取,否则跳转到第二步,读取失败;
2:所要求的数据没有被保存,读取失败,返回空,退出读操作;
3:申请page_size大小的内存,从数据区域的偏移page_off开始读取page_size大小的数据到申请的内存中,读取成功,返回申请的内存指针,退出读取操作;
根据本公开涉及的基于闪存的数据存储方法相比于当前文件管理算法,在处理小型文件(数据)时,主要具有以下优点:1:占用内存少,非常适合在小型的系统实施;2:更新数据速度非常快,在更新N个页的用户数据时,只要写N+1或N+2个页的时间,提升用户体验;3:因SPI FLASH在全部被使用完后才会被擦除一次,增加了产品的寿命,提高竞争力;4:在使用过程中,数据不易丢失,提供可靠储存,从而提升产品的整体竞争力。
另外,假如采用固定的区块作为索引区(索引块)。当用户数据整体较小时,索引区可能会比数据区先写满,并进行更多次擦写,由此索引区的寿命将小于其他区块。而另一方面,在写入用户数据时,当待写入的用户数据的大小大于数据区的剩余空闲页的大小时,则将擦除数据区的起始位置的区块,以写入用户数据,因此,数据区的末端的区块的使用率低于数据区的其他部分的区块。
在本公开的一个或多个实施例中,在写入用户数据时,如果待写入的用户数据的大小大于所述数据区的剩余空闲页的大小的次数大于预设的阈值(例如5000次),且剩余空闲页的大小大于索引区的大小时,将索引项写入剩余空闲页,以作为新的索引区,从而均衡作为初始索引区的区块擦除和写入次数过多,而数据区的末端的区块的使用率过低的问题。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (7)
1.基于闪存的数据存储方法,其特征在于:
所述闪存的存储空间被分为索引区和数据区,索引区和数据区分别包括不同的块,所述索引区包括具有1个以上的索引项的索引表,所述索引项包括用户数据标识、用户数据大小和用户数据位置;
其中,写入用户数据的操作包括以下步骤:
A1.基于索引表,获取数据区的起始块的位置、第一个空闲页的位置和剩余空闲页数;
A2.比较待写入的用户数据的大小和所述数据区的剩余空闲页的大小,如果待写入的用户数据的大小小于数据区的剩余空闲页的大小,则从数据区的第一个空闲页起写入该用户数据;否则将先备份有效数据,再从数据区的起始块起顺次擦除相当于所述闪存的数据区所占块数的所有的块,再将备份的有效数据写入从数据区的起始块起的页,再将所述待写入的用户数据写入后续空闲页;
A3.更新索引表;
查找在索引表内是否存在其用户数据标识对应为写入的用户数据分配的标识的索引项,如果不存在该查找的索引项,则基于为写入的用户数据分配的标识、大小和位置而创建新的索引项;
B3.在创建新的索引项时,如果索引表的索引项数未达到上限,则在索引表的最后一项后添加所述新的索引项,以形成新的索引表;否则将索引表中有效的索引项读入内存,再擦除索引区,并从索引区的起始页起写入有效的索引项和所述新的索引项,以形成新的索引表。
2.根据权利要求1所述的方法,其中,更新索引表的步骤包括以下子步骤:
B1.读取索引区内的索引表;
B2.查找在所述索引表内是否存在其用户数据标识对应为写入的用户数据分配的标识的索引项,如果存在该查找的索引项,则基于为写入的用户数据分配的大小和位置而更新该查找的索引项,以形成新的索引表;
B4.更新索引区。
3.根据权利要求1所述的方法,其中,读取用户数据操作包括以下步骤:
C1.读取索引区内的索引表;
C2.查找在所述索引表内其用户数据标识对应待读取的用户数据的标识的索引项;
C3.基于该查找的索引项的用户数据大小和用户数据位置,读取对应的用户数据。
4.根据权利要求1所述的方法,其特征在于:在写入用户数据时,如果待写入的用户数据的大小大于所述数据区的剩余空闲页的大小的次数大于预设的阈值,且剩余空闲页的大小大于索引区的大小时,将索引项写入剩余空闲页,以作为新的索引区。
5.根据权利要求1-4中任一项所述的方法,其中,所述索引项的用户数据大小为用户数据的页数;所述索引项的所述用户数据位置为所述用户数据的起始页距离所述数据区的起始页的偏移页数。
6.基于闪存的数据存储装置,其特征在于:
所述闪存的存储空间被分为索引区和数据区,索引区和数据区分别包括不同的块,索引区包括具有1个以上的索引项的索引表,所述索引项包括用户数据标识、用户数据大小和用户数据位置,
所述数据存储装置包括用户数据写入模块,
所述用户数据写入模块包括以下子模块:
第一写入子模块,用于基于索引表,获取数据区的起始块的位置、第一个空闲页的位置和剩余空闲页数;
第二写入子模块,用于比较待写入的用户数据的大小和所述数据区的剩余空闲页的大小,如果待写入的用户数据的大小小于数据区的剩余空闲页的大小,则从数据区的第一个空闲页起写入该用户数据;否则将先备份有效数据,再从数据区的起始块起顺次擦除相当于所述闪存的数据区所占块数的所有的块,再将备份的有效数据写入从数据区的起始块起的页,再将所述待写入的用户数据写入后续空闲页;
第三写入子模块,用于更新索引表。
7.根据权利要求6所述的装置,其中,所述数据存储装置还包括索引表更新模块,
所述索引表更新模块包括以下子模块:
第一更新子模块,用于读取索引区内的索引表;
第二更新子模块,用于查找在所述索引表内是否存在其用户数据标识对应为写入的用户数据分配的标识的索引项,如果存在该查找的索引项,则基于为写入的用户数据分配的大小和位置而更新该查找的索引项,以形成新的索引表;如果不存在该查找的索引项,则基于为写入的用户数据分配的标识、大小和位置而创建新的索引项;
第三更新子模块,用于在创建新的索引项时,如果索引表的索引项数未达到上限,则在索引表的最后一项后添加所述新的索引项,以形成新的索引表;否则将索引表中有效的索引项读入内存,再擦除索引区,并从索引区的起始页起写入有效的索引项和所述新的索引项,以形成新的索引表;
第四更新子模块,用于更新索引区。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810361678.0A CN108710578B (zh) | 2018-04-20 | 2018-04-20 | 基于闪存的数据存储方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810361678.0A CN108710578B (zh) | 2018-04-20 | 2018-04-20 | 基于闪存的数据存储方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108710578A CN108710578A (zh) | 2018-10-26 |
CN108710578B true CN108710578B (zh) | 2022-07-26 |
Family
ID=63866821
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810361678.0A Active CN108710578B (zh) | 2018-04-20 | 2018-04-20 | 基于闪存的数据存储方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108710578B (zh) |
Families Citing this family (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109710547B (zh) * | 2018-12-29 | 2020-12-08 | 浙江理工大学 | 一种工业物联网中的缓冲内存管理设计与实现方法 |
CN110134645B (zh) * | 2019-04-15 | 2023-07-11 | 深圳市战音科技有限公司 | 文件系统存储管理方法、读取方法、管理装置和读取装置 |
US10825542B1 (en) * | 2019-09-12 | 2020-11-03 | Silicon Motion, Inc. | Method for efficiently checking storage units of flash memory of flash memory device and corresponding electronic device executing the method |
CN110764704B (zh) * | 2019-10-18 | 2023-09-05 | 浙江大华技术股份有限公司 | 一种环境变量写入方法、存储介质及电子装置 |
CN112558873B (zh) | 2020-12-14 | 2021-10-15 | 上海创米科技有限公司 | 嵌入式音视频数据存储、检索、删除方法及装置、存储器 |
CN112817967B (zh) * | 2020-12-30 | 2023-09-29 | 北京天融信网络安全技术有限公司 | 流量数据存储方法、装置、电子设备及存储介质 |
CN113485974B (zh) * | 2021-06-02 | 2023-08-01 | 翱捷科技股份有限公司 | Nor闪存使用yaffs的方法及装置 |
CN113934371B (zh) * | 2021-10-08 | 2024-04-12 | 福建星网视易信息系统有限公司 | 一种存储器及其数据管理方法和计算机存储介质 |
CN114327292B (zh) * | 2021-12-31 | 2024-02-02 | 上海移为通信技术股份有限公司 | 文件管理方法、系统、电子设备和存储介质 |
CN115328922B (zh) * | 2022-10-10 | 2022-12-30 | 北京紫光芯能科技有限公司 | 用于单向链表的数据管理方法、装置及系统 |
CN116185563B (zh) * | 2022-12-27 | 2024-04-16 | 上海千顾汽车科技有限公司 | 一种基于车规级微控制器数据闪存的软件模拟算法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101105774A (zh) * | 2006-10-26 | 2008-01-16 | 福昭科技(深圳)有限公司 | 一种逻辑与物理地址索引转换管理方法 |
CN101127004A (zh) * | 2007-09-24 | 2008-02-20 | 中兴通讯股份有限公司 | 一种在闪存上存取数据的系统及方法 |
CN103729303A (zh) * | 2014-01-20 | 2014-04-16 | 飞天诚信科技股份有限公司 | 一种Flash的数据写入和读取方法 |
Family Cites Families (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1204501C (zh) * | 2001-09-18 | 2005-06-01 | 华为技术有限公司 | Flash存储文件管理方法 |
CN1277213C (zh) * | 2004-12-31 | 2006-09-27 | 大唐微电子技术有限公司 | 一种闪存文件系统管理方法 |
CN100530138C (zh) * | 2007-06-28 | 2009-08-19 | 忆正存储技术(深圳)有限公司 | 基于多通道闪存设备逻辑条带的自适应控制方法 |
US8397014B2 (en) * | 2008-02-04 | 2013-03-12 | Apple Inc. | Memory mapping restore and garbage collection operations |
CN101727402B (zh) * | 2009-10-23 | 2012-07-04 | 深圳市江波龙电子有限公司 | 一种非易失性存储器数据的读写控制方法及系统 |
CN102419752B (zh) * | 2010-09-28 | 2013-09-11 | 上海可鲁系统软件有限公司 | 一种工业数据库报文存储方法 |
CN102004700A (zh) * | 2010-11-26 | 2011-04-06 | 华为终端有限公司 | 闪存的存储空间分配方法及装置 |
CN102306125B (zh) * | 2011-08-17 | 2016-04-06 | 深圳市共进电子股份有限公司 | 一种flash存储器的数据擦写方法 |
CN103514104B (zh) * | 2012-06-27 | 2016-08-03 | 安凯(广州)微电子技术有限公司 | 读取数据方法以及数据写入方法 |
CN103399826B (zh) * | 2013-08-15 | 2016-01-06 | 南京新联电子股份有限公司 | 一种基于nor flash的数据存储方法 |
CN106155915B (zh) * | 2015-04-16 | 2021-01-08 | 中兴通讯股份有限公司 | 数据存储的处理方法及装置 |
-
2018
- 2018-04-20 CN CN201810361678.0A patent/CN108710578B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101105774A (zh) * | 2006-10-26 | 2008-01-16 | 福昭科技(深圳)有限公司 | 一种逻辑与物理地址索引转换管理方法 |
CN101127004A (zh) * | 2007-09-24 | 2008-02-20 | 中兴通讯股份有限公司 | 一种在闪存上存取数据的系统及方法 |
CN103729303A (zh) * | 2014-01-20 | 2014-04-16 | 飞天诚信科技股份有限公司 | 一种Flash的数据写入和读取方法 |
Non-Patent Citations (1)
Title |
---|
VxWorks平台下基于NAND FLASH的文件系统研究与设计;郭利军;《中国优秀硕士学位论文全文数据库 信息科技辑》;20180415;I137-186 * |
Also Published As
Publication number | Publication date |
---|---|
CN108710578A (zh) | 2018-10-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108710578B (zh) | 基于闪存的数据存储方法和装置 | |
CN100492322C (zh) | 非易失性存储系统中的损耗平衡 | |
CN102135942B (zh) | 一种存储设备中实现损耗均衡的方法及存储设备 | |
CN110781096A (zh) | 用于通过预测需求时间来执行垃圾收集的设备和方法 | |
US20090307291A1 (en) | Smart card storage system and file management method therein | |
CN111459844B (zh) | 数据储存装置及用于存取逻辑至物理地址映射表的方法 | |
CN107291405B (zh) | 一种NorFlash的数据管理方法与装置 | |
US20100131700A1 (en) | Memory indexing system and process | |
CN108897492B (zh) | 一种数据写入方法和装置 | |
CN111651371B (zh) | 非对称型平面管理方法以及数据存储装置及其控制器 | |
CN107045423B (zh) | 存储器装置及其数据存取方法 | |
US20190146909A1 (en) | Valid data management method and storage controller | |
CN103136111A (zh) | 数据写入方法、存储器控制器与存储器储存装置 | |
CN109840218A (zh) | 有效数据管理方法以及存储控制器 | |
CN113535074B (zh) | 用来针对非易失性存储器进行区块管理的方法以及设备 | |
CN102736981A (zh) | 提高nor flash擦写寿命的方法 | |
KR101699779B1 (ko) | 플래시 메모리의 색인 방법 | |
CN107015764B (zh) | Nand flash的数据处理方法、装置和一种Nand flash | |
CN116301614A (zh) | 存储器数据存取方法、系统、设备和存储介质 | |
KR101083683B1 (ko) | 플래쉬 메모리 장치 및 및 이를 위한 리드동작 제어 방법 | |
CN116069252A (zh) | 一种zns ssd设备的控制方法、装置及设备 | |
CN110968268B (zh) | 一种基于spiflash的存储管理方法及存储结构 | |
CN108304331B (zh) | 基于NorFlash的环形队列式数据存储方法及装置 | |
CN112988037A (zh) | 静态磨损均衡方法、终端和计算机可读存储介质 | |
CN118034610B (zh) | 应用于存储器的密钥数据处理方法、存储器、装置及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |