著录项信息
专利名称 | 一种访问Nand闪存数据的方法和装置 |
申请号 | CN200910224156.7 | 申请日期 | 2009-11-24 |
法律状态 | 暂无 | 申报国家 | 中国 |
公开/公告日 | 2010-05-05 | 公开/公告号 | CN101702139A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | 暂无 | IPC分类号 | 暂无查看分类表>
|
申请人 | 中兴通讯股份有限公司 | 申请人地址 | 河北省保定市涿州市甲秀路39号41号楼4单元301室
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 张翠茹,韩莉,刘翠侠,刘皂亮,汪梅 | 当前权利人 | 张翠茹,韩莉,刘翠侠,刘皂亮,汪梅 |
发明人 | 张翠茹;韩莉;刘翠侠;刘皂亮;汪梅 |
代理机构 | 北京派特恩知识产权代理事务所(普通合伙) | 代理人 | 张颖玲;王黎延 |
摘要
本发明公开了一种访问Nand闪存数据的方法,创建Nand缓存,在访问Nand闪存数据时,先根据要访问的Nand闪存的线性地址,计算出要访问的Nand闪存的物理块号(WriteBlockNum),再根据WriteBlockNum和各缓存块的管理信息中的命中块号判断是否在Nand缓存中命中缓存块,如果命中,则对命中的缓存块进行访问;如果未命中,则在访问为写操作时,申请缓存块,并将WriteBlockNum记录到命中块号,再对此缓存块进行写操作;在访问为读操作时,直接从Nand闪存中读取数据;本发明同时还公开了一种访问Nand闪存数据的装置;采用本发明的方案大大提高了对Nand闪存的读写速度。
一种访问Nand闪存数据的方法和装置 \n技术领域\n[0001] 本发明涉及数据存储技术,尤指涉及一种访问Nand闪存数据的方法和装置。 背景技术\n[0002] NOR和Nand是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR闪存(Flash)技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了Nand Flash结构,这种结构强调降低每比特的成本、更高的存储性能,并且能像磁盘一样可以通过接口轻松升级。 \n[0003] Nand Flash已经成为消费类应用中用作海量存储的主要选择,因为它相比NOR Flas h而言具有单位比特成本更低、存储密度更高的优势,并且具有比硬盘更小的尺寸、更低的功耗以及更可靠的优势。 \n[0004] 正因如此,在嵌入式应用中,Nand Flash被越来越多的产品所采用,如媒体播放器,数码相机、数码相框、便携式导航仪、U盘、机顶盒、智能手机等。 [0005] Nand Flash由大量的物理块组成,其操作特点为:擦除操作的最小单位是块,且Nand Flash数据的每一位只能从1变为0,而不能从0变为1。因此,对Nand Flash进行写操作之前一定要先擦除整个物理块。然而,在对Nand Flash以文件形式操作时,大部分时间只需改变一个物理块的部分数据,并不需要改变整个物理块,但由于Nand Flash的特点,一次只能操作整个物理块,这就导致会频繁的对Nand Flash进行读写操作。 [0006] 在嵌入式系统中,由于Nand Flash是一个低速设备,频繁地读写Nand Flash势必影响整个系统的性能,同时也会影响Nand Flash的寿命。 \n发明内容\n[0007] 有鉴于此,本发明的主要目的在于提供一种访问Nand闪存数据的方法和装置,在提高对Nand Flash读写速度的同时,降低对Nand Flash擦写次数。 \n[0008] 为达到上述目的,本发明的技术方案是这样实现的: \n[0009] 本发明提供的一种访问Nand闪存数据的方法,该方法包括: \n[0010] 创建Nand缓存,初始化Nand缓存中各缓存块管理信息中的命中块号; [0011] 在对Nand闪存数据访问时,根据要访问的Nand闪存的线性地址,计算出要访问的Nand闪存的物理块号; \n[0012] 根据所述物理块号和命中块号判断是否命中缓存块,如果命中,则对命中的缓存块进行访问;如果未命中,则在写操作时,在Nand缓存中申请未使用的缓存块,并将所述物理块号记录到命中块号,再对此缓存块进行写操作;在读操作时,根据要读的线性地址,从Nand闪存中读取数据。 \n[0013] 上述方案中,所述创建Nand缓存具体为:以Nand闪存中的物理块为单位创建Nand缓存,Nand缓存由若干个缓存块组成,缓存块数不超过Nand闪存中的物理块数,其中每个缓存块的大小与物理块的大小相同。 \n[0014] 上述方案中,所述计算出要访问的Nand闪存的物理块号具体为:物理块号等于要访问的Nand Flash的线性地址与Nand Flash的物理块大小的比值。 \n[0015] 上述方案中,所述根据所述物理块号和命中块号判断是否命中缓存块具体为:在Nand缓存中查找与所述物理块号相同的命中块号的缓存块,如果查找到,则为命中;如果未查找到,则为未命中。 \n[0016] 上述方案中,在Nand缓存中没有未使用的缓存块供申请时,该方法进一步包括:\n计算各缓存块的命中率,将命中率最低的缓存块进行同步处理后,作为未使用的缓存块。 [0017] 上述方案中,所述计算各缓存块的命中率的方法具体为:将缓存块的访问次数与在第一次访问所述缓存块之后Nand缓存的访问次数的比值作为命中率。 [0018] 上述方案中,该方法进一步包括:在系统重启、设备卸载或者在一段时间内没有对Nand缓存进行访问时,对Nand缓存中所有已使用且数据相对于Nand闪存有更改的缓存块进行同步处理。 \n[0019] 本发明提供的一种访问Nand闪存数据的装置,该装置包括:创建模块、初始化模块、物理块号计算模块、命中判断模块、缓存块申请模块、读缓存模块、写缓存模块、读闪存模块;其中, \n[0020] 创建模块,用于创建Nand缓存,并建立Nand缓存中各缓存块的管理信息中的命中块号; \n[0021] 初始化模块,用于初始化Nand缓存中各缓存块管理信息中的命中块号; [0022] 物理块号计算模块,用于根据要访问的Nand闪存的线性地址,计算出要访问的物理块号; \n[0023] 命中判断模块,用于根据所述物理块号和命中块号判断是否命中缓存块,如果命中,则根据访问为读操作通知读缓存模块,根据访问为写操作通知写缓存模块;如果未命中,则在访问为写操作时,通知缓存块申请模块;在访问为读操作时,通知读闪存模块; [0024] 缓存块申请模块,用于申请未使用的缓存块,并将所述物理块号记录到命中块号,将所述未使用的缓存块作为命中的缓存块,通知写缓存模块; \n[0025] 读缓存模块,用于读命中的缓存块的数据; \n[0026] 写缓存模块,用于将数据写入命中的缓存块; \n[0027] 读闪存模块,用于根据要读的线性地址,从Nand闪存中读取数据。 [0028] 上述方案中,所述装置进一步包括命中率模块、同步模块;其中, [0029] 命中率模块,用于计算各缓存块的命中率,并将命中率最低的缓存块通知给同步模块; \n[0030] 同步模块,用于对命中率最低的缓存块进行同步处理;或者在系统重启、设备卸载或者在一段时间内没有对Nand缓存进行访问时,对Nand缓存中所有已使用且数据相对于Nand闪存有更改的缓存块进行同步处理; \n[0031] 所述缓存块申请模块,还用于在Nand缓存中没有未使用的缓存块给缓存块申请模块申请时,通知命中率模块。 \n[0032] 本发明所提供的访问Nand闪存数据的方法和装置,预先创建Nand缓存(NandBuf),并初始化各缓存块(BlockBuf)的管理信息中的命中块号(HitBlockNum);在对Nand Flash数据访问时,计算出要访问的Nand Flash的物理块号(WriteBlockNum),再根据WriteBlockNum和命中块号判断是否命中BlockBuf,如果命中,则对命中的BlockBuf进行访问;如果未命中,则在写操作时,申请BlockBuf,并将WriteBlockNum记录到HitBlockNum,再进行写操作;在读操作时,根据要读的Nand Flash的线性地址,从Nand Flash中读取数据。如此,可实现对Nand Flash数据的访问。由于本发明的方案采用了数据缓存的方式,缓存的读写速度远远高于Nand Flash设备的读写速度,因此大大提高了对Nand Flash的读写速度;同时,不用在每次写操作时对Nand Flash的物理块进行擦除,降低了对Nand Flash的擦写次数,延长了Nand Flash的寿命。 \n附图说明\n[0033] 图1为本发明实现访问Nand闪存数据的方法的流程示意图; \n[0034] 图2为本发明实现访问Nand闪存数据的装置的结构示意图。 \n具体实施方式\n[0035] 本发明的基本思想是:创建NandBuf,初始化NandBuf中各BlockBuf的管理信息中的HitBlockNum;在对Nand Flash数据访问时,先计算出要访问的WriteBlockNum,再根据WriteBlockNum和HitBlockNum判断是否命中BlockBuf,如果命中,则对命中的BlockBuf进行访问;如果未命中,则在写操作时,申请BlockBuf,并将WriteBlockNum记录到HitBlockNum,再对此BlockBuf进行写操作;在读操作时,根据要读的Nand Flash的线性地址,从Nand Flash中读取数据。 \n[0036] 其中,所述根据WriteBlockNum和HitBlockNum判断是否在NandBuf中命中BlockBuf具体为:在NandBuf中查找与WriteBlockNum相同的命中块号的BlockBuf,如果查找到,则为命中;如果未查找到,则为未命中。 \n[0037] 下面通过附图及具体实施例对本发明再做进一步的详细说明。 [0038] 本发明实现访问Nand闪存数据的方法,如图1所示,该方法包括以下几个步骤: [0039] 步骤101:创建NandBuf,并初始化NandBuf各BlockBuf的管理信息中的HitBlockNum; \n[0040] 具体为,预先以Nand Flash中的物理块为单位创建NandBuf,NandBuf由若干个BlockBuf组成,数量不超过Nand Flash中的物理块的数量,其中每个BlockBuf的大小与Nand Flash中的物理块的大小相同;对每个BlockBuf还需要建立各自的管理信息,包括:\nHitBlockNum,用于记录WriteBlockNum; \n[0041] 所述初始化NandBuf各BlockBuf的管理信息中的命中块号,具体为初始化NandBuf各BlockBuf的管理信息中的命中块号为-1,表示未记录; \n[0042] 在本步骤中,所述管理信息进一步包括:缓存块状态标志(status)、缓存块起始计数值(HitCntStart)、命中计数器(HitAccessTimes);其中, \n[0043] Status包括unused、clean、dirty三种状态,其中,unused状态表示此BlockBuf没有被使用;clean状态表示此BlockBuf已经使用,而且BlockBuf中的数据和Nand Flash中的数据一致;dirty状态表示此BlockBuf已经使用,但BlockBuf中的数据相对nand中的数据有更改;初始化为unused; \n[0044] HitCntStart,用于在BlockBuf命中某一物理块时,缓存BufAccessCnt的当前值,初始化为0; \n[0045] HitAccessTimes,用于记录在BlockBuf命中期间,对BlockBuf访问的次数,初始化为0; \n[0046] 进一步的,还需为NandBuf建立缓存访问计数器(BufAccessCnt),用于记录NandBuf的访问次数,初始化为0。 \n[0047] 步骤102:在对Nand Flash数据访问时,根据要访问的Nand Flash的线性地址,计算出要访问的WriteBlockNum; \n[0048] 本步骤中,所述计算出要访问的WriteBlockNum的方法为:WriteBlockNum=(线性地址)/(块大小),其中,块大小为NandFlash的物理块大小,目前 有16K,128K等几种类型。 \n[0049] 步骤103:根据WriteBlockNum和HitBlockNum判断是否在NandBuf中命中BlockBuf,如果命中且访问为写操作,则执行步骤104;如果命中且访问为读操作,则执行步骤106;如果未命中且访问为写操作,则执行步骤105;如果未命中且访问为读操作,则执行步骤107; \n[0050] 具体的,在NandBuf中查找与WriteBlockNum相同的HitBlockNum的BlockBuf,如果查找到,则为命中,那么,访问为写操作时,执行步骤104,访问为读操作时,执行步骤\n106;如果未查找到,则为未命中,那么,访问为写操作时,执行步骤105,访问为读操作时,执行步骤107。 \n[0051] 步骤104:根据访问为写操作,将数据写入命中的BlockBuf,流程结束; [0052] 本步骤中进一步包括:将命中的BlockBuf的管理信息中BufAccessCnt、HitAccessTimes各加1;还包括在Status为clean时,更新为dirty; \n[0053] 步骤105:根据访问为写操作,在NandBuf中申请一个未使用的BlockBuf,把要写的Nand Flash的物理块的数据读入申请的BlockBuf,并将WriteBlockNum记录到HitBlockNum,此BlockBuf作为命中的BlockBuf,再执行步骤104; \n[0054] 本步骤中进一步包括:在NandBuf中申请一个Status为unused的BlockBuf,更新申请的BlockBuf的管理信息中Status为clean,HitCntStart为BufAccessCnt当前值; [0055] 进一步的,所述在NandBuf中没有未使用的BlockBuf时,则计算各BlockBuf的命中率,将命中率最低的BlockBuf进行同步处理后,作为未使用的BlockBuf;其中,所述计算各BlockBuf的命中率的方法一般有两种: \n[0056] 第一种,将BlockBuf的访问次数与在第一次访问所述BlockBuf之后NandBuf的访问次数的比值作为命中率,比值大,说明命中率高;否则,说明命中率低;第二种,将BlockBuf的访问次数与访问BlockBuf所用的时间的比值作为命中率;比值大,说明命中率高;否则,说明命中率低。 \n[0057] 本发明的实施例中采用第一种方法,即: \n[0058] 命中率=HitAccessTimes/(BufAccessCnt-HitCntStart); \n[0059] 所述同步处理为:根据BlockBuf的HitBlockNum,将BlockBuf的数据回写到相应的Nand Flash的物理块中,更新其status为unused,HitCntStart为-1,HitAccessTimes为0。 \n[0060] 步骤106:根据访问为读操作,对命中的BlockBuf进行读操作,流程结束; [0061] 本步骤中进一步包括:命中的BlockBuf的管理信息中BufAccessCnt、HitAccessTimes各加1; \n[0062] 步骤107:根据访问为读操作,直接根据要读的Nand Flash的线性地址,从Nand Flash中读取数据,流程结束。 \n[0063] 进一步的,本发明的方法还包括:在系统重启、设备卸载或者在一段时间内没有对NandBuf进行访问时,对NandBuf所有status为dirty的BlockBuf进行同步处理,具体为:\n在系统重启、设备卸载或者在一段时间内没有对NandBuf进行访问时,查找出所有status为dirty的BlockBuf,根据这些BlockBuf各自的HitBlockNum,将所有status为dirty的BlockBuf的数据回写到相应的NandFlash的物理块中,并更新其status为unused,HitCntStart为-1,HitAccessTimes为0。其中,所述一段时间一般为10秒。 [0064] 基于上述方法,本发明还提供了一种访问Nand闪存数据的装置,如图2所示,该装置包括:创建模块、初始化模块、物理块号计算模块21、命中判断模块22、缓存块申请模块\n23、写缓存模块24、读缓存模块25、读闪存模块26;其中, \n[0065] 创建模块,用于预先以Nand Flash中的物理块为单位创建NandBuf,NandBuf中每个BlockBuf的大小与Nand Flash中的物理块的大小相同,并建立NandBuf中各BlockBuf的管理信息中的HitBlockNum; \n[0066] 进一步的,创建模块还用于建立各BlockBuf的管理信息中的status、HitCntStart、HitAccessTimes,及建立NandBuf的BufAccessCnt; \n[0067] 初始化模块,用于初始化NandBuf中各BlockBuf的管理信息中的HitBlockNum; [0068] 进一步的,初始化模块还用于初始化各BlockBuf的管理信息中的status为 unused、HitCntStart为0、HitAccessTimes为0;及初始化NandBuf的BufAccessCnt为0; [0069] 物理块号计算模块21,用于根据要访问的Nand Flash的线性地址,计算出要访问的WriteBlockNum;计算方法为:WriteBlockNum=(线性地址)/(块大小); [0070] 命中判断模块22,用于根据WriteBlockNum和命中块号判断是否在NandBuf中命中BlockBuf,如果命中,则根据访问为读操作通知读缓存模块25,根据访问为写操作通知写缓存模块24;如果未命中,则在访问为写操作时,通知缓存块申请模块23;在访问为读操作时,通知读闪存模块26; \n[0071] 缓存块申请模块23,用于在NandBuf中申请一个未使用的BlockBuf,把要写的Nand Flash的物理块的数据读入申请的BlockBuf,并将WriteBlockNum记录到HitBlockNum,将此BlockBuf作为命中的BlockBuf,通知写缓存模块24; [0072] 进一步的,缓存块申请模块23还用于更新申请的BlockBuf的管理信息中Status为clean,HitCntStart为BufAccessCnt当前值; \n[0073] 读缓存模块25,用于读命中的BlockBuf的数据; \n[0074] 进一步的,读缓存模块25还用于在读数据之后,将命中的BlockBuf的管理信息中BufAccessCnt、HitAccessTimes各加1; \n[0075] 写缓存模块24,用于将数据写入命中的BlockBuf; \n[0076] 进一步的,写缓存模块24还用于将命中的BlockBuf的管理信息中BufAccessCnt、HitAccessTimes各加1;还包括在Status为clean时,更新为dirty; \n[0077] 读闪存模块26,用于根据要读的Nand Flash的线性地址,从Nand Flash中读取数据 \n[0078] 进一步的,该装置还包括命中率模块27、同步模块28;其中, [0079] 命中率模块27,用于计算各BlockBuf的命中率,并将命中率最低的BlockBuf通知给同步模块28;所述命中率的计算方法为: \n[0080] 命中率=HitAccessTimes/(BufAccessCnt-HitCntStart); \n[0081] 同步模块28,用于根据要进行同步的BlockBuf的HitBlockNum,将BlockBuf 中的数据回写到相应的Nand Flash的物理块中,更新其status为unused,HitCntStart为-1,HitAccessTimes为0,并将此BlockBuf作为未使用的BlockBuf通知缓存块申请模块23;\n或者在系统重启、设备卸载或者在一段时间内没有对NandBuf进行访问时,对NandBuf中所有已使用且数据相对于Nand Flash有更改的BlockBuf进行同步处理,即:将所有status为dirty的BlockBuf中的数据回写到相应的Nand Flash的物理块中,更新其status为unused,HitCntStart为-1,HitAccessTimes为0; \n[0082] 进一步的,所述缓存块申请模块23,还用于在NandBuf中没有未使用的BlockBuf给缓存块申请模块23申请时,通知命中率模块27。 \n[0083] 以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
法律信息
- 2022-11-01
未缴年费专利权终止
IPC(主分类): G06F 12/08
专利号: ZL 200910224156.7
申请日: 2009.11.24
授权公告日: 2011.11.30
- 2017-10-10
著录事项变更
发明人由李贤军变更为张翠茹 韩莉 刘翠侠 刘皂亮汪梅
- 2017-09-15
专利权的转移
登记生效日: 2017.08.29
专利权人由中兴通讯股份有限公司变更为张翠茹
地址由518057 广东省深圳市南山区高新技术产业园科技南路中兴通讯大厦法务部变更为071000 河北省保定市涿州市甲秀路39号41号楼4单元301室
专利权人变更为韩莉 刘翠侠 刘皂亮 汪梅
- 2011-11-30
- 2010-09-08
实质审查的生效
IPC(主分类): G06F 12/08
专利申请号: 200910224156.7
申请日: 2009.11.24
- 2010-05-05
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2003-12-17
|
2002-05-29
| | |
2
| | 暂无 |
1996-04-19
| | |
3
| | 暂无 |
1990-06-25
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |