一种对存储设备进行数据读写的方法及装置制造方法

文档序号:6552604阅读:335来源:国知局
一种对存储设备进行数据读写的方法及装置制造方法
【专利摘要】本发明公开了一种对存储设备进行数据读写的方法及装置,写方法为:选择系统表中循环位图的未用比特位,分配新用户数据页和新地址映射页,将待写数据写入新用户数据页,将新用户数据页的物理页号写入新地址映射页,将新地址映射页的物理页号写入系统表,将系统表写入存储设备;读方法为:从系统表中获取地址映射页的物理页号,从地址映射页获取用户数据页的物理页号,从用户数据页获取需要读取的数据。本发明的技术方案是通过系统表、地址映射页、用户数据页的两级映射关系进行数据的读写,通过管理循环位图,能够实现防掉电,通过采用缓存机制,减少对存储设备的擦写次数,实现磨损平衡。
【专利说明】一种对存储设备进行数据读写的方法及装置

【技术领域】
[0001] 本发明涉及信息安全领域,尤其涉及一种对存储设备进行数据读写的方法及装 置。

【背景技术】
[0002] 随着科学技术的发展,智能卡的市场不断扩大,而在使用智能卡的过程中,在未知 情况下由于断电、失电或电的质量达不到要求而导致智能卡不能正常工作,如果此时智能 卡正处于对存储设备(即非易失性存储区,包括EEPROM、FLASH等)进行擦写操作,则会导 致存储设备中的原有数据的丢失,大大降低了智能卡的安全性。
[0003] 另外,在向存储设备写入数据时,需要对数据进行擦写操作,在实际的擦写操作过 程中,往往会对存储设备中的某一页进行频繁擦写,使擦写达不到平衡,而存储设备的擦写 生命周期一般为十万次,由于对某些页进行过度的擦写从而导致存储设备的提早损坏,严 重影响存储设备的使用寿命。


【发明内容】

[0004] 本发明为了解决现有技术中存在的不足,提供了一种对存储设备进行数据读写的 方法。
[0005] 本发明采用的技术方案是:一种对存储设备进行数据写入的方法,包括:调用写 入函数,向所述写入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址,所述写 入函数执行以下操作 :
[0006] 步骤S1 :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,根 据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号,根据所述逻辑页号,计算与所 述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
[0007] 步骤S2 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设 备中与所述第一比特位对应的数据页作为新用户数据页;
[0008] 步骤S3 :根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断 是否能够从所述地址映射页中获取到第一物理页号,如果是,则根据所述存储设备中与所 述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据 页,执行步骤S5,否则执行步骤S4 ;
[0009] 步骤S4 :将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据 的长度,更新所述新用户数据页中的数据;
[0010] 步骤S5 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设 备中与所述第二比特位对应的数据页作为新地址映射页;
[0011] 步骤S6 :判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址 映射页的物理页号对应的第二物理页号,如果是,则根据所述存储设备中与所述第二物理 页号对应的数据更新所述新地址映射页,执行步骤S7,否则将所述新地址映射页中的数据 清空,执行步骤S7 ;
[0012] 步骤S7 :将所述新用户数据页的物理页号写入所述新地址映射页中,并将所述新 地址映射页的物理页号写入所述系统表缓存区的所述系统表中,获取所述系统表的循环位 图中与所述地址映射页对应的比特位,将该比特位置为未用比特位;
[0013] 步骤S8 :将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置,写 入结束。
[0014] 所述步骤S1之前,还包括:从所述存储设备中获取有效静态回收标记页,根据所 述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收,如果是,则执行静 态回收操作,执行步骤S1,否则直接执行步骤S1。
[0015] 所述步骤S1中,所述从所述存储设备中获取系统表,将所述系统表写入系统表缓 存区中,具体为:
[0016] 步骤al :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
[0017] 步骤a2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
[0018] 步骤a3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤a4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索 弓丨,步骤a3结束;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统 表缓存区中,将第一有效系统表的页号记为更新索引,步骤a3结束;如果均未通过校验,则 报错,步骤a3结束;
[0019] 步骤a4 :获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记, 如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表 缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引,步骤a4结束;如果 是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表 缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引,步骤a4结束;如果 是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系 统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引,步骤a4结束。
[0020] 所述步骤S8,具体为:将所述系统表缓存区中的所述系统表写入所述更新索引对 应的有效系统表中,更新所述更新索引对应的有效系统表中的新旧标记。
[0021] 所述将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表 中,还包括:
[0022] 判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时 是否出现坏页,如果是,则获取与所述更新索引对应的有效系统表相邻的非坏页的系统表, 将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中,否则执行更新所述 更新索引对应的有效系统表中的新旧标记的操作。
[0023] 所述更新所述更新索引对应的有效系统表中的新旧标记,具体为:判断所述更新 索引对应的有效系统表中的新旧标记,如果是所述第一预设值,则将所述新旧标记更新为 所述第三预设值,如果是所述第二预设值,则将所述新旧标记更新为所述第一预设值,如果 是所述第三预设值,则将所述新旧标记更新为所述第二预设值。
[0024] 所述步骤S1中,所述根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页 号,具体为:将所述待写数据的逻辑地址除以预设页长,将得到的商作为逻辑页号。
[0025] 所述步骤S1中,所述根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页 的逻辑页号和在所述地址映射页的页内偏移,具体为:将所述逻辑页号除以预设页长的二 分之一,将得到的商作为与所述逻辑页号对应的地址映射页的逻辑页号,将得到的余数作 为在所述地址映射页的页内偏移。
[0026] 所述步骤S3中,所述根据所述地址映射页的逻辑页号和在所述地址映射页的页 内偏移,判断是否能够从所述地址映射页中获取到第一物理页号,具体为:根据所述地址映 射页的逻辑页号,查找所述系统表中的地址映射索引,将所述地址映射页的逻辑页号乘以2 得到在地址映射索引的偏移,读取两个字节的数据,作为所述地址映射页的物理页号,然后 根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中获 取数据,判断获取到的数据是否为OxfffT,如果是,则未找到第一物理页号,否则找到第一 物理页号。
[0027] 所述步骤S3中,所述根据所述存储设备中与所述第一物理页号对应的数据、所述 待写数据及所述待写数据的长度,更新所述新用户数据页,具体为:
[0028] 步骤1 :将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否 在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3 ;
[0029] 步骤2 :根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中 的数据,执行步骤S5;
[0030] 步骤3 :将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区 中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,执行步 骤S5 ;
[0031] 所述步骤S8之前还包括:将所述用户数据缓存区中的数据写入所述新用户数据 页中。
[0032] 所述将所述用户数据缓存区中的数据写入所述新用户数据页中,还包括:判断所 述用户数据缓存区中的数据写入所述新用户数据页时是否出现坏页,如果是,则返回执行 步骤S2,否则将所述用户数据缓存区中的数据写入所述新用户数据页中。
[0033] 所述判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏 页,具体为:
[0034] 步骤aal :将执行写入读出次数置为初始值;
[0035] 步骤aa2 :将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤aa3 ;
[0036] 步骤aa3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据 缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
[0037] 所述步骤S6中,所述根据所述存储设备中与所述第二物理页号对应的数据更新 所述新地址映射页,具体为:
[0038] 步骤bl :将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否 在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2 ;
[0039] 步骤b2 :将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区 中,执行步骤b3 ;
[0040] 步骤b3 :将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映 射页中,执行步骤S7。
[0041] 所述步骤b3,还包括:判断所述地址映射缓存区中的数据写入所述存储设备中的 所述新地址映射页时是否出现坏页,如果是,则返回步骤S5,否则将所述地址映射缓存区中 的数据写入所述存储设备中的所述新地址映射页中。
[0042] 所述判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射 页时是否出现坏页,具体为:
[0043] 步骤bbl :将执行写入读出的操作次数置为初始值;
[0044] 步骤bb2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该 相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤bb3 ;
[0045] 步骤bb3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址 映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
[0046] 所述步骤S7与所述步骤S8之间还包括:
[0047] 步骤cl :根据所述新用户数据页的物理页号和所述新地址映射页的物理页号,计 算对应的擦除计数页;
[0048] 步骤c2 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设 备中所述第三比特位对应的数据页作为新擦除计数页;
[0049] 步骤c3 :判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的 第三物理页号,如果是,则将所述第三物理页号对应存储设备中的数据写入所述新擦除计 数页中,执行步骤c4,否则将所述新擦除计数页中的数据清空,执行步骤c4 ;
[0050] 步骤c4 :从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映 射页对应的擦除次数,更新对应的擦除次数,根据所述新擦除计数页的页号和更新后的擦 除次数更新所述系统表缓存区中的所述系统表,执行步骤S8。
[0051] 所述步骤c3中,所述将所述第三物理页号对应存储设备中的数据写入所述新擦 除计数页中,具体为:
[0052] 步骤el :将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否 在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2 ;
[0053] 步骤e2 :将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区 中,执行步骤e3 ;
[0054] 步骤e3 :将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计 数页中,执行步骤c4。
[0055] 所述步骤e3,还包括:判断所述擦除计数缓存区中的数据写入所述存储设备中的 所述新擦除计数页中时是否出现坏页,如果是,则返回步骤S5,否则将所述擦除计数缓存区 中的数据写入所述存储设备中的所述新擦除计数页中。
[0056] 所述判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数 页中时是否出现坏页,具体为:
[0057] 步骤ccl :将执行写入读出的操作次数置为初始值;
[0058] 步骤cc2 :将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤cc3 ;
[0059] 步骤cc3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除 计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
[0060] 所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页 对应的擦除次数,更新对应的擦除次数,具体为:将所述新擦除计数页中与所述新用户数据 页和所述新地址映射页对应的擦除次数均加0x01。
[0061] 所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区 中的所述系统表,具体为:根据所述更新后的擦除次数更新所述系统表缓存区中的所述系 统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表 中。
[0062] 所述步骤c4与所述步骤S8之间还包括:
[0063] 步骤Π :判断所述新擦除计数页中的擦除次数是否大于第一预设值,如果是,则 将静态回收标记置为需要进行静态回收,执行步骤f2,否则执行步骤f2 ;
[0064] 步骤f2 :获取所述系统表中的擦除总数,根据所述擦除总数,计算得到平均擦除 次数,判断所述平均擦除次数是否大于第二预设值,如果是,则将所述静态回收标识置位需 要进行静态回收,执行步骤S8,否则直接执行步骤S8。
[0065] 所述执行静态回收操作,具体为:
[0066] 步骤gl :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获 取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作 为当前地址映射页;
[0067] 步骤g2 :判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据 当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行 步骤gl6 ;
[0068] 步骤g3 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四 比特位对应的存储设备区域作为待回收地址映射页;
[0069] 步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是, 则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5 ;
[0070] 步骤g5 :判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否 则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲, 执行步骤g6 ;
[0071] 步骤g6 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤g3,否则执行步骤g7 ;
[0072] 步骤g7 :将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页 修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数 据页的物理页号,将第一个用户数据页作为当前用户数据页;
[0073] 步骤g8 :判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据 当前用户数据页的物理页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行 步骤gl5 ;
[0074] 步骤g9 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五 比特位对应的存储设备区域作为待回收用户数据页;
[0075] 步骤glO :判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是, 则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤gll ;
[0076] 步骤gll :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤gl4, 否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执 行步骤gl2 ;
[0077] 步骤gl3 :判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出 现坏页,如果是,则执行步骤g9,否则执行步骤gl4 ;
[0078] 步骤gl4:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户 数据页修改当前地址映射页中当前用户数据页对应的页号;
[0079] 步骤gl5 :判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行 步骤gl6,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤 g8 ;
[0080] 步骤gl6 :判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则 将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中, 回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行 步骤g2。
[0081] 所述从所述系统表缓存区中查询所述系统表中的循环位图,具体为:逐位查询所 述系统表缓存区中所述系统表中的循环位图。
[0082] 所述从所述系统表缓存区中查询所述系统表中的循环位图,具体为:从所述系统 表缓存区中获取所述系统表中的动态控制指令,根据所述动态控制指令获取循环位图中相 应的位置。
[0083] 一种对存储设备进行数据读取的方法,包括:调用读取函数,向所述读取函数中传 入读取地址和读取长度,所述读取函数执行以下操作:
[0084] 步骤A1 :从所述存储设备中获取系统表,判断所述系统表是否为空,如果是,则执 行步骤A7,否则执行步骤A2;
[0085] 步骤A2 :根据所述读取地址计算逻辑页号,根据所述逻辑页号计算与所述逻辑页 号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
[0086] 步骤A3 :判断所述地址映射页的物理页号是否为第四预设值,如果是,则执行步 骤A7,否则执行步骤A4;
[0087] 步骤A4 :根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所 述地址映射页中读出用户数据页的物理页号;
[0088] 步骤A5 :判断所述用户数据页的物理页号是否为所述第四预设值,如果是,则执 行步骤A7,否则执行步骤A6 ;
[0089] 步骤A6 :根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数 据,并将所述相应的数据返回,读取结束;
[0090] 步骤A7 :根据所述读取长度,返回长度为所述读取长度的第五预设值,读取结束。 [0091] 所述从所述存储设备中获取系统表,具体包括:
[0092] 步骤hi :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第 一有效系统表;
[0093] 步骤h2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第 二有效系统表;
[0094] 步骤h3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤h4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中,执行步骤A2;如果只有所述第二有效系统表 通过校验,则将所述第二有效系统表写入所述系统表缓存区中,执行步骤A2 ;如果均未通 过校验,则报错,结束;
[0095] 步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如 果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓 存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读 入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值 对应的有效系统表读入所述系统表缓存区中,执行步骤A2。
[0096] 所述步骤A2中,所述根据所述读取地址计算逻辑页号,具体为:将所述读取地址 除以预设页长,将得到的商作为逻辑页号;
[0097] 所述步骤A2中,所述根据所述逻辑页号计算与所述逻辑页号对应的地址映射页 的物理页号和所述逻辑页号在地址映射页的页内偏移,具体为:将所述逻辑页号除以预设 页长,根据得到的商从所述系统表中获取与所述逻辑页号对应的地址映射页的物理页号, 将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
[0098] 所述步骤A3与所述步骤A4之间还包括:将所述地址映射页的物理页号转换为所 述地址映射页的物理地址,判断从地址映射缓存区中是否能够找到所述地址映射页的物理 地址,如果是,则根据所述地址映射页的物理页号和在地址映射页的页内偏移,从所述地址 映射缓存区中读出用户数据页的物理页号,执行步骤A5,否则执行步骤A4。
[0099] 所述步骤A5与所述步骤A6之间还包括:将所述用户数据页的物理页号转换为所 述用户数据页的物理地址,判断用户数据缓存区中是否存在所述用户数据页的物理地址, 如果是,则根据所述读取地址和所述读取长度,从所述用户数据缓存区中读取相应的数据, 将读取到的数据返回,读取结束,否则执行步骤A6。
[0100] 一种对存储设备进行数据写入的装置,包括:
[0101] 调用模块:用于调用写入函数,向所述写入函数传入待写数据、待写数据的长度和 待写数据的逻辑地址;
[0102] 获取模块:用于当所述调用模块向所述写入函数传入待写数据、待写数据的长度 和待写数据的逻辑地址后,从所述存储设备中获取系统表;
[0103] 计算模块:用于根据待写数据的逻辑地址,计算所述待写数据的逻辑页号;用于 根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射 页的页内偏移;
[0104] 选择模块:用于当所述计算模块计算得到与所述逻辑页号对应的地址映射页的逻 辑页号和在所述地址映射页的页内偏移时,从所述系统表缓存区中查询所述系统表中的循 环位图,选择所述循环位图中的一个未用比特位,作为第一比特位,将所述第一比特位置为 已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;用于 从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特 位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中所述第二比特 位对应数据页作为新地址映射页;
[0105] 判断模块:用于当所述计算模块计算得到所述地址映射页的逻辑页号和在所述 地址映射页的页内偏移时,根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏 移,判断是否能够从所述地址映射页中获取到第一物理页号;用于判断是否能够从所述系 统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号;
[0106] 更新模块:用于当所述判断模块判断出能够从所述地址映射页中获取到第一物理 页号时,根据所述存储设备中所述第一物理页号对应的数据、所述待写数据及所述待写数 据的长度,更新所述新用户数据页;用于当所述判断模块判断出不能够从所述地址映射页 中获取到第一物理页号时,将所述新用户数据页中的数据清空,根据所述待写数据及所述 待写数据的长度,更新所述新用户数据页中的数据;用于当所述判断模块判断出能够获取 到与所述地址映射页的物理页号对应的第二物理页号时,根据所述存储设备中所述第二物 理页号对应的数据更新所述新地址映射页;
[0107] 写入模块:用于当所述获取模块获取到系统表时,将所述系统表写入系统表缓存 区中;用于当所述判断模块判断出不能够获取到与所述地址映射页的物理页号对应的第二 物理页号时,将所述新地址映射页中的数据清空;用于将所述新用户数据页的页号写入所 述新地址映射页中;用于将所述新地址映射页的物理页号写入所述系统表缓存区的所述系 统表中;用于获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位 置为未用比特位,将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置。
[0108] 所述获取模块,还用于从所述存储设备中获取有效静态回收标记页;
[0109] 所述判断模块,还用于当所述获取模块获取到所述有效静态回收标记页时,根据 所述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收;
[0110] 所述装置还包括,静态回收模块,用于执行静态回收操作。
[0111] 所述获取模块,具体用于执行以下操作:
[0112] 步骤al :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
[0113] 步骤a2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
[0114] 步骤a3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤a4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索 弓丨;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将 第一有效系统表的页号记为更新索引;如果均未通过校验,则报错,结束;
[0115] 步骤a4 :获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记, 如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表 缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引;如果是所述第二预 设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将 所述第二预设值对应的有效系统表的页号记为更新索引;如果是所述第三预设值和所述第 一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三 预设值对应的有效系统表的页号记为更新索引。
[0116] 所述写入模块,具体用于将所述系统表缓存区中的所述系统表写入所述更新索引 对应的有效系统表中;
[0117] 所述更新模块,还用于更新所述更新索引对应的有效系统表中的新旧标记。
[0118] 所述判断模块,还用于判断所述系统表缓存区中的所述系统表写入所述更新索引 对应的有效系统表时是否出现坏页;
[0119] 所述获取模块,还用于当所述判断模块判断出所述系统表缓存区中的所述系统表 写入所述更新索引对应的有效系统表出现坏页时,获取与所述更新索引对应的有效系统表 相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统 表中;
[0120] 所述更新模块,具体用于当所述判断模块判断出所述系统表缓存区中的所述系统 表写入所述更新索引对应的有效系统表未出现坏页时,更新所述更新索引对应的有效系统 表中的新旧标记。
[0121] 所述判断模块,还用于判断所述更新索引对应的有效系统表中的新旧标记;
[0122] 所述更新模块,还用于当所述判断模块判断出所述更新索引对应的有效系统表中 的新旧标记为第一预设值时,将所述新旧标记更新为所述第三预设值;还用于当所述判断 模块判断出所述更新索引对应的有效系统表中的新旧标记为第二预设值时,将所述新旧标 记更新为所述第一预设值;还用于当所述判断模块判断出所述更新索引对应的有效系统表 中的新旧标记为第三预设值时,将所述新旧标记更新为所述第二预设值。
[0123] 所述计算模块,具体用于将所述待写数据的逻辑地址除以预设页长,将得到的商 作为逻辑页号。
[0124] 所述计算模块,具体用于将所述逻辑页号除以预设页长的二分之一,将得到的商 作为所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述 地址映射页的页内偏移。
[0125] 所述判断模块,具体用于根据所述地址映射页的逻辑页号,查找所述系统表中的 地址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两 个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和 在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为 OxfffT。
[0126] 步骤1 :将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否 在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3 ;
[0127] 步骤2 :根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中 的数据,触发选择模块;
[0128] 步骤3 :将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区 中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选 择丰吴块;
[0129] 所述写入模块,还用于将所述用户数据缓存区中的数据写入所述新用户数据页 中。
[0130] 所述判断模块,还用于判断判断所述用户数据缓存区中的数据写入所述新用户数 据页时是否出现坏页;
[0131] 所述写入模块,具体用于当所述判断模块判断出所述用户数据缓存区中的数据写 入所述新用户数据页未出现坏页时,将所述用户数据缓存区中的数据写入所述新用户数据 页中。
[0132] 所述判断模块,具体用于执行以下操作:
[0133] 步骤aal :将执行写入读出次数置为初始值;
[0134] 步骤aa2 :将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤aa3 ;
[0135] 步骤aa3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据 缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
[0136] 所述更新模块,具体用于执行以下操作:
[0137] 步骤bl :将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否 在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2 ;
[0138] 步骤b2 :将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区 中,执行步骤b3 ;
[0139] 步骤b3 :将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映 射页中。
[0140] 所述判断模块,还用于判断所述地址映射缓存区中的数据写入所述存储设备中的 所述新地址映射页时是否出现坏页;
[0141] 所述写入模块,具体用于当所述判断模块判断出所述地址映射缓存区中的数据写 入所述新地址映射页未出现坏页时,将所述地址映射缓存区中的数据写入所述存储设备中 的所述新地址映射页中。
[0142] 所述写入模块,具体用于执行以下操作:
[0143] 步骤bbl :将执行写入读出的操作次数置为初始值;
[0144] 步骤bb2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该 相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤bb3 ;
[0145] 步骤bb3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址 映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
[0146] 所述计算模块,还用于根据所述新用户数据页的页号和所述新地址映射页的物理 页号,计算对应的擦除计数页;
[0147] 所述选择模块,还用于从所述系统表缓存区中查询所述系统表中的循环位图,选 择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位, 将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
[0148] 所述判断模块,还用于判断从所述系统表中是否能够获取到与所述擦除计数页的 页号对应的第三物理页号;
[0149] 所述写入模块,还用于当所述判断模块判断出从所述系统表中能够获取到与所述 擦除计数页的页号对应的第三物理页号时,将所述第三物理页号对应的存储设备中的数据 写入所述新擦除计数页中;
[0150] 所述更新模块,还用于当所述判断模块判断出从所述系统表中不能够获取到与所 述擦除计数页的页号对应的第三物理页号时,将所述新擦除计数页中的数据清空;还用于 从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次 数,更新对应的擦除次数;还用于根据所述新擦除计数页的页号和更新后的擦除次数更新 所述系统表缓存区中的所述系统表。
[0151] 所述写入模块,具体用于执行以下操作:
[0152] 步骤el :将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否 在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2 ;
[0153] 步骤e2 :将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区 中,执行步骤e3 ;
[0154] 步骤e3 :将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计 数页中。
[0155] 所述判断模块,还用于判断所述擦除计数缓存区中的数据写入所述存储设备中的 所述新擦除计数页中时是否出现坏页;
[0156] 所述写入模块,具体用于当所述判断模块判断出所述擦除计数缓存区中的数据写 入所述存储设备中的所述新擦除计数页中未出现坏页时,将所述擦除计数缓存区中的数据 写入所述存储设备中的所述新擦除计数页中。
[0157] 所述判断模块,具体用于执行以下操作:
[0158] 步骤ccl :将执行写入读出的操作次数置为初始值;
[0159] 步骤cc2 :将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤cc3 ;
[0160] 步骤cc3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除 计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
[0161] 所述更新模块中,所述从所述新擦除计数页中分别查找与所述新用户数据页和所 述新地址映射页对应的擦除次数,更新对应的擦除次数,具体用于将所述新擦除计数页中 与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
[0162] 所述更新模块中,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所 述系统表缓存区中的所述系统表,具体用于根据所述更新后的擦除次数更新所述系统表缓 存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区 中的所述系统表中。
[0163] 所述判断模块,还用于判断所述新擦除计数页中的擦除次数是否大于第一预设 值;还用于当所述计算模块计算得到平均擦除次数时,判断所述平均擦除次数是否大于第 二预设值;
[0164] 所述获取模块,还用于当所述判断模块判断出所述新擦除计数页中的擦除次数不 大于第一预设值时或当所述设置模块将静态回收标记设置为需要进行静态回收时,获取所 述系统表中的擦除总数;
[0165] 所述计算模块,还用于当所述获取模块获取到所述系统表中的擦除总数时,根据 所述擦除总数,计算得到平均擦除次数;
[0166] 所述装置还包括:
[0167] 设置模块,用于当所述判断模块判断出所述新擦除计数页中的擦除次数大于第一 预设值时,将静态回收标记设置为需要进行静态回收;用于当所述判断模块判断出所述平 均擦除次数大于第二预设值时,将静态回收标记置为需要进行静态回收。
[0168] 所述静态回收模块,具体用于执行以下操作:
[0169] 步骤gl :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获 取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作 为当前地址映射页;
[0170] 步骤g2 :判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据 当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行 步骤gl6 ;
[0171] 步骤g3 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四 比特位对应的存储设备区域作为待回收地址映射页;
[0172] 步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是, 则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5 ;
[0173] 步骤g5:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否 则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲, 执行步骤g6 ;
[0174] 步骤g6 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤g3,否则执行步骤g7 ;
[0175] 步骤g7 :将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页 修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数 据页的页号,将第一个用户数据页作为当前用户数据页;
[0176] 步骤g8 :判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据 当前用户数据页的页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤 gl5 ;
[0177] 步骤g9 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五 比特位对应的存储设备区域作为待回收用户数据页;
[0178] 步骤glO :判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是, 则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤gll ;
[0179] 步骤gll :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤gl4, 否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执 行步骤gl2 ;
[0180] 步骤gl3 :判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出 现坏页,如果是,则执行步骤g9,否则执行步骤gl4 ;
[0181] 步骤gl4:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户 数据页修改当前地址映射页中当前用户数据页对应的页号;
[0182] 步骤gl5 :判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行 步骤gl6,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤 g8 ;
[0183] 步骤gl6 :判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则 将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中, 回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行 步骤g2。
[0184] 所述选择模块,具体用于逐位查询所述系统表缓存区中所述系统表中的循环位 图。
[0185] 所述选择模块,具体用于从所述系统表缓存区中获取所述系统表中的动态控制指 令,根据所述动态控制指令获取循环位图中相应的位置。
[0186] 一种对存储设备进行数据读取的装置,包括:
[0187] 调用模块:用于调用读取函数,向所述读取函数中传入读取地址和读取长度;
[0188] 获取模块:用于当调用模块向所述读取函数中传入读取地址和读取长度后,从所 述存储设备中获取系统表;
[0189] 判断模块:用于当获取模块从所述存储设备中获取到系统表时,判断所述系统表 是否为空;用于当计算模块计算出地址映射页的物理页号时,判断所述地址映射页的物理 页号是否为第四预设值;用于当计算模块计算出用户数据页的页号时,判断所述用户数据 页的页号是否为所述第四预设值;
[0190] 计算模块:用于当所述判断模块判断出所述系统表不为空时,根据所述读取地址 计算逻辑页号,用于计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在 所述地址映射页的页内偏移;
[0191] 读取模块:用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设 值时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射 页中读出用户数据页的页号;用于当所述判断模块判断出所述用户数据页的页号为所述第 四预设值时,根据所述读取长度,返回长度为所述读取长度的第五预设值;用于当所述判断 模块判断出所述用户数据页的页号不为所述第三预设值时,根据所述读取地址和所述读取 长度,从所述用户数据页中读取相应的数据,并将所述相应的数据返回。
[0192] 所述获取模块,具体用于执行以下操作:
[0193] 步骤hi :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第 一有效系统表;
[0194] 步骤h2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第 二有效系统表;
[0195] 步骤h3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤h4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中;如果只有所述第二有效系统表通过校验,则 将所述第二有效系统表写入所述系统表缓存区中;如果均未通过校验,则报错,结束;
[0196] 步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如 果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓 存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读 入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值 对应的有效系统表读入所述系统表缓存区中。
[0197] 所述计算模块,具体用于将所述读取地址除以预设页长,将得到的商作为逻辑页 号;具体用于将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取与所述逻 辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页 的页内偏移。
[0198] 第一转换模块,用于当所述判断模块判断出所述地址映射页的物理页号不为第四 预设值时,将所述地址映射页的物理页号转换为所述地址映射页的物理地址;
[0199] 所述判断模块,还用于当所述第一转换模块得到所述地址映射页的物理地址时, 判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址;
[0200] 所述读取模块:具体用于当所述判断模块判断出从所述地址映射缓存区中获取到 所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在地址映射页的页内偏 移,从所述地址映射缓存区读出用户数据页的页号;具体用于当所述判断模块判断出从所 述地址映射缓存区中不能读取所述地址映射页的物理地址时,根据所述地址映射页的物理 页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号。
[0201] 第二转换模块,用于当所述判断模块判断出所述用户数据页的页号不为第四预设 值时,将所述用户数据页的页号转换为所述用户数据页的物理地址;
[0202] 所述判断模块,还用于当所述第二转换模块得到所述用户数据页的物理地址时, 判断用户数据缓存区中是否存在所述用户数据页的物理地址;
[0203] 所述读取模块:具体用于当所述判断模块判断出从所述用户数据缓存区中存在所 述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据缓存区 中读取相应的数据,将读取到的数据返回;具体用于当所述判断模块判断出所述用户数据 缓存区中不存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所 述用户数据页中读出相应的数据,并将所述相应的数据返回。
[0204] 本发明取得的有益效果是:采用本发明技术方案,通过系统表、地址映射页、用户 数据页的两级映射关系进行数据的读写,通过管理循环位图,能够实现磨损平衡,通过采用 缓存机制,减少对存储设备的擦写次数,延长了存储设备的使用寿命。

【专利附图】

【附图说明】
[0205] 为了更清楚的说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本 发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以 根据这些附图获得其他的附图。
[0206] 图1是本发明实施例一提供的一种对存储设备进行数据写入的方法流程图;
[0207] 图2是本发明实施例二提供的一种对存储设备进行数据读取的方法流程图;
[0208] 图3和图4是本发明实施例三提供的一种对存储设备进行数据写入的方法流程 图;
[0209] 图5是本发明实施例三中步骤302的具体细化图;
[0210] 图6是本发明实施例四提供的一种对存储设备进行数据读取的方法流程图;
[0211] 图7和图8是本发明实施例五提供的静态回收的具体操作流程图;
[0212] 图9是本发明实施例六提供的一种对存储设备进行数据写入的装置图;
[0213] 图10是本发明实施例七提供的一种对存储设备进行数据读取的装置图。

【具体实施方式】
[0214] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他 实施例,都属于本发明保护的范围。其中,存储设备由系统区和数据区组成,其中,数据区中 包括多个数据页,其中,数据页包括用户数据页、地址映射页和擦除计数页,其中,用户数据 页中存放的是用户有效数据,地址映射页中存放的是每个用户数据页的物理页号,擦除计 数页中存放的是用户数据页和地址映射页的擦除次数;系统区中包括多个系统表和多个静 态回收标记页。
[0215] 优选的,本实施例中,以预设页长为256字节为例来说明,存储设备的前64页为64 页的系统表,最后一页系统表之后的4页为静态回收标记页,最后一页静态回收标记页之 后的区域为用户区;
[0216] 其中,4页静态回收标记页中仅包含一页有效静态回收标记页,当有效静态回收标 记页为坏页时,为防止数据丢失,将标识需要静态回收的预设值写入其余静态回收标记页 中;
[0217] 其中,64页系统表中仅包含两页有效系统表,当有效系统表为坏页时,为防止数据 丢失,将系统表缓存区中的数据写入其余系统表中,每一页系统表中均包括地址映射索引、 擦除计数索引、动态控制指针、用户区剩余未用空间大小、擦除总数、循环位图、新旧标记和 校验码;
[0218] 其中,地址映射索引具体占用系统表32字节,存储16个地址映射页的物理页号; 擦除计数索引具体占用系统表16字节,存储8个擦除计数页的页号;动态控制指针占用系 统表2字节,用于标识循环位图的当前位置;用户区剩余未用空间大小占用系统表2字节; 擦除总数占用系统表4字节;循环位图占用系统表196字节,每个字节的每一位按顺序对 应存储设备中的区域即存储设备的用户区中的每一个数据页是否未用,预先约定1表示未 用,0表示已用;新旧标记占用系统表2字节,用于标识该系统表为新系统表或旧系统表;校 验码占用系统表2字节;
[0219] 本实施例中,预先设定,地址映射索引中第一、二字节代表第一个地址映射页的页 号,第三、四字节代表第二个地址映射页的页号,以此类推;同样的,预先设定,擦除计数索 引中第一、二个字节代表第一个擦除计数页的页号,第三、四个字节代表第二个擦除计数页 的页号,以此类推;
[0220] 例如,地址映射页的页号为0x0002,则为第三个地址映射页(第一个地址映射页 的页号为0x0000、第二个地址映射页的页号为0x0001),则对应的获取地址映射索引的第 五、六个字节;如果地址映射索引为00010203040506070809……则根据地址映射页的页号 获取到的数据为0x0405 ;
[0221] 例如,擦除计数页的页号为0x0001,则为第二个擦除计数页(第一个擦除计数页 的页号为0x0000),则对应的获取擦除计数索引的第五、六个字节;如果擦除计数索引为 00010203040506070809……则根据擦除计数页的页号获取到的数据为0x0203 ;
[0222] 本实施例中,为了达到对存储设备的磨损平衡,相应地,与所述存储设备位于同一 装置中的RAM里设置有擦除计数缓存区、地址映射缓存区、用户数据缓存区和系统表缓存 区,长度各为1页;
[0223] 其中,用户数据缓存区中存放的是用户数据页中的数据和用户数据页的物理地 址,地址映射缓存区中存放的是地址映射页中的数据和地址映射页的物理地址,擦除计数 缓存区中存放的是擦除计数页中的数据和擦除计数页的物理地址,系统表缓存区中存放的 是系统表中的数据和系统表的物理地址;
[0224] 实施例一
[0225] 本发明实施例一提供了一种对存储设备进行数据读写的方法,如图1所示,包括: 调用写入函数,向所述写入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址, 所述写入函数接收到传入的待写数据、待写数据的长度和待写数据的逻辑地址后,执行以 下操作:
[0226] 步骤101 :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,根 据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号,根据所述逻辑页号,计算与所 述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
[0227] 步骤102 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储 设备中与所述第一比特位对应的数据页作为新用户数据页;
[0228] 步骤103 :根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判 断是否能够从所述地址映射页中获取到第一物理页号,如果是,则根据所述存储设备中所 述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据 页,执行步骤105,否则执行步骤104 ;
[0229] 步骤104 :将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数 据的长度,更新所述新用户数据页中的数据;
[0230] 步骤105 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储 设备中所述第二比特位对应的数据页作为新地址映射页;
[0231] 步骤106 :判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址 映射页的物理页号对应的第二物理页号,如果是,则根据所述存储设备中所述第二物理页 号对应的数据更新所述新地址映射页,执行步骤107,否则将所述新地址映射页中的数据清 空,执行步骤107 ;
[0232] 步骤107 :将所述新用户数据页的物理页号写入所述新地址映射页中,并将所述 新地址映射页的物理页号写入所述系统表缓存区的所述系统表中,获取所述系统表的循环 位图中与所述地址映射页对应的比特位,将该比特位置为未用比特位;
[0233] 步骤108 :将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置, 写入结束。
[0234] 采用本发明技术方案,通过系统表、地址映射页、用户数据页的两级映射关系进行 数据的读写,通过管理循环位图,能够实现磨损平衡,通过采用缓存机制,减少对存储设备 的擦写次数,延长了存储设备的使用寿命。
[0235] 实施例二
[0236] 本发明实施例二提供了一种对存储设备进行数据读取的方法,如图2所示,本实 施例中的存储设备采用实施例一提供的方法进行数据写入;所述方法包括:调用读取函 数,向所述读取函数中传入读取地址(该地址为逻辑地址)和读取长度,所述读取函数接收 到传入的读取地址和读取长度后,执行以下操作:
[0237] 步骤201 :从所述存储设备中获取系统表,判断所述系统表是否为空,如果是,则 执行步骤207,否则执行步骤202 ;
[0238] 步骤202 :根据所述读取地址计算逻辑页号,计算与所述逻辑页号对应的地址映 射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
[0239] 步骤203 :判断所述地址映射页的物理页号是否为第四预设值,如果是,则执行步 骤207,否则执行步骤204 ;
[0240] 步骤204 :根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从 所述地址映射页中读出用户数据页的物理页号;
[0241] 步骤205 :判断所述用户数据页的物理页号是否为所述第四预设值,如果是,则执 行步骤207,否则执行步骤206 ;
[0242] 优选的,所述第四预设值为Oxffff ;
[0243] 步骤206 :根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的 数据,并将所述相应的数据返回,读取结束;
[0244] 步骤207 :根据所述读取长度,返回相应长度的第五预设值,读取结束。
[0245] 优选的,第五预设值为Oxff,例如,读取长度为5字节,则返回的数据为Oxff OxfT Oxff Oxff Oxff。
[0246] 实施例三
[0247] 本发明实施例三提供了一种对存储设备进行数据写入的方法,本实施例以预设页 长为256字节为例来说明,如图3和图4所示,包括:调用写入函数,向所述写入函数中传入 待写数据、待写数据的长度和待写数据的逻辑地址,所述写入函数接收到传入的待写数据、 待写数据的长度和待写数据的逻辑地址后执行以下操作:
[0248] 步骤301 :从存储设备中获取有效静态回收标记页中的静态回收标记,判断静态 回收标记是否为预设值,如果是,则执行静态回收的操作,执行步骤302,否则直接执行步骤 302 ;
[0249] 具体地,获取全部静态回收标记页中的数据,获取每个静态回收标记页中的有效 数据和校验值,对有效数据进行计算,得到的结果判断是否与校验值相同,是则确认该静态 回收标记页为有效静态回收标记页,获取该静态回收标记页中的静态回收标记作为有效静 态回收标记页中的静态回收标记;否则继续校验直至找到正确的有效静态回收标记页,如 果均不相同,则报错;
[0250] 本实施例中,静态回收标记为有效静态回收标记页的前四个字节,优选的,所述判 断有效静态回收标记页中的静态回收标记是否为预设值,具体为:判断有效静态回收标记 页中的前四个字节的值是否为0xAA55AA55,如果是,则标识需要进行静态回收,否则标识不 需要进行静态回收;
[0251] 其中,执行静态回收的操作在实施例五中具体描述,在此不再赘述;
[0252] 步骤302 :判断是否能够从系统表缓存区中获取到系统表,如果是,则执行步骤 304,否则执行步骤303 ;
[0253] 本实施例中,所述判断是否能够从系统表缓存区中获取到系统表,具体为:判断系 统表缓存区是否为空,如果是,则不能获取到系统表,否则获取到系统表;
[0254] 其中,存储设备的系统区中只有两页系统表中存放有效数据,其余系统表为空或 已为坏页,优选采用从两边向中间的方法进行系统表的存储,例如,存储设备的系统区中一 共有16页系统表,其中,存放有效数据的为第一页系统表和第十六页系统表,如果在对第 一页系统表擦写时出现坏页,则将有效数据写入第二页系统表中,如果在对第十六页系统 表擦写时出现坏页,则将有效数据写入第十五页系统表中,依次类推;
[0255] 步骤303 :从存储设备中获取系统表,将存储设备中系统表中的数据写入系统表 缓存区中,执行步骤304;
[0256] 参见图5,本实施例中,从存储设备中获取系统表,将存储设备中的系统表写入系 统表缓存区中,具体操作为 :
[0257] 步骤al :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
[0258] 优选的,第四预设值为Oxff ;预先设置系统区中最中间的一页为全ff页且不可修 改,例如,本实施例中,系统区中共16页系统表,则将第8页系统表设置为全ff不可修改状 态;
[0259] 步骤a2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
[0260] 步骤a3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验;
[0261] 如果均通过校验,则执行步骤a4 ;
[0262] 如果只有第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓 存区中,将所述第二有效系统表的页号记为更新索引,执行步骤304 ;
[0263] 如果只有第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中, 将第一有效系统表的页号记为更新索引,执行步骤304 ;
[0264] 如果均未通过校验,则报错,结束;
[0265] 其中,所述判断第一有效系统表和第二有效系统表中的数据是否能够通过校验, 具体为:
[0266] 获取所述第一有效系统表中的第一有效数据和第一校验码,根据所述第一有效数 据进行校验计算,判断校验结果与所述第一校验码是否相同,如果是,则第一有效系统表通 过校验,否则第一有效系统表未通过校验;
[0267] 同时,获取所述第二有效系统表中的第二有效数据和第二校验码,根据所述第二 有效数据进行校验计算,判断校验结果与所述第二校验码是否相同,如果是,则第二有效系 统表通过校验,否则第二有效系统表未通过校验;
[0268] 步骤a4 :获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记;
[0269] 如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所 述系统表缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引,执行步骤 304 ;
[0270] 如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读 入所述系统表缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引,执行 步骤304 ;
[0271] 如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统 表读入所述系统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引, 执行步骤304。
[0272] 优选的,第一预设值为0x5555,第二预设值为0x55AA,第三预设值为0xAA55 ;
[0273] 进一步的,如果存储设备从未进行过数据擦写操作,则获取到的有效系统表中的 数据全为ff,则将系统表缓存区中的数据直接置为全ff ;
[0274] 步骤304 :根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号;
[0275] 例如,本实施例中,所述待写数据为0x33,待写数据的逻辑地址为0x9D04 ;根据待 写数据的逻辑地址计算逻辑页号,具体为:将待写数据的逻辑地址除以预设页长,得到的商 为逻辑页号,本实施例得到的逻辑页号为0x9D ;
[0276] 步骤305 :根据所述逻辑页号,获知与所述逻辑页号对应的地址映射页的物理页 号和在地址映射页的页内偏移;
[0277] 本实施例中,每张地址映射页可以存储用户区中连续的128个用户物理地址,因 此,根据所述逻辑页号,获知所述逻辑页号在地址映射页中的页号和在地址映射页的页内 偏移,具体为:将所述逻辑页号除以128,得到的商为与所述逻辑页号对应的地址映射页的 物理页号,余数为逻辑页号在地址映射页中的页内偏移;
[0278] 例如,本实施例中,逻辑页号为0x9D,除以128,得到的商为1,余数为29,即地址映 射页的物理页号为1,在地址映射页的页内偏移为29 ;
[0279] 步骤306 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述第一 比特位对应的存储设备的区域作为新用户数据页;
[0280] 例如,本实施例中,系统表缓存区中的数据为:
[0281] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0282] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0283] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0284] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0285] ......
[0286] 其中,从第57字节往后的196字节均为循环位图,循环位图的每一位按顺序对应 存储设备中用户区的每一页,获取循环位图的第一个字节ff,即11111111,将最高位的1作 为第一比特位,将第一比特位置为0,即01111111,则循环位图的第一个字节转为7f ;第一 比特位对应的新用户数据页的物理页号为0x0000 ;
[0287] 本实施例中,通过管理循环位图,能够实现在出现坏页时存储设备仍能正常工作, 并能够实现防掉电;
[0288] 步骤307 :根据地址映射页的逻辑页号和在地址映射页的页内偏移,判断是否能 够从地址映射页中获取到第一物理页号,如果是,则执行步骤308,否则将用户数据缓存区 中的数据清空,执行步骤313 ;
[0289] 其中,所述根据地址映射页的逻辑页号和在地址映射页的页内偏移,判断是否能 够从地址映射页中获取到第一物理页号,具体为:根据地址映射页的逻辑页号,查找系统表 的地址映射索引,将逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数据,作 为地址映射页的物理页号,然后根据地址映射页的物理页号和在地址映射页的页内偏移, 从地址映射页中获取数据,判断获取到的数据是否为OxfTfT,如果是,则未找到第一物理页 号,否则找到第一物理页号;
[0290] 例如,所述地址映射页为:
[0291] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0292] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0293] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0294] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0295] ......
[0296] 步骤308 :将第一物理页号转化为第一物理地址,并判断所述第一物理地址是否 在用户数据缓存区中,如果是,则执行步骤313,否则执行步骤309 ;
[0297] 步骤309 :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤312, 否则执行步骤310;
[0298] 其中,判断用户数据缓存区中是否存在空闲缓存页,具体为:判断用户数据缓存区 中的空闲标识是否置位,如果是,则存在空闲缓存页,否则不存在空闲缓存页,其中用户数 据缓存区中可以包含一个或多个用户数据缓存页,本实施例以一页为例来说明;
[0299] 步骤310 :将用户数据缓存区中的数据写入存储设备的相应位置,将用户数据缓 存区置为空闲;
[0300] 具体为:获取用户数据缓存区中保存的物理地址,根据该物理地址将用户数据缓 存区中的数据写入存储设备中与该物理地址对应的数据页中;
[0301] 其中,将用户数据缓存区置为空闲,具体为:将用户数据缓存区中的空闲标识置 位;
[0302] 步骤311 :判断用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤306,否则执行步骤312 ;
[0303] 其中,判断是否出现坏页,具体为:
[0304] 步骤aal :将执行写入读出次数置为初始值;
[0305] 步骤aa2 :将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤aa3 ;
[0306] 步骤aa3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据 缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2;
[0307] 步骤312 :将第一物理页号对应的存储设备中的数据写入用户数据缓存区中;
[0308] 步骤313 :根据待写数据及待写数据的长度,更新用户数据缓存区中的数据;
[0309] 步骤314 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述第二 比特位对应的存储设备的区域作为新地址映射页;
[0310] 步骤315 :判断是否能够从所述系统表缓存区中获取到与所述地址映射页的物理 页号对应的第二物理页号,如果是,则执行步骤316,否则将所述地址映射缓存区中的数据 清空,执行步骤321 ;
[0311] 其中,判断是否能够从所述系统表缓存区中获取到与所述地址映射页的物理页号 对应的第二物理页号,具体为:判断从系统表缓存区中获取到与地址映射页的物理页号对 应的数据是否为第四预设值OxfTfT,如果是,则不能获取对应的第二物理地址,否则能够获 取对应的第二物理地址;
[0312] 其中,将所述地址映射缓存区中的数据清空,具体为:将所述地址映射缓存区中的 数据置为全Οχ-- ;
[0313] 步骤316 :将所述第二物理页号转换为第二物理地址,并判断所述第二物理地址 是否在地址映射缓存区中,如果是,则执行步骤321,否则执行步骤317 ;
[0314] 步骤317 :判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤320, 否则执行步骤318;
[0315] 其中,判断地址映射表缓存区中是否存在空闲缓存页,具体为:判断地址映射表缓 存区中的空闲标识是否置位,如果是,则存在空闲缓存页,否则不存在空闲缓存页;
[0316] 步骤318 :将地址映射缓存区中的数据写入存储设备的相应位置,将地址映射缓 存区置为空闲;
[0317] 具体为:获取地址映射缓存区中保存的物理地址,根据该物理地址将地址映射缓 存区中的数据写入存储设备中与该物理地址对应的数据页中;
[0318] 其中,所述将地址映射缓存区置为空闲,具体为:将地址映射缓存区中的空闲标识 置位;
[0319] 步骤319 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤314,否则执行步骤320 ;
[0320] 其中,判断是否出现坏页,具体为:
[0321] 步骤bbl :将执行写入读出的操作次数置为初始值;
[0322] 步骤bb2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该 相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤bb3 ;
[0323] 步骤bb3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址 映射缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤bb2 ;
[0324] 其中,优选的,预设次数为3次;
[0325] 步骤320 :将新地址映射页中的数据写入地址映射缓存区中;
[0326] 例如,将地址映射页的物理页号为0x0001对应的页中的数据写入地址映射表缓 存区中;
[0327] 步骤321 :将所述新用户数据页的物理页号写入地址映射缓存区中,并将新地址 映射页的物理页号写入系统表缓存区中;
[0328] 例如,本实施例中,将用户数据页的物理页号0x0000写入地址映射缓存区中,将 地址映射页的物理页号0x0001写入系统表缓存区中;
[0329] 其中,写入后的地址映射缓存区为:
[0330] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0331] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0332] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0333] ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff
[0334] ......
[0335] 与入后的系统表缓存区为:
[0336] ff ff 00 01 ff ff ff ff ff ff ff ff ff ff ff ff
[0337] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0338] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0339] 00 02 05 e7 00 00 00 00 3f ff ff ff ff ff ff ff
[0340] ......
[0341] 其中,因循环位图中的第0位和第1位置为0,第2位为1,故将动态指针置为00 02,05 e7为用户数据区的未用空间,因未对存储设备进行擦除操作,故将擦除总数置为00 00 00 00, 3f......为循环位图;
[0342] 步骤322 :根据所述新用户数据页的物理页号和新地址映射页的物理页号,计算 对应的擦除计数页;
[0343] 本实施例中,所述根据所述新用户数据页号和地址映射表页号,计算对应的擦除 计数页,具体为:
[0344] 步骤dl :将所述新用户数据页的物理页号除以预设页长,得到第一商值;
[0345] 步骤d2 :将所述新地址映射页的物理页号除以预设页长,得到第二商值;
[0346] 步骤d3 :判断所述第一商值与所述第二商值是否相同,如果是,则获取与所述第 一商值对应的页作为擦除计数页,否则分别获取与所述第一商值对应的擦除计数页和与所 述第二商值对应的擦除计数页,将获取到的页作为擦除计数页;
[0347] 本实施例中,当计算得到的第一商值与第二商值不相同时,则分别获取与第一商 值和第二商值对应的两页,对这两页的具体操作相同,因此将第一商值对应的页和第二商 值对应的页均作为擦除计数页;以下各步骤对擦除计数页的操作,如果是在第一商值和第 二商值不相同的情况下,则所指擦除计数页均为对两页进行操作;
[0348] 步骤323 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述第三 比特位对应的存储设备的区域作为新擦除计数页;
[0349] 本实施例中,获取循环位图的第一个字节3f,即00111111,将第三位1作为第三比 特位,将第三比特位置为〇,即00011111,则循环位图的第一个字节转为If,第三比特位对 应的存储设备为页号是0x0002的页,将页号为0x0002的页作为新擦除计数页;
[0350] 步骤324 :判断从所述系统表缓存区中的系统表中是否能够获取到与所述擦除计 数页的页号对应的第三物理页号,如果是,则执行步骤325,否则将所述擦除计数缓存区中 的数据清空,执行步骤330;
[0351] 其中,判断是否能够从系统表缓存区中读出擦除计数页对应的第三物理页号,具 体为:判断从系统表缓存区中的擦除计数索引中获取到与擦除计数页的页号对应的数据是 否OxfTfT,如果是,则未找到第三物理页号,否则将该数据作为第三物理页号;
[0352] 步骤325 :将第三物理页号转化为第三物理地址,判断第三物理地址是否在擦除 计数缓存区中,如果是,则执行步骤330,否则执行步骤326 ;
[0353] 其中,所述将第三物理页号转化为第三物理地址,具体为:将第三物理页号乘以预 设页长的结果作为第三物理地址;
[0354] 步骤326 :判断擦除计数缓存区中是否存在空闲缓存页,如果是,则执行步骤329, 否则执行步骤327 ;
[0355] 其中,判断擦除计数缓存区中是否存在空闲缓存页,具体为:判断擦除计数缓存区 中的空闲标识是否置位,如果是,则存在空闲缓存页,否则不存在空闲缓存页;
[0356] 步骤327 :将擦除计数缓存区中的数据写入存储设备的相应位置,将擦除计数缓 存区置为空闲;
[0357] 具体为:获取擦除计数缓存区中保存的物理地址,根据该物理地址将擦除计数缓 存区中的数据写入存储设备中与该物理地址对应的数据页中;
[0358] 其中,所述将擦除计数缓存区置为空闲,具体为:将擦除计数缓存区中的空闲标识 置位;
[0359] 步骤328 :判断擦除计数缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤323,否则执行步骤329 ;
[0360] 其中,判断是否出现坏页,具体为:
[0361] 步骤ccl :将执行写入读出的操作次数置为初始值;
[0362] 步骤cc2 :将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤cc3 ;
[0363] 步骤cc3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除 计数缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤cc2 ;
[0364] 步骤329 :将新擦除计数页中的数据写入擦除计数缓存区中;
[0365] 例如,将页号为0x0002的新擦除计数页中的数据读入擦除计数缓存区中;
[0366] 步骤330 :从所述擦除计数缓存区中查找与所述新用户数据页和所述新地址映射 页对应的擦除次数,更新对应的擦除次数,根据所述新擦除计数页的页号和更新后的擦除 次数更新所述系统表缓存区中的所述系统表;
[0367] 本实施例中,所述更新对应的擦除次数,具体为:将擦除计数缓存区中,与新用户 数据页和新地址映射页对应的擦除次数均加0x01 ;
[0368] 例如,本实施例中,更新后的擦除计数缓存区中的数据为:
[0369] 01 01 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0370] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0371] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0372] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0373] ......
[0374] 进一步的,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统 表缓存区中的所述系统表,具体为:根据所述更新后的擦除次数更新所述系统表缓存区中 的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所 述系统表的擦除计数索引中:
[0375] 更新后的系统表缓存区为:
[0376] ff ff 00 01 ff ff ff ff ff ff ff ff ff ff ff ff
[0377] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0378] 00 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0379] 00 03 05 e7 00 00 00 02 If ff ff ff ff ff ff ff
[0380] ......
[0381] 步骤331 :判断擦除计数页中是否存在大于第六预设值的擦除次数,如果是,则执 行步骤333,否则执行步骤332 ;
[0382] 优选的,第六预设值为250 ;
[0383] 步骤332 :根据擦除计数页中的擦除次数和系统表缓存区中的擦除总数,计算平 均擦除次数,判断平均擦除次数是否大于第七预设值,如果是,则执行步骤333,否则执行步 骤 334 ;
[0384] 优选的,第七预设值为200 ;
[0385] 其中,所述根据擦除计数页中的擦除次数和系统表缓存区中的擦除总数,计算平 均擦除次数,具体为:获取擦除计数页中的所有擦除次数,将所有擦除次数相加,得到总擦 除次数,从系统表缓存区中获取擦除总数,将总擦除次数除以擦除总数,得到平均擦除次 数;
[0386] 步骤333 :将有效静态回收标记页中的静态回收标记置为预设值;
[0387] 具体的,将静态回收标记页中的静态回收标记即前四个字节设置为0xaa55aa55, 标识需要进行静态回收;
[0388] 步骤334:根据第一物理地址、第二物理地址和第三物理地址,将用户数据缓存 区、地址映射缓存区、擦除计数缓存区和系统表缓存区中的数据写入存储设备的相应位 置;
[0389] 本实施例中,优选的,按照用户数据缓存区、地址映射缓存区、擦除计数缓存区和 系统表缓存区的顺序将其中的数据写入存储设备中;
[0390] 本步骤中,先将用户数据缓存区中的数据写入存储设备的用户区中第一物理地址 为0x0000的位置,然后将地址映射缓存区中的数据写入存储设备的用户区中第二物理地 址为0x0001的位置,再将擦除计数缓存区中的数据写入存储设备的用户区中第三物理地 址为0x0002的位置,最后将系统表缓存区写入存储设备的系统区中。
[0391] 其中,将系统表缓存区中的数据写入存储设备的相应位置,具体为:将所述系统表 缓存区中的所述系统表写入所述更新索引对应的有效系统表中,更新所述更新索引对应的 有效系统表中的新旧标记;
[0392] 所述将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表 中,还包括:
[0393] 判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时 是否出现坏页,如果是,则获取与所述更新索引对应的有效系统表相邻的非坏页的系统表, 将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中;
[0394] 例如,本实施例中,系统区包括16页系统表,如果当前有效系统表为第1页和第16 页,则如果更新索引对应的有效系统表为第1页,写入时发现为坏页时,将相邻的第2页作 为新的系统表,将数据写入第2页系统表中;如果更新索引对应的有效系统表为第16页,写 入时发现为坏页时,将相邻的第15页作为新的系统表,将数据写入第15页系统表中,依次 类推;
[0395] 更新所述更新索引对应的有效系统表中的新旧标记,具体为:判断所述更新索引 对应的有效系统表中的新旧标记,如果是所述第一预设值,则将该新旧标记更新为所述第 三预设值,如果是所述第二预设值,则将该新旧标记更新为所述第一预设值,如果是所述第 三预设值,则将该新旧标记更新为所述第二预设值。
[0396] 采用本发明技术方案,通过系统表、地址映射页、用户数据页的两级映射关系进行 数据的读写,通过管理循环位图,能够实现磨损平衡,通过采用缓存机制,减少对存储设备 的擦写次数,延长了存储设备的使用寿命。
[0397] 实施例四
[0398] 本发明实施例四提供了一种对存储设备进行数据读取的方法,如图6所示,本实 施例四中的存储设备采用实施例三提供的方法进行数据写入;所述方法包括:调用读取函 数,向所述读取函数中传入读取地址(该地址为逻辑地址)和读取长度,所述读取函数接收 到传入的读取地址和读取长度后执行以下操作:
[0399] 步骤401 :从存储设备中获取系统表,将系统表读入系统表缓存区中;
[0400] 本实施例中,所述从存储设备中犹取系统表,具体为:
[0401] 步骤hi :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
[0402] 步骤h2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表; [0403] 步骤h3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤h4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中,执行步骤402 ;如果只有所述第二有效系统 表通过校验,则将所述第二有效系统表写入所述系统表缓存区中,执行步骤402 ;如果均未 通过校验,则报错,结束;
[0404] 步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如 果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓 存区中,执行步骤402 ;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的 有效系统表读入所述系统表缓存区中,执行步骤402;如果是所述第三预设值和所述第一 预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,执行步骤402 ;
[0405] 优选的,第一预设值为0x5555,第二预设值为0x55AA,第三预设值为0xAA55 ;
[0406] 本实施例中,获取到的系统表为:
[0407] ff ff 00 01 ff ff ff ff ff ff ff ff ff ff ff ff
[0408] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0409] 00 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0410] 00 03 05 e7 00 00 00 02 If ff ff ff ff ff ff ff
[0411] ......
[0412] 步骤402 :判断系统表是否为空,如果是,则执行步骤413,否则执行步骤403 ;
[0413] 本实施例中,如果系统表为空,则说明存储设备未进行数据读写,即存储设备中的 数据全为OxfT ;
[0414] 步骤403 :根据读取地址计算逻辑页号,计算与所述逻辑页号对应的地址映射页 的物理页号和所述逻辑页号在地址映射页的页内偏移;
[0415] 其中,所述根据读取地址计算逻辑页号,具体为:将所述读取地址除以预设页长, 将得到的商作为逻辑页号;
[0416] 本实施例中,每张地址映射页可以存储用户区中连续的128个物理页号,因此,根 据读取地址计算逻辑页号,计算与所述逻辑页号对应的地址映射页的物理页号和在地址映 射页的页内偏移,具体为:将所述逻辑页号除以128,根据得到的商从系统表中读取逻辑页 号对应的地址映射页的物理页号,得到的余数为所述逻辑页号在所述地址映射页的页内偏 移其中,页内偏移是以2字节页号为单位的偏移;
[0417] 例如,本实施例中,读取地址为0x9D04,除以256,得到的商为1,即逻辑页号为 0x9D,将逻辑页号0x9D除以预设页长的二分之一 128,得到的商为1,说明为第二张地址映 射页(优选〇标识第一张地址映射页),即从系统表中的第三四字节获取与第二张地址映射 页对应的数据即为逻辑页号对应的地址映射页的物理页号0x0001,得到的余数为在地址映 射页中的页内偏移29 ;
[0418] 步骤404:判断地址映射页的物理页号是否为第四预设值,如果是,则执行步骤 413,否则执行步骤405 ;
[0419] 优选的,第四预设值为Oxffff ;
[0420] 步骤405 :根据所述地址映射页的物理页号计算所述地址映射页的物理地址;
[0421] 其中,所述根据所述地址映射页的物理页号计算所述地址映射页的物理地址,具 体为:将所述地址映射页的物理页号乘以预设页长的结果作为地址映射页的物理地址;
[0422] 步骤406 :判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址, 如果是,则执行步骤408,否则执行步骤407 ;
[0423] 步骤407 :根据所述地址映射页的物理页号和在地址映射页的页内偏移,从地址 映射页中读出用户数据页的物理页号,执行步骤409 ;
[0424] 步骤408 :根据所述地址映射页的物理页号和在地址映射页的页内偏移,从地址 映射缓存区读出用户数据页的物理页号,执行步骤409 ;
[0425] 例如,本实施例中,根据逻辑页号对应的地址映射页的物理页号0x0001得到的物 理地址,获取到的地址映射页中的数据为:
[0426] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0427] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0428] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0429] ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff
[0430] ......
[0431] 根据在地址映射页中的页内偏移29,则从地址映射页偏移58字节的位置开始获 取两个字节的数据,即为用户数据页的物理页号,即0x0000 ;
[0432] 步骤409 :判断用户数据页的物理页号是否为第四预设值,如果是,则执行步骤 413,否则执行步骤410 ;
[0433] 步骤410 :根据用户数据页的物理页号计算用户数据页的物理地址,判断用户数 据页的物理地址是否在用户数据缓存区中,如果是,则执行步骤411,否则执行步骤412 ;
[0434] 例如,本实施例中,将用户数据页的物理页号0x0000乘以预设页长256,得到的用 户数据页的物理地址为0x0000 ;
[0435] 步骤411 :根据所述读取地址和所述读取长度读取用户数据缓存区中的数据,将 读取到的数据返回,读取结束;
[0436] 例如,本实施例中,用户数据页为:
[0437] ff ff ff ff 33 ff ff ff ff ff ff ff ff ff ff ff
[0438] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0439] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0440] ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
[0441] ......
[0442] 则根据读取地址可知需读取的数据的偏移为0x04,读取长度为0x01,读取到的数 据为0x33 ;
[0443] 步骤412 :根据读取地址和读取长度读取存储设备中用户数据页中的数据,将读 取到的数据返回,读取结束;
[0444] 步骤413 :根据所述读取长度,返回相应长度的OxfT,读取结束;
[0445] 例如,读取长度为5字节,则返回的数据为Οχ -- -- -- -- --。
[0446] 实施例五
[0447] 本发明实施例五提供了静态回收的具体操作,如图7和图8所示,具体包括:
[0448] 步骤501 :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中;
[0449] 本实施例中,步骤501与实施例4中的步骤401相同,在此不再赘述;
[0450] 步骤502 :获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中 的第一个地址映射页作为当前地址映射页;
[0451] 步骤503 :判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则执行 步骤504,否则执行步骤521 ;
[0452] 优选的,所述第六预设值为250 ;
[0453] 本实施例中,如果当前地址映射页的擦除次数达到第六预设值时,说明对该地址 映射页进行擦写的次数太频繁,需要进行静态回收,实现磨损平衡;
[0454] 步骤504 :根据当前地址映射页的物理页号计算当前地址映射页的第四物理地 址;
[0455] 其中,根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,具 体为:将当前地址映射页的物理页号乘以预设页长,得到的值即为当前地址映射页的第四 物理地址;
[0456] 步骤505 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第 四比特位对应的存储设备区域作为待回收地址映射页;
[0457] 步骤506 :判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是, 则将第四比特位置为未用比特位,执行步骤505,否则执行步骤507 ;
[0458] 本实施例中,当待回收地址映射页的擦除次数小于第六预设值250时,则该待回 收地址映射页不需要进行静态回收,则将第四比特位置为未用比特位;
[0459] 步骤507 :判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤510, 否则执行步骤508 ;
[0460] 步骤508 :将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射 缓存区置为空闲;
[0461] 其中,将地址映射缓存区中的数据写入存储设备的相应位置,具体为:获取地址映 射缓存区中保存的页号,将地址映射缓存区中的数据写入存储设备中该页号对应的位置;
[0462] 步骤509 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤505,否则执行步骤510 ;
[0463] 其中,判断是否出现坏页,具体为:
[0464] 步骤ddl :将执行写入读出次数置为初始值;
[0465] 步骤dd2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤dd3 ;
[0466] 步骤dd3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述地址映射 缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤dd2 ;
[0467] 步骤510 :将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射 页修改所述系统表缓存区中当前地址映射页对应的页号;
[0468] 本实施例中,所述根据新地址映射页修改所述系统表缓存区中当前地址映射页对 应的页号,具体为:从系统表缓存区中系统表的地址映射索引中查找与当前地址映射页对 应的页号,将该页号改为新地址映射页的页号;
[0469] 步骤511 :获取当前地址映射页中所有用户数据页的物理页号,将第一个用户数 据页作为当前用户数据页;
[0470] 步骤512 :判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则执行 步骤513,否则执行步骤520 ;
[0471] 本实施例中,如果当前用户数据页的擦除次数达到第六预设值时,说明对该用户 数据页进行擦写的次数太频繁,需要进行静态回收,实现磨损平衡;
[0472] 步骤513 :根据当前用户数据页的物理页号计算当前用户数据页的第五物理地 址;
[0473] 其中,根据当前用户数据页的物理页号计算当前用户数据页的第五物理地址,具 体为:将当前用户数据页的物理页号乘以预设页长,得到的值即为当前用户数据页的第五 物理地址;
[0474] 步骤514:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环 位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第 五比特位对应的存储设备区域作为待回收用户数据页;
[0475] 步骤515 :判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是, 则将第五比特位置为未用比特位,执行步骤514,否则执行步骤516 ;
[0476] 本实施例中,当待回收用户数据页的擦除次数小于第六预设值250时,则该待回 收用户数据页不需要进行静态回收,则将第五比特位置为未用比特位;
[0477] 步骤516 :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤519, 否则执行步骤517;
[0478] 步骤517 :将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存 区置为空闲;
[0479] 其中,将用户数据缓存区中的数据写入存储设备的相应位置,具体为:获取用户数 据缓存区中保存的页号,将用户数据缓存区中的数据写入存储设备中该页号对应的位置;
[0480] 步骤518 :判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出 现坏页,如果是,则执行步骤514,否则执行步骤519 ;
[0481] 其中,判断是否出现坏页,具体为:
[0482] 步骤eel :将执行写入读出次数置为初始值;
[0483] 步骤ee2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤ee3 ;
[0484] 步骤ee3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述地址映射 缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤ee2 ;
[0485] 步骤519 :将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户 数据页修改当前地址映射页中当前用户数据页对应的页号;
[0486] 本实施例中,所述根据新用户数据页修改当前地址映射页中当前用户数据页对应 的页号,具体为:从当前地址映射页中查找与当前用户数据页对应的页号,将该页号改为新 用户数据页的物理页号;
[0487] 步骤520 :判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行 步骤521,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤 512 ;
[0488] 步骤521 :判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则 将静态回收标识置为除预设值外的任意值,将系统表缓存区中的系统表写入存储设备中, 回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行 步骤503 ;
[0489] 其中,将静态回收标识置为除预设值外的任意值,具体为将静态回收标记置为除 0xaa55aa55外的任意值,优选的,将静态回收标识置位Oxffffffff ;
[0490] 本实施例提供的静态回收机制,对于某些页的擦写次数太高或者平均擦除次数太 高的情况,进行静态回收能够实现将擦写次数少的页与擦写次数多的页进行相互搬移,实 现磨损平衡,进一步延长存储设备的使用寿命。
[0491] 实施例六
[0492] 本发明实施例六提供了一种对存储设备进行数据写入的装置,如图9所示,包括: 调用模块101、获取模块102、计算模块103、选择模块104、判断模块105、更新模块106、写 入模块107 ;各模块之间的具体功能如下:
[0493] 调用模块101 :用于调用写入函数,向所述写入函数传入待写数据、待写数据的长 度和待写数据的逻辑地址;
[0494] 获取模块102 :用于当所述调用模块101向所述写入函数传入待写数据、待写数据 的长度和待写数据的逻辑地址后,从所述存储设备中获取系统表;
[0495] 计算模块103 :用于根据待写数据的逻辑地址,计算所述待写数据的逻辑页号;用 于根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映 射页的页内偏移;
[0496] 选择模块104 :用于当所述计算模块103计算得到与所述逻辑页号对应的地址映 射页的逻辑页号和在所述地址映射页的页内偏移时,从所述系统表缓存区中查询所述系统 表中的循环位图,选择所述循环位图中的一个未用比特位,作为第一比特位,将所述第一比 特位置为已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据 页;用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个 未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中所述 第二比特位对应数据页作为新地址映射页;
[0497] 判断模块105 :用于当所述计算模块103计算得到所述地址映射页的逻辑页号和 在所述地址映射页的页内偏移时,根据所述地址映射页的逻辑页号和在所述地址映射页的 页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号;用于判断是否能够从 所述系统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理 页号;
[0498] 更新模块106 :用于当所述判断模块105判断出能够从所述地址映射页中获取 到第一物理页号时,根据所述存储设备中所述第一物理页号对应的数据、所述待写数据及 所述待写数据的长度,更新所述新用户数据页;用于当所述判断模块105判断出不能够从 所述地址映射页中获取到第一物理页号时,将所述新用户数据页中的数据清空,根据所述 待写数据及所述待写数据的长度,更新所述新用户数据页中的数据;用于当所述判断模块 105判断出能够获取到与所述地址映射页的物理页号对应的第二物理页号时,根据所述存 储设备中所述第二物理页号对应的数据更新所述新地址映射页;
[0499] 写入模块107 :用于当所述获取模块102获取到系统表时,将所述系统表写入系统 表缓存区中;用于当所述判断模块105判断出不能够获取到与所述地址映射页的物理页号 对应的第二物理页号时,将所述新地址映射页中的数据清空;用于将所述新用户数据页的 页号写入所述新地址映射页中;用于将所述新地址映射页的物理页号写入所述系统表缓存 区的所述系统表中;用于获取所述系统表的循环位图中与所述地址映射页对应的比特位, 将该比特位置为未用比特位,将所述系统表缓存区中的所述系统表写入所述存储设备的相 应位置。
[0500] 其中,所述获取模块102,还用于从所述存储设备中获取有效静态回收标记页;
[0501] 所述判断模块105,还用于当所述获取模块102获取到所述有效静态回收标记页 时,根据所述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收;
[0502] 所述装置还包括,静态回收模块,用于执行静态回收操作。
[0503] 其中,所述获取模块102,具体用于执行以下操作:
[0504] 步骤al :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
[0505] 步骤a2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
[0506] 步骤a3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤a4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索 弓丨;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将 第一有效系统表的页号记为更新索引;如果均未通过校验,则报错,结束;
[0507] 步骤a4 :获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记, 如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表 缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引;如果是所述第二预 设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将 所述第二预设值对应的有效系统表的页号记为更新索引;如果是所述第三预设值和所述第 一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三 预设值对应的有效系统表的页号记为更新索引。
[0508] 进一步的,所述写入模块107,具体用于将所述系统表缓存区中的所述系统表写入 所述更新索引对应的有效系统表中;
[0509] 所述更新模块106,还用于更新所述更新索引对应的有效系统表中的新旧标记。
[0510] 更进一步的,所述判断模块105,还用于判断所述系统表缓存区中的所述系统表写 入所述更新索引对应的有效系统表时是否出现坏页;
[0511] 所述获取模块102,还用于当所述判断模块105判断出所述系统表缓存区中的所 述系统表写入所述更新索引对应的有效系统表出现坏页时,获取与所述更新索引对应的有 效系统表相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏 页的系统表中;
[0512] 所述更新模块106,具体用于当所述判断模块105判断出所述系统表缓存区中的 所述系统表写入所述更新索引对应的有效系统表未出现坏页时,更新所述更新索引对应的 有效系统表中的新旧标记。
[0513] 其中,所述判断模块105,还用于判断所述更新索引对应的有效系统表中的新旧标 记;
[0514] 所述更新模块106,还用于当所述判断模块105判断出所述更新索引对应的有效 系统表中的新旧标记为第一预设值时,将所述新旧标记更新为所述第三预设值;还用于当 所述判断模块105判断出所述更新索引对应的有效系统表中的新旧标记为第二预设值时, 将所述新旧标记更新为所述第一预设值;还用于当所述判断模块105判断出所述更新索 引对应的有效系统表中的新旧标记为第三预设值时,将所述新旧标记更新为所述第二预设 值。
[0515] 其中,所述计算模块103,具体用于将所述待写数据的逻辑地址除以预设页长,将 得到的商作为逻辑页号。
[0516] 其中,所述计算模块103,具体用于将所述逻辑页号除以预设页长的二分之一,将 得到的商作为所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页 号在所述地址映射页的页内偏移。
[0517] 其中,所述判断模块105,具体用于根据所述地址映射页的逻辑页号,查找所述系 统表中的地址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏 移,读取两个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物 理页号和在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数 据是否为Oxffff。
[0518] 其中,所述更新模块106,具体用于执行以下操作:
[0519] 步骤1 :将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否 在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3 ;
[0520] 步骤2 :根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中 的数据,触发选择模块104 ;
[0521] 步骤3 :将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区 中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选 择模块104 ;
[0522] 所述写入模块107,还用于将所述用户数据缓存区中的数据写入所述新用户数据 页中。
[0523] 其中,所述判断模块105,还用于判断判断所述用户数据缓存区中的数据写入所述 新用户数据页时是否出现坏页;
[0524] 所述写入模块107,具体用于当所述判断模块105判断出所述用户数据缓存区中 的数据写入所述新用户数据页未出现坏页时,将所述用户数据缓存区中的数据写入所述新 用户数据页中。
[0525] 进一步的,所述判断模块105,具体用于执行以下操作:
[0526] 步骤aal :将执行写入读出次数置为初始值;
[0527] 步骤aa2 :将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤aa3 ;
[0528] 步骤aa3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据 缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
[0529] 其中,所述更新模块106,具体用于执行以下操作:
[0530] 步骤bl :将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否 在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2 ;
[0531] 步骤b2 :将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区 中,执行步骤b3 ;
[0532] 步骤b3 :将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映 射页中。
[0533] 进一步的,所述判断模块105,还用于判断所述地址映射缓存区中的数据写入所述 存储设备中的所述新地址映射页时是否出现坏页;
[0534] 所述写入模块107,具体用于当所述判断模块105判断出所述地址映射缓存区中 的数据写入所述新地址映射页未出现坏页时,将所述地址映射缓存区中的数据写入所述存 储设备中的所述新地址映射页中。
[0535] 更进一步的,所述写入模块107,具体用于执行以下操作:
[0536] 步骤bbl :将执行写入读出的操作次数置为初始值;
[0537] 步骤bb2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该 相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤bb3 ;
[0538] 步骤bb3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址 映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
[0539] 其中,所述计算模块103,还用于根据所述新用户数据页的页号和所述新地址映射 页的物理页号,计算对应的擦除计数页;
[0540] 所述选择模块104,还用于从所述系统表缓存区中查询所述系统表中的循环位图, 选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特 位,将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
[0541] 所述判断模块105,还用于判断从所述系统表中是否能够获取到与所述擦除计数 页的页号对应的第三物理页号;
[0542] 所述写入模块107,还用于当所述判断模块105判断出从所述系统表中能够获取 到与所述擦除计数页的页号对应的第三物理页号时,将所述第三物理页号对应的存储设备 中的数据写入所述新擦除计数页中;
[0543] 所述更新模块106,还用于当所述判断模块105判断出从所述系统表中不能够获 取到与所述擦除计数页的页号对应的第三物理页号时,将所述新擦除计数页中的数据清 空;还用于从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应 的擦除次数,更新对应的擦除次数;还用于根据所述新擦除计数页的页号和更新后的擦除 次数更新所述系统表缓存区中的所述系统表。
[0544] 其中,所述写入模块107,具体用于执行以下操作:
[0545] 步骤el :将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否 在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2 ;
[0546] 步骤e2 :将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区 中,执行步骤e3 ;
[0547] 步骤e3 :将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计 数页中。
[0548] 进一步的,所述判断模块105,还用于判断所述擦除计数缓存区中的数据写入所述 存储设备中的所述新擦除计数页中时是否出现坏页;
[0549] 所述写入模块107,具体用于当所述判断模块105判断出所述擦除计数缓存区中 的数据写入所述存储设备中的所述新擦除计数页中未出现坏页时,将所述擦除计数缓存区 中的数据写入所述存储设备中的所述新擦除计数页中。
[0550] 其中,所述判断模块105,具体用于执行以下操作:
[0551] 步骤ccl :将执行写入读出的操作次数置为初始值;
[0552] 步骤cc2 :将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该 相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏 页,否则更新所述执行写入读出的次数,执行步骤cc3 ;
[0553] 步骤cc3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除 计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
[0554] 其中,所述更新模块106中,所述从所述新擦除计数页中分别查找与所述新用户 数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体用于将所述新擦 除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
[0555] 所述更新模块106中,所述根据所述新擦除计数页的页号和更新后的擦除次数更 新所述系统表缓存区中的所述系统表,具体用于根据所述更新后的擦除次数更新所述系统 表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓 存区中的所述系统表中。
[0556] 所述判断模块105,还用于判断所述新擦除计数页中的擦除次数是否大于第一预 设值;还用于当所述计算模块103计算得到平均擦除次数时,判断所述平均擦除次数是否 大于第二预设值;
[0557] 所述获取模块102,还用于当所述判断模块105判断出所述新擦除计数页中的擦 除次数不大于第一预设值时或当所述设置模块将静态回收标记设置为需要进行静态回收 时,获取所述系统表中的擦除总数;
[0558] 所述计算模块103,还用于当所述获取模块102获取到所述系统表中的擦除总数 时,根据所述擦除总数,计算得到平均擦除次数;
[0559] 所述装置还包括设置模块,用于当所述判断模块105判断出所述新擦除计数页中 的擦除次数大于第一预设值时,将静态回收标记设置为需要进行静态回收;用于当所述判 断模块105判断出所述平均擦除次数大于第二预设值时,将静态回收标记置为需要进行静 态回收。
[0560] 所述静态回收模块,具体用于执行以下操作:
[0561] 步骤gl :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获 取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作 为当前地址映射页;
[0562] 步骤g2 :判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据 当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行 步骤gl6 ;
[0563] 步骤g3 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四 比特位对应的存储设备区域作为待回收地址映射页;
[0564] 步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是, 则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5 ;
[0565] 步骤g5 :判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否 则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲, 执行步骤g6 ;
[0566] 步骤g6 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤g3,否则执行步骤g7 ;
[0567] 步骤g7 :将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页 修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数 据页的页号,将第一个用户数据页作为当前用户数据页;
[0568] 步骤g8 :判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据 当前用户数据页的页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤 gl5 ;
[0569] 步骤g9 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位 图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五 比特位对应的存储设备区域作为待回收用户数据页;
[0570] 步骤glO :判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是, 则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤gll ;
[0571] 步骤gll :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤gl4, 否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执 行步骤gl2 ;
[0572] 步骤gl3 :判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出 现坏页,如果是,则执行步骤g9,否则执行步骤gl4 ;
[0573] 步骤gl4:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户 数据页修改当前地址映射页中当前用户数据页对应的页号;
[0574] 步骤gl5 :判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行 步骤gl6,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤 g8 ;
[0575] 步骤gl6 :判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则 将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中, 回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行 步骤g2。
[0576] 所述选择模块104,具体用于逐位查询所述系统表缓存区中所述系统表中的循环 位图。
[0577] 所述选择模块104,具体用于从所述系统表缓存区中获取所述系统表中的动态控 制指令,根据所述动态控制指令获取循环位图中相应的位置。
[0578] 实施例七
[0579] 本发明实施例七提供了一种对存储设备进行数据读取的装置,如图10所示,包 括:调用模块201、获取模块202、判断模块203、计算模块204、读取模块205 ;各模块间的具 体功能为:
[0580] 调用模块201 :用于调用读取函数,向所述读取函数中传入读取地址和读取长度;
[0581] 获取模块202 :用于当调用模块201向所述读取函数中传入读取地址和读取长度 后,从所述存储设备中犹取系统表;
[0582] 判断模块203 :用于当获取模块202从所述存储设备中获取到系统表时,判断所述 系统表是否为空;用于当计算模块204计算出地址映射页的物理页号时,判断所述地址映 射页的物理页号是否为第四预设值;用于当计算模块204计算出用户数据页的页号时,判 断所述用户数据页的页号是否为所述第四预设值;
[0583] 计算模块204 :用于当所述判断模块203判断出所述系统表不为空时,根据所述读 取地址计算逻辑页号,用于计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑 页号在所述地址映射页的页内偏移;
[0584] 读取模块205 :用于当所述判断模块203判断出所述地址映射页的物理页号不为 第四预设值时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述 地址映射页中读出用户数据页的页号;用于当所述判断模块203判断出所述用户数据页的 页号为所述第四预设值时,根据所述读取长度,返回相应长度的第五预设值;用于当所述判 断模块203判断出所述用户数据页的页号不为所述第三预设值时,根据所述读取地址和所 述读取长度,从所述用户数据页中读取相应的数据,并将所述相应的数据返回。
[0585] 其中,所述获取模块202,具体用于执行以下操作:
[0586] 步骤hi :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第 一有效系统表;
[0587] 步骤h2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页 内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第 二有效系统表;
[0588] 步骤h3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通 过校验,如果均通过校验,则执行步骤h4 ;如果只有所述第一有效系统表通过校验,则将所 述第一有效系统表写入所述系统表缓存区中;如果只有所述第二有效系统表通过校验,则 将所述第二有效系统表写入所述系统表缓存区中;如果均未通过校验,则报错,结束;
[0589] 步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如 果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓 存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读 入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值 对应的有效系统表读入所述系统表缓存区中。
[0590] 其中,所述计算模块204,具体用于将所述读取地址除以预设页长,将得到的商作 为逻辑页号;具体用于将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取 与所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地 址映射页的页内偏移。
[0591] 其中,所述装置,还包括:第一转换模块,用于当所述判断模块203判断出所述地 址映射页的物理页号不为第四预设值时,将所述地址映射页的物理页号转换为所述地址映 射页的物理地址;
[0592] 所述判断模块203,还用于当所述第一转换模块得到所述地址映射页的物理地址 时,判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址;
[0593] 所述读取模块205 :具体用于当所述判断模块203判断出从所述地址映射缓存区 中获取到所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在地址映射 页的页内偏移,从所述地址映射缓存区读出用户数据页的页号;具体用于当所述判断模块 203判断出从所述地址映射缓存区中不能读取所述地址映射页的物理地址时,根据所述地 址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据 页的页号。
[0594] 其中,所述装置,还包括:第二转换模块,用于当所述判断模块203判断出所述用 户数据页的页号不为第四预设值时,将所述用户数据页的页号转换为所述用户数据页的物 理地址;
[0595] 所述判断模块203,还用于当所述第二转换模块得到所述用户数据页的物理地址 时,判断用户数据缓存区中是否存在所述用户数据页的物理地址;
[0596] 所述读取模块205 :具体用于当所述判断模块203判断出从所述用户数据缓存区 中存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数 据缓存区中读取相应的数据,将读取到的数据返回;具体用于当所述判断模块203判断出 所述用户数据缓存区中不存在所述用户数据页的物理地址时,根据所述读取地址和所述读 取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回。
[0597] 以上所述,仅为本发明较佳的【具体实施方式】,但本发明的保护范围并不局限于此, 任何熟悉本【技术领域】的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换, 都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围 为准。
【权利要求】
1. 一种对存储设备进行数据写入的方法,其特征在于,包括:调用写入函数,向所述写 入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址,所述写入函数执行以下 操作: 步骤S1 :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,根据所 述待写数据的逻辑地址,计算所述待写数据的逻辑页号,根据所述逻辑页号,计算与所述逻 辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移; 步骤S2 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设备中 与所述第一比特位对应的数据页作为新用户数据页; 步骤S3 :根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否 能够从所述地址映射页中获取到第一物理页号,如果是,则根据所述存储设备中与所述第 一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页,执 行步骤S5,否则执行步骤S4; 步骤S4 :将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据的长 度,更新所述新用户数据页中的数据; 步骤S5 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中 与所述第二比特位对应的数据页作为新地址映射页; 步骤S6 :判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址映射 页的物理页号对应的第二物理页号,如果是,则根据所述存储设备中与所述第二物理页号 对应的数据更新所述新地址映射页,执行步骤S7,否则将所述新地址映射页中的数据清空, 执行步骤S7 ; 步骤S7 :将所述新用户数据页的物理页号写入所述新地址映射页中,并将所述新地址 映射页的物理页号写入所述系统表缓存区的所述系统表中,获取所述系统表的循环位图中 与所述地址映射页对应的比特位,将该比特位置为未用比特位; 步骤S8 :将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置,写入结 束。
2. 根据权利要求1所述的方法,其特征在于,所述步骤S1之前,还包括:从所述存储设 备中获取有效静态回收标记页,根据所述有效静态回收标记页中的静态回收标记判断是否 需要进行静态回收,如果是,则执行静态回收操作,执行步骤S1,否则直接执行步骤S1。
3. 根据权利要求1所述的方法,其特征在于,所述步骤S1中,所述从所述存储设备中获 取系统表,将所述系统表写入系统表缓存区中,具体为: 步骤al :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表; 步骤a2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表; 步骤a3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校 验,如果均通过校验,则执行步骤a4 ;如果只有所述第一有效系统表通过校验,则将所述第 一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引,步 骤a3结束;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存 区中,将第一有效系统表的页号记为更新索引,步骤a3结束;如果均未通过校验,则报错, 步骤a3结束; 步骤a4 :获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记,如果 是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存 区中,将所述第一预设值对应的有效系统表的页号记为更新索引,步骤a4结束;如果是所 述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存 区中,将所述第二预设值对应的有效系统表的页号记为更新索引,步骤a4结束;如果是所 述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表 缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引,步骤a4结束。
4. 根据权利要求3所述的方法,其特征在于,所述步骤S8,具体为:将所述系统表缓存 区中的所述系统表写入所述更新索引对应的有效系统表中,更新所述更新索引对应的有效 系统表中的新旧标记。
5. 根据权利要求4所述的方法,其特征在于,所述将所述系统表缓存区中的所述系统 表写入所述更新索引对应的有效系统表中,还包括: 判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时是否 出现坏页,如果是,则获取与所述更新索引对应的有效系统表相邻的非坏页的系统表,将所 述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中,否则执行更新所述更新 索引对应的有效系统表中的新旧标记的操作。
6. 根据权利要求4所述的方法,其特征在于,所述更新所述更新索引对应的有效系统 表中的新旧标记,具体为:判断所述更新索引对应的有效系统表中的新旧标记,如果是所述 第一预设值,则将所述新旧标记更新为所述第三预设值,如果是所述第二预设值,则将所述 新旧标记更新为所述第一预设值,如果是所述第三预设值,则将所述新旧标记更新为所述 第二预设值。
7. 根据权利要求1所述的方法,其特征在于,所述步骤S1中,所述根据所述待写数据的 逻辑地址,计算所述待写数据的逻辑页号,具体为:将所述待写数据的逻辑地址除以预设页 长,将得到的商作为逻辑页号。
8. 根据权利要求1所述的方法,其特征在于,所述步骤S1中,所述根据所述逻辑页号, 计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移,具体 为:将所述逻辑页号除以预设页长的二分之一,将得到的商作为与所述逻辑页号对应的地 址映射页的逻辑页号,将得到的余数作为在所述地址映射页的页内偏移。
9. 根据权利要求1所述的方法,其特征在于,所述步骤S3中,所述根据所述地址映射 页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到 第一物理页号,具体为:根据所述地址映射页的逻辑页号,查找所述系统表中的地址映射索 弓丨,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数 据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在所述地址 映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为Oxffff,如果 是,则未找到第一物理页号,否则找到第一物理页号。
10. 根据权利要求1所述的方法,其特征在于, 所述步骤S3中,所述根据所述存储设备中与所述第一物理页号对应的数据、所述待写 数据及所述待写数据的长度,更新所述新用户数据页,具体为: 步骤1 :将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用 户数据缓存区中,如果是,则执行步骤2,否则执行步骤3 ; 步骤2 :根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数 据,执行步骤S5 ; 步骤3:将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中, 根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,执行步骤 S5 ; 所述步骤S8之前还包括:将所述用户数据缓存区中的数据写入所述新用户数据页中。
11. 根据权利要求10所述的方法,其特征在于,所述将所述用户数据缓存区中的数据 写入所述新用户数据页中,还包括:判断所述用户数据缓存区中的数据写入所述新用户数 据页时是否出现坏页,如果是,则返回执行步骤S2,否则将所述用户数据缓存区中的数据写 入所述新用户数据页中。
12. 根据权利要求11所述的方法,其特征在于,所述判断所述用户数据缓存区中的数 据写入存储设备的相应位置时是否出现坏页,具体为: 步骤aal :将执行写入读出次数置为初始值; 步骤aa2 :将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应 位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否 则更新所述执行写入读出的次数,执行步骤aa3 ; 步骤aa3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存 区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
13. 根据权利要求1所述的方法,其特征在于, 所述步骤S6中,所述根据所述存储设备中与所述第二物理页号对应的数据更新所述 新地址映射页,具体为: 步骤bl :将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地 址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2 ; 步骤b2 :将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执 行步骤b3 ; 步骤b3 :将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页 中,执行步骤S7。
14. 根据权利要求13所述的方法,其特征在于,所述步骤b3,还包括:判断所述地址映 射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页,如果是,则 返回步骤S5,否则将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射 页中。
15. 根据权利要求14所述的方法,其特征在于,所述判断所述地址映射缓存区中的数 据写入所述存储设备中的所述新地址映射页时是否出现坏页,具体为: 步骤bbl :将执行写入读出的操作次数置为初始值; 步骤bb2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应 位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否 则更新所述执行写入读出的次数,执行步骤bb3 ; 步骤bb3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射 缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
16. 根据权利要求1所述的方法,其特征在于,所述步骤S7与所述步骤S8之间还包括: 步骤cl :根据所述新用户数据页的物理页号和所述新地址映射页的物理页号,计算对 应的擦除计数页; 步骤c2 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设备中 所述第三比特位对应的数据页作为新擦除计数页; 步骤c3 :判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的第三 物理页号,如果是,则将所述第三物理页号对应存储设备中的数据写入所述新擦除计数页 中,执行步骤c4,否则将所述新擦除计数页中的数据清空,执行步骤c4 ; 步骤c4 :从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页 对应的擦除次数,更新对应的擦除次数,根据所述新擦除计数页的页号和更新后的擦除次 数更新所述系统表缓存区中的所述系统表,执行步骤S8。
17. 根据权利要求16所述的方法,其特征在于,所述步骤c3中,所述将所述第三物理页 号对应存储设备中的数据写入所述新擦除计数页中,具体为: 步骤el :将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦 除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2 ; 步骤e2 :将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执 行步骤e3 ; 步骤e3:将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页 中,执行步骤c4。
18. 根据权利要求17所述的方法,其特征在于,所述步骤e3,还包括:判断所述擦除计 数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页,如果是, 则返回步骤S5,否则将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计 数页中。
19. 根据权利要求18所述的方法,其特征在于,所述判断所述擦除计数缓存区中的数 据写入所述存储设备中的所述新擦除计数页中时是否出现坏页,具体为: 步骤ccl :将执行写入读出的操作次数置为初始值; 步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应 位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否 则更新所述执行写入读出的次数,执行步骤cc3 ; 步骤cc3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数 缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
20. 根据权利要求16所述的方法,其特征在于,所述从所述新擦除计数页中分别查 找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体 为:将所述新擦除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加 0x01ο
21. 根据权利要求16所述的方法,其特征在于,所述根据所述新擦除计数页的页号和 更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体为:根据所述更新后的擦 除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页 号写入所述系统表缓存区中的所述系统表中。
22. 根据权利要求16所述的方法,其特征在于,所述步骤c4与所述步骤S8之间还包 括: 步骤Π :判断所述新擦除计数页中的擦除次数是否大于第一预设值,如果是,则将静 态回收标记置为需要进行静态回收,执行步骤f2,否则执行步骤f2 ; 步骤f2 :获取所述系统表中的擦除总数,根据所述擦除总数,计算得到平均擦除次数, 判断所述平均擦除次数是否大于第二预设值,如果是,则将所述静态回收标识置位需要进 行静态回收,执行步骤S8,否则直接执行步骤S8。
23. 根据权利要求2所述的方法,其特征在于,所述执行静态回收操作,具体为: 步骤gl :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系 统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当 前地址映射页; 步骤g2 :判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前 地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤 gl6 ; 步骤g3 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特 位对应的存储设备区域作为待回收地址映射页; 步骤g4 :判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将 第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5 ; 步骤g5 :判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将 地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行 步骤g6 ; 步骤g6 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如 果是,则执行步骤g3,否则执行步骤g7 ; 步骤g7 :将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改 所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页 的物理页号,将第一个用户数据页作为当前用户数据页; 步骤g8 :判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前 用户数据页的物理页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤 gl5 ; 步骤g9 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特 位对应的存储设备区域作为待回收用户数据页; 步骤gl〇 :判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将 第五比特位置为未用比特位,执行步骤g9,否则执行步骤gll ; 步骤gll :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤gl4,否则 将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步 骤 gl2 ; 步骤gl3 :判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤g9,否则执行步骤gl4 ; 步骤gl4:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据 页修改当前地址映射页中当前用户数据页对应的页号; 步骤gl5 :判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤 gl6,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8 ; 步骤gl6 :判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静 态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收 成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤 g2。
24. 根据权利要求1或16所述的方法,其特征在于,所述从所述系统表缓存区中查询所 述系统表中的循环位图,具体为:逐位查询所述系统表缓存区中所述系统表中的循环位图。
25. 根据权利要求1或16所述的方法,其特征在于,所述从所述系统表缓存区中查询所 述系统表中的循环位图,具体为:从所述系统表缓存区中获取所述系统表中的动态控制指 令,根据所述动态控制指令获取循环位图中相应的位置。
26. -种对存储设备进行数据读取的方法,其特征在于,包括:调用读取函数,向所述 读取函数中传入读取地址和读取长度,所述读取函数执行以下操作: 步骤A1 :从所述存储设备中获取系统表,判断所述系统表是否为空,如果是,则执行步 骤A7,否则执行步骤A2; 步骤A2 :根据所述读取地址计算逻辑页号,根据所述逻辑页号计算与所述逻辑页号对 应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移; 步骤A3 :判断所述地址映射页的物理页号是否为第四预设值,如果是,则执行步骤A7, 否则执行步骤A4; 步骤A4:根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地 址映射页中读出用户数据页的物理页号; 步骤A5 :判断所述用户数据页的物理页号是否为所述第四预设值,如果是,则执行步 骤A7,否则执行步骤A6 ; 步骤A6 :根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据, 并将所述相应的数据返回,读取结束; 步骤A7 :根据所述读取长度,返回长度为所述读取长度的第五预设值,读取结束。
27. 根据权利要求26所述的方法,其特征在于,所述从所述存储设备中获取系统表,具 体包括: 步骤hi :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有 效系统表; 步骤h2 :从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第二有 效系统表; 步骤h3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校 验,如果均通过校验,则执行步骤h4 ;如果只有所述第一有效系统表通过校验,则将所述第 一有效系统表写入所述系统表缓存区中,执行步骤A2 ;如果只有所述第二有效系统表通过 校验,则将所述第二有效系统表写入所述系统表缓存区中,执行步骤A2;如果均未通过校 验,则报错,结束; 步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是 第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区 中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所 述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应 的有效系统表读入所述系统表缓存区中,执行步骤A2。
28. 根据权利要求26所述的方法,其特征在于, 所述步骤A2中,所述根据所述读取地址计算逻辑页号,具体为:将所述读取地址除以 预设页长,将得到的商作为逻辑页号; 所述步骤A2中,所述根据所述逻辑页号计算与所述逻辑页号对应的地址映射页的物 理页号和所述逻辑页号在地址映射页的页内偏移,具体为:将所述逻辑页号除以预设页长, 根据得到的商从所述系统表中获取与所述逻辑页号对应的地址映射页的物理页号,将得到 的余数作为所述逻辑页号在所述地址映射页的页内偏移。
29. 根据权利要求26所述的方法,其特征在于,所述步骤A3与所述步骤A4之间还包 括:将所述地址映射页的物理页号转换为所述地址映射页的物理地址,判断从地址映射缓 存区中是否能够找到所述地址映射页的物理地址,如果是,则根据所述地址映射页的物理 页号和在地址映射页的页内偏移,从所述地址映射缓存区中读出用户数据页的物理页号, 执行步骤A5,否则执行步骤A4。
30. 根据权利要求26所述的方法,其特征在于,所述步骤A5与所述步骤A6之间还包 括:将所述用户数据页的物理页号转换为所述用户数据页的物理地址,判断用户数据缓存 区中是否存在所述用户数据页的物理地址,如果是,则根据所述读取地址和所述读取长度, 从所述用户数据缓存区中读取相应的数据,将读取到的数据返回,读取结束,否则执行步骤 A6。
31. -种对存储设备进行数据写入的装置,其特征在于,包括: 调用模块:用于调用写入函数,向所述写入函数传入待写数据、待写数据的长度和待写 数据的逻辑地址; 获取模块:用于当所述调用模块向所述写入函数传入待写数据、待写数据的长度和待 写数据的逻辑地址后,从所述存储设备中获取系统表; 计算模块:用于根据待写数据的逻辑地址,计算所述待写数据的逻辑页号;用于根据 所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的 页内偏移; 选择模块:用于当所述计算模块计算得到与所述逻辑页号对应的地址映射页的逻辑页 号和在所述地址映射页的页内偏移时,从所述系统表缓存区中查询所述系统表中的循环位 图,选择所述循环位图中的一个未用比特位,作为第一比特位,将所述第一比特位置为已用 比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;用于从所 述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位, 作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中所述第二比特位 对应数据页作为新地址映射页; 判断模块:用于当所述计算模块计算得到所述地址映射页的逻辑页号和在所述地址映 射页的页内偏移时,根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判 断是否能够从所述地址映射页中获取到第一物理页号;用于判断是否能够从所述系统表缓 存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号; 更新模块:用于当所述判断模块判断出能够从所述地址映射页中获取到第一物理页号 时,根据所述存储设备中所述第一物理页号对应的数据、所述待写数据及所述待写数据的 长度,更新所述新用户数据页;用于当所述判断模块判断出不能够从所述地址映射页中获 取到第一物理页号时,将所述新用户数据页中的数据清空,根据所述待写数据及所述待写 数据的长度,更新所述新用户数据页中的数据;用于当所述判断模块判断出能够获取到与 所述地址映射页的物理页号对应的第二物理页号时,根据所述存储设备中所述第二物理页 号对应的数据更新所述新地址映射页; 写入模块:用于当所述获取模块获取到系统表时,将所述系统表写入系统表缓存区中; 用于当所述判断模块判断出不能够获取到与所述地址映射页的物理页号对应的第二物理 页号时,将所述新地址映射页中的数据清空;用于将所述新用户数据页的页号写入所述新 地址映射页中;用于将所述新地址映射页的物理页号写入所述系统表缓存区的所述系统表 中;用于获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位置为 未用比特位,将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置。
32. 根据权利要求31所述的装置,其特征在于, 所述获取模块,还用于从所述存储设备中获取有效静态回收标记页; 所述判断模块,还用于当所述获取模块获取到所述有效静态回收标记页时,根据所述 有效静态回收标记页中的静态回收标记判断是否需要进行静态回收; 所述装置还包括,静态回收模块,用于执行静态回收操作。
33. 根据权利要求31所述的装置,其特征在于, 所述获取模块,具体用于执行以下操作: 步骤al :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表; 步骤a2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表; 步骤a3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校 验,如果均通过校验,则执行步骤a4 ;如果只有所述第一有效系统表通过校验,则将所述第 一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引;如 果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将第一 有效系统表的页号记为更新索引;如果均未通过校验,则报错,结束; 步骤a4:获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记,如果 是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存 区中,将所述第一预设值对应的有效系统表的页号记为更新索引;如果是所述第二预设值 和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将所述 第二预设值对应的有效系统表的页号记为更新索引;如果是所述第三预设值和所述第一预 设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三预设 值对应的有效系统表的页号记为更新索引。
34. 根据权利要求33所述的装置,其特征在于, 所述写入模块,具体用于将所述系统表缓存区中的所述系统表写入所述更新索引对应 的有效系统表中; 所述更新模块,还用于更新所述更新索引对应的有效系统表中的新旧标记。
35. 根据权利要求34所述的装置,其特征在于, 所述判断模块,还用于判断所述系统表缓存区中的所述系统表写入所述更新索引对应 的有效系统表时是否出现坏页; 所述获取模块,还用于当所述判断模块判断出所述系统表缓存区中的所述系统表写 入所述更新索引对应的有效系统表出现坏页时,获取与所述更新索引对应的有效系统表相 邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表 中; 所述更新模块,具体用于当所述判断模块判断出所述系统表缓存区中的所述系统表写 入所述更新索引对应的有效系统表未出现坏页时,更新所述更新索引对应的有效系统表中 的新旧标记。
36. 根据权利要求34所述的装置,其特征在于, 所述判断模块,还用于判断所述更新索引对应的有效系统表中的新旧标记; 所述更新模块,还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新 旧标记为第一预设值时,将所述新旧标记更新为所述第三预设值;还用于当所述判断模块 判断出所述更新索引对应的有效系统表中的新旧标记为第二预设值时,将所述新旧标记更 新为所述第一预设值;还用于当所述判断模块判断出所述更新索引对应的有效系统表中的 新旧标记为第三预设值时,将所述新旧标记更新为所述第二预设值。
37. 根据权利要求31所述的装置,其特征在于, 所述计算模块,具体用于将所述待写数据的逻辑地址除以预设页长,将得到的商作为 逻辑页号。
38. 根据权利要求31所述的装置,其特征在于, 所述计算模块,具体用于将所述逻辑页号除以预设页长的二分之一,将得到的商作为 所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址 映射页的页内偏移。
39. 根据权利要求31所述的装置,其特征在于, 所述判断模块,具体用于根据所述地址映射页的逻辑页号,查找所述系统表中的地 址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两个 字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在 所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为 OxfffT。
40. 根据权利要求31所述的装置,其特征在于, 所述更新模块,具体用于执行以下操作: 步骤1 :将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用 户数据缓存区中,如果是,则执行步骤2,否则执行步骤3 ; 步骤2 :根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数 据,触发选择模块; 步骤3 :将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中, 根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择 模块; 所述写入模块,还用于将所述用户数据缓存区中的数据写入所述新用户数据页中。
41. 根据权利要求40所述的装置,其特征在于, 所述判断模块,还用于判断判断所述用户数据缓存区中的数据写入所述新用户数据页 时是否出现坏页; 所述写入模块,具体用于当所述判断模块判断出所述用户数据缓存区中的数据写入 所述新用户数据页未出现坏页时,将所述用户数据缓存区中的数据写入所述新用户数据页 中。
42. 根据权利要求41所述的装置,其特征在于, 所述判断模块,具体用于执行以下操作: 步骤aal :将执行写入读出次数置为初始值; 步骤aa2 :将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应 位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否 则更新所述执行写入读出的次数,执行步骤aa3 ; 步骤aa3 :判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存 区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
43. 根据权利要求31所述的装置,其特征在于, 所述更新模块,具体用于执行以下操作: 步骤bl :将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地 址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2 ; 步骤b2 :将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执 行步骤b3 ; 步骤b3 :将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页 中。
44. 根据权利要求43所述的装置,其特征在于, 所述判断模块,还用于判断所述地址映射缓存区中的数据写入所述存储设备中的所述 新地址映射页时是否出现坏页; 所述写入模块,具体用于当所述判断模块判断出所述地址映射缓存区中的数据写入所 述新地址映射页未出现坏页时,将所述地址映射缓存区中的数据写入所述存储设备中的所 述新地址映射页中。
45. 根据权利要求44所述的装置,其特征在于, 所述写入模块,具体用于执行以下操作: 步骤bbl :将执行写入读出的操作次数置为初始值; 步骤bb2 :将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应 位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否 则更新所述执行写入读出的次数,执行步骤bb3 ; 步骤bb3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射 缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
46. 根据权利要求31所述的装置,其特征在于, 所述计算模块,还用于根据所述新用户数据页的页号和所述新地址映射页的物理页 号,计算对应的擦除计数页; 所述选择模块,还用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所 述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所 述存储设备中所述第三比特位对应的数据页作为新擦除计数页; 所述判断模块,还用于判断从所述系统表中是否能够获取到与所述擦除计数页的页号 对应的第三物理页号; 所述写入模块,还用于当所述判断模块判断出从所述系统表中能够获取到与所述擦除 计数页的页号对应的第三物理页号时,将所述第三物理页号对应的存储设备中的数据写入 所述新擦除计数页中; 所述更新模块,还用于当所述判断模块判断出从所述系统表中不能够获取到与所述擦 除计数页的页号对应的第三物理页号时,将所述新擦除计数页中的数据清空;还用于从所 述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更 新对应的擦除次数;还用于根据所述新擦除计数页的页号和更新后的擦除次数更新所述系 统表缓存区中的所述系统表。
47. 根据权利要求46所述的装置,其特征在于, 所述写入模块,具体用于执行以下操作: 步骤el :将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦 除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2 ; 步骤e2 :将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执 行步骤e3 ; 步骤e3 :将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页 中。
48. 根据权利要求47所述的装置,其特征在于, 所述判断模块,还用于判断所述擦除计数缓存区中的数据写入所述存储设备中的所述 新擦除计数页中时是否出现坏页; 所述写入模块,具体用于当所述判断模块判断出所述擦除计数缓存区中的数据写入所 述存储设备中的所述新擦除计数页中未出现坏页时,将所述擦除计数缓存区中的数据写入 所述存储设备中的所述新擦除计数页中。
49. 根据权利要求48所述的装置,其特征在于, 所述判断模块,具体用于执行以下操作: 步骤ccl :将执行写入读出的操作次数置为初始值; 步骤cc2 :将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应 位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否 则更新所述执行写入读出的次数,执行步骤cc3 ; 步骤cc3 :判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数 缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
50. 根据权利要求46所述的装置,其特征在于, 所述更新模块中,所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新 地址映射页对应的擦除次数,更新对应的擦除次数,具体用于将所述新擦除计数页中与所 述新用户数据页和所述新地址映射页对应的擦除次数均加 0x01。
51. 根据权利要求46所述的装置,其特征在于, 所述更新模块中,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系 统表缓存区中的所述系统表,具体用于根据所述更新后的擦除次数更新所述系统表缓存区 中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的 所述系统表中。
52. 根据权利要求46所述的装置,其特征在于, 所述判断模块,还用于判断所述新擦除计数页中的擦除次数是否大于第一预设值;还 用于当所述计算模块计算得到平均擦除次数时,判断所述平均擦除次数是否大于第二预设 值; 所述获取模块,还用于当所述判断模块判断出所述新擦除计数页中的擦除次数不大于 第一预设值时或当所述设置模块将静态回收标记设置为需要进行静态回收时,获取所述系 统表中的擦除总数; 所述计算模块,还用于当所述获取模块获取到所述系统表中的擦除总数时,根据所述 擦除总数,计算得到平均擦除次数; 所述装置还包括: 设置模块,用于当所述判断模块判断出所述新擦除计数页中的擦除次数大于第一预设 值时,将静态回收标记设置为需要进行静态回收;用于当所述判断模块判断出所述平均擦 除次数大于第二预设值时,将静态回收标记置为需要进行静态回收。
53. 根据权利要求31所述的装置,其特征在于, 所述静态回收模块,具体用于执行以下操作: 步骤gl :从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系 统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当 前地址映射页; 步骤g2 :判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前 地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤 gl6 ; 步骤g3 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特 位对应的存储设备区域作为待回收地址映射页; 步骤g4 :判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将 第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5 ; 步骤g5 :判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将 地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行 步骤g6 ; 步骤g6 :判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如 果是,则执行步骤g3,否则执行步骤g7 ; 步骤g7 :将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改 所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页 的页号,将第一个用户数据页作为当前用户数据页; 步骤g8:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前 用户数据页的页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤gl5 ; 步骤g9 :从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中 的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特 位对应的存储设备区域作为待回收用户数据页; 步骤gl〇 :判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将 第五比特位置为未用比特位,执行步骤g9,否则执行步骤gll ; 步骤gll :判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤gl4,否则 将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步 骤 gl2 ; 步骤gl3 :判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏 页,如果是,则执行步骤g9,否则执行步骤gl4 ; 步骤gl4 :将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据 页修改当前地址映射页中当前用户数据页对应的页号; 步骤gl5 :判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤 gl6,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8 ; 步骤gl6 :判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静 态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收 成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤 g2。
54. 根据权利要求31或46所述的装置,其特征在于, 所述选择模块,具体用于逐位查询所述系统表缓存区中所述系统表中的循环位图。
55. 根据权利要求31或46所述的装置,其特征在于, 所述选择模块,具体用于从所述系统表缓存区中获取所述系统表中的动态控制指令, 根据所述动态控制指令获取循环位图中相应的位置。
56. -种对存储设备进行数据读取的装置,其特征在于,包括: 调用模块:用于调用读取函数,向所述读取函数中传入读取地址和读取长度; 获取模块:用于当调用模块向所述读取函数中传入读取地址和读取长度后,从所述存 储设备中获取系统表; 判断模块:用于当获取模块从所述存储设备中获取到系统表时,判断所述系统表是否 为空;用于当计算模块计算出地址映射页的物理页号时,判断所述地址映射页的物理页号 是否为第四预设值;用于当计算模块计算出用户数据页的页号时,判断所述用户数据页的 页号是否为所述第四预设值; 计算模块:用于当所述判断模块判断出所述系统表不为空时,根据所述读取地址计算 逻辑页号,用于计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述 地址映射页的页内偏移; 读取模块:用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设值 时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页 中读出用户数据页的页号;用于当所述判断模块判断出所述用户数据页的页号为所述第四 预设值时,根据所述读取长度,返回长度为所述读取长度的第五预设值;用于当所述判断模 块判断出所述用户数据页的页号不为所述第三预设值时,根据所述读取地址和所述读取长 度,从所述用户数据页中读取相应的数据,并将所述相应的数据返回。
57. 根据权利要求56所述的装置,其特征在于, 所述获取模块,具体用于执行以下操作: 步骤hi :从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有 效系统表; 步骤h2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数 据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第二有 效系统表; 步骤h3 :判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校 验,如果均通过校验,则执行步骤h4 ;如果只有所述第一有效系统表通过校验,则将所述第 一有效系统表写入所述系统表缓存区中;如果只有所述第二有效系统表通过校验,则将所 述第二有效系统表写入所述系统表缓存区中;如果均未通过校验,则报错,结束; 步骤h4 :分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是 第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区 中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所 述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应 的有效系统表读入所述系统表缓存区中。
58. 根据权利要求56所述的装置,其特征在于, 所述计算模块,具体用于将所述读取地址除以预设页长,将得到的商作为逻辑页号;具 体用于将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取与所述逻辑页号 对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内 偏移。
59. 根据权利要求56所述的装置,其特征在于,还包括: 第一转换模块,用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设 值时,将所述地址映射页的物理页号转换为所述地址映射页的物理地址; 所述判断模块,还用于当所述第一转换模块得到所述地址映射页的物理地址时,判断 从地址映射缓存区中是否能够找到所述地址映射页的物理地址; 所述读取模块:具体用于当所述判断模块判断出从所述地址映射缓存区中获取到所述 地址映射页的物理地址时,根据所述地址映射页的物理页号和在地址映射页的页内偏移, 从所述地址映射缓存区读出用户数据页的页号;具体用于当所述判断模块判断出从所述地 址映射缓存区中不能读取所述地址映射页的物理地址时,根据所述地址映射页的物理页号 和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号。
60.根据权利要求56所述的装置,其特征在于,还包括: 第二转换模块,用于当所述判断模块判断出所述用户数据页的页号不为第四预设值 时,将所述用户数据页的页号转换为所述用户数据页的物理地址; 所述判断模块,还用于当所述第二转换模块得到所述用户数据页的物理地址时,判断 用户数据缓存区中是否存在所述用户数据页的物理地址; 所述读取模块:具体用于当所述判断模块判断出从所述用户数据缓存区中存在所述用 户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据缓存区中读 取相应的数据,将读取到的数据返回;具体用于当所述判断模块判断出所述用户数据缓存 区中不存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用 户数据页中读出相应的数据,并将所述相应的数据返回。
【文档编号】G06F3/06GK104090730SQ201410322860
【公开日】2014年10月8日 申请日期:2014年7月8日 优先权日:2014年7月8日
【发明者】陆舟, 于华章 申请人:飞天诚信科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1