CN104090730A - 一种对存储设备进行数据读写的方法及装置 - Google Patents
一种对存储设备进行数据读写的方法及装置 Download PDFInfo
- Publication number
- CN104090730A CN104090730A CN201410322860.7A CN201410322860A CN104090730A CN 104090730 A CN104090730 A CN 104090730A CN 201410322860 A CN201410322860 A CN 201410322860A CN 104090730 A CN104090730 A CN 104090730A
- Authority
- CN
- China
- Prior art keywords
- page
- system table
- data
- address
- buffer area
- 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.)
- Granted
Links
Abstract
本发明公开了一种对存储设备进行数据读写的方法及装置,写方法为:选择系统表中循环位图的未用比特位,分配新用户数据页和新地址映射页,将待写数据写入新用户数据页,将新用户数据页的物理页号写入新地址映射页,将新地址映射页的物理页号写入系统表,将系统表写入存储设备;读方法为:从系统表中获取地址映射页的物理页号,从地址映射页获取用户数据页的物理页号,从用户数据页获取需要读取的数据。本发明的技术方案是通过系统表、地址映射页、用户数据页的两级映射关系进行数据的读写,通过管理循环位图,能够实现防掉电,通过采用缓存机制,减少对存储设备的擦写次数,实现磨损平衡。
Description
技术领域
本发明涉及信息安全领域,尤其涉及一种对存储设备进行数据读写的方法及装置。
背景技术
随着科学技术的发展,智能卡的市场不断扩大,而在使用智能卡的过程中,在未知情况下由于断电、失电或电的质量达不到要求而导致智能卡不能正常工作,如果此时智能卡正处于对存储设备(即非易失性存储区,包括EEPROM、FLASH等)进行擦写操作,则会导致存储设备中的原有数据的丢失,大大降低了智能卡的安全性。
另外,在向存储设备写入数据时,需要对数据进行擦写操作,在实际的擦写操作过程中,往往会对存储设备中的某一页进行频繁擦写,使擦写达不到平衡,而存储设备的擦写生命周期一般为十万次,由于对某些页进行过度的擦写从而导致存储设备的提早损坏,严重影响存储设备的使用寿命。
发明内容
本发明为了解决现有技术中存在的不足,提供了一种对存储设备进行数据读写的方法。
本发明采用的技术方案是:一种对存储设备进行数据写入的方法,包括:调用写入函数,向所述写入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址,所述写入函数执行以下操作:
步骤S1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号,根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
步骤S2:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;
步骤S3:根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号,如果是,则根据所述存储设备中与所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页,执行步骤S5,否则执行步骤S4;
步骤S4:将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据的长度,更新所述新用户数据页中的数据;
步骤S5:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中与所述第二比特位对应的数据页作为新地址映射页;
步骤S6:判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号,如果是,则根据所述存储设备中与所述第二物理页号对应的数据更新所述新地址映射页,执行步骤S7,否则将所述新地址映射页中的数据清空,执行步骤S7;
步骤S7:将所述新用户数据页的物理页号写入所述新地址映射页中,并将所述新地址映射页的物理页号写入所述系统表缓存区的所述系统表中,获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位置为未用比特位;
步骤S8:将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置,写入结束。
所述步骤S1之前,还包括:从所述存储设备中获取有效静态回收标记页,根据所述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收,如果是,则执行静态回收操作,执行步骤S1,否则直接执行步骤S1。
所述步骤S1中,所述从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,具体为:
步骤a1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
步骤a2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
步骤a3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤a4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引,步骤a3结束;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将第一有效系统表的页号记为更新索引,步骤a3结束;如果均未通过校验,则报错,步骤a3结束;
步骤a4:获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引,步骤a4结束;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引,步骤a4结束;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引,步骤a4结束。
所述步骤S8,具体为:将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中,更新所述更新索引对应的有效系统表中的新旧标记。
所述将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中,还包括:
判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时是否出现坏页,如果是,则获取与所述更新索引对应的有效系统表相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中,否则执行更新所述更新索引对应的有效系统表中的新旧标记的操作。
所述更新所述更新索引对应的有效系统表中的新旧标记,具体为:判断所述更新索引对应的有效系统表中的新旧标记,如果是所述第一预设值,则将所述新旧标记更新为所述第三预设值,如果是所述第二预设值,则将所述新旧标记更新为所述第一预设值,如果是所述第三预设值,则将所述新旧标记更新为所述第二预设值。
所述步骤S1中,所述根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号,具体为:将所述待写数据的逻辑地址除以预设页长,将得到的商作为逻辑页号。
所述步骤S1中,所述根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移,具体为:将所述逻辑页号除以预设页长的二分之一,将得到的商作为与所述逻辑页号对应的地址映射页的逻辑页号,将得到的余数作为在所述地址映射页的页内偏移。
所述步骤S3中,所述根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号,具体为:根据所述地址映射页的逻辑页号,查找所述系统表中的地址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为0xffff,如果是,则未找到第一物理页号,否则找到第一物理页号。
所述步骤S3中,所述根据所述存储设备中与所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页,具体为:
步骤1:将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3;
步骤2:根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,执行步骤S5;
步骤3:将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,执行步骤S5;
所述步骤S8之前还包括:将所述用户数据缓存区中的数据写入所述新用户数据页中。
所述将所述用户数据缓存区中的数据写入所述新用户数据页中,还包括:判断所述用户数据缓存区中的数据写入所述新用户数据页时是否出现坏页,如果是,则返回执行步骤S2,否则将所述用户数据缓存区中的数据写入所述新用户数据页中。
所述判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,具体为:
步骤aa1:将执行写入读出次数置为初始值;
步骤aa2:将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤aa3;
步骤aa3:判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
所述步骤S6中,所述根据所述存储设备中与所述第二物理页号对应的数据更新所述新地址映射页,具体为:
步骤b1:将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2;
步骤b2:将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执行步骤b3;
步骤b3:将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中,执行步骤S7。
所述步骤b3,还包括:判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页,如果是,则返回步骤S5,否则将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
所述判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页,具体为:
步骤bb1:将执行写入读出的操作次数置为初始值;
步骤bb2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤bb3;
步骤bb3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
所述步骤S7与所述步骤S8之间还包括:
步骤c1:根据所述新用户数据页的物理页号和所述新地址映射页的物理页号,计算对应的擦除计数页;
步骤c2:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
步骤c3:判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的第三物理页号,如果是,则将所述第三物理页号对应存储设备中的数据写入所述新擦除计数页中,执行步骤c4,否则将所述新擦除计数页中的数据清空,执行步骤c4;
步骤c4:从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,执行步骤S8。
所述步骤c3中,所述将所述第三物理页号对应存储设备中的数据写入所述新擦除计数页中,具体为:
步骤e1:将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2;
步骤e2:将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执行步骤e3;
步骤e3:将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中,执行步骤c4。
所述步骤e3,还包括:判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页,如果是,则返回步骤S5,否则将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
所述判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页,具体为:
步骤cc1:将执行写入读出的操作次数置为初始值;
步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤cc3;
步骤cc3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体为:将所述新擦除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体为:根据所述更新后的擦除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表中。
所述步骤c4与所述步骤S8之间还包括:
步骤f1:判断所述新擦除计数页中的擦除次数是否大于第一预设值,如果是,则将静态回收标记置为需要进行静态回收,执行步骤f2,否则执行步骤f2;
步骤f2:获取所述系统表中的擦除总数,根据所述擦除总数,计算得到平均擦除次数,判断所述平均擦除次数是否大于第二预设值,如果是,则将所述静态回收标识置位需要进行静态回收,执行步骤S8,否则直接执行步骤S8。
所述执行静态回收操作,具体为:
步骤g1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当前地址映射页;
步骤g2:判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤g16;
步骤g3:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特位对应的存储设备区域作为待回收地址映射页;
步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5;
步骤g5:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行步骤g6;
步骤g6:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g3,否则执行步骤g7;
步骤g7:将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页的物理页号,将第一个用户数据页作为当前用户数据页;
步骤g8:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前用户数据页的物理页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤g15;
步骤g9:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特位对应的存储设备区域作为待回收用户数据页;
步骤g10:判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤g11;
步骤g11:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤g14,否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步骤g12;
步骤g13:判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g9,否则执行步骤g14;
步骤g14:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号;
步骤g15:判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤g16,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8;
步骤g16:判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤g2。
所述从所述系统表缓存区中查询所述系统表中的循环位图,具体为:逐位查询所述系统表缓存区中所述系统表中的循环位图。
所述从所述系统表缓存区中查询所述系统表中的循环位图,具体为:从所述系统表缓存区中获取所述系统表中的动态控制指令,根据所述动态控制指令获取循环位图中相应的位置。
一种对存储设备进行数据读取的方法,包括:调用读取函数,向所述读取函数中传入读取地址和读取长度,所述读取函数执行以下操作:
步骤A1:从所述存储设备中获取系统表,判断所述系统表是否为空,如果是,则执行步骤A7,否则执行步骤A2;
步骤A2:根据所述读取地址计算逻辑页号,根据所述逻辑页号计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
步骤A3:判断所述地址映射页的物理页号是否为第四预设值,如果是,则执行步骤A7,否则执行步骤A4;
步骤A4:根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的物理页号;
步骤A5:判断所述用户数据页的物理页号是否为所述第四预设值,如果是,则执行步骤A7,否则执行步骤A6;
步骤A6:根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回,读取结束;
步骤A7:根据所述读取长度,返回长度为所述读取长度的第五预设值,读取结束。
所述从所述存储设备中获取系统表,具体包括:
步骤h1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有效系统表;
步骤h2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第二有效系统表;
步骤h3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤h4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,执行步骤A2;如果只有所述第二有效系统表通过校验,则将所述第二有效系统表写入所述系统表缓存区中,执行步骤A2;如果均未通过校验,则报错,结束;
步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,执行步骤A2。
所述步骤A2中,所述根据所述读取地址计算逻辑页号,具体为:将所述读取地址除以预设页长,将得到的商作为逻辑页号;
所述步骤A2中,所述根据所述逻辑页号计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在地址映射页的页内偏移,具体为:将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取与所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
所述步骤A3与所述步骤A4之间还包括:将所述地址映射页的物理页号转换为所述地址映射页的物理地址,判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址,如果是,则根据所述地址映射页的物理页号和在地址映射页的页内偏移,从所述地址映射缓存区中读出用户数据页的物理页号,执行步骤A5,否则执行步骤A4。
所述步骤A5与所述步骤A6之间还包括:将所述用户数据页的物理页号转换为所述用户数据页的物理地址,判断用户数据缓存区中是否存在所述用户数据页的物理地址,如果是,则根据所述读取地址和所述读取长度,从所述用户数据缓存区中读取相应的数据,将读取到的数据返回,读取结束,否则执行步骤A6。
一种对存储设备进行数据写入的装置,包括:
调用模块:用于调用写入函数,向所述写入函数传入待写数据、待写数据的长度和待写数据的逻辑地址;
获取模块:用于当所述调用模块向所述写入函数传入待写数据、待写数据的长度和待写数据的逻辑地址后,从所述存储设备中获取系统表;
计算模块:用于根据待写数据的逻辑地址,计算所述待写数据的逻辑页号;用于根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
选择模块:用于当所述计算模块计算得到与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移时,从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中所述第二比特位对应数据页作为新地址映射页;
判断模块:用于当所述计算模块计算得到所述地址映射页的逻辑页号和在所述地址映射页的页内偏移时,根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号;用于判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号;
更新模块:用于当所述判断模块判断出能够从所述地址映射页中获取到第一物理页号时,根据所述存储设备中所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页;用于当所述判断模块判断出不能够从所述地址映射页中获取到第一物理页号时,将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据的长度,更新所述新用户数据页中的数据;用于当所述判断模块判断出能够获取到与所述地址映射页的物理页号对应的第二物理页号时,根据所述存储设备中所述第二物理页号对应的数据更新所述新地址映射页;
写入模块:用于当所述获取模块获取到系统表时,将所述系统表写入系统表缓存区中;用于当所述判断模块判断出不能够获取到与所述地址映射页的物理页号对应的第二物理页号时,将所述新地址映射页中的数据清空;用于将所述新用户数据页的页号写入所述新地址映射页中;用于将所述新地址映射页的物理页号写入所述系统表缓存区的所述系统表中;用于获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位置为未用比特位,将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置。
所述获取模块,还用于从所述存储设备中获取有效静态回收标记页;
所述判断模块,还用于当所述获取模块获取到所述有效静态回收标记页时,根据所述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收;
所述装置还包括,静态回收模块,用于执行静态回收操作。
所述获取模块,具体用于执行以下操作:
步骤a1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
步骤a2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
步骤a3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤a4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将第一有效系统表的页号记为更新索引;如果均未通过校验,则报错,结束;
步骤a4:获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引。
所述写入模块,具体用于将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中;
所述更新模块,还用于更新所述更新索引对应的有效系统表中的新旧标记。
所述判断模块,还用于判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时是否出现坏页;
所述获取模块,还用于当所述判断模块判断出所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表出现坏页时,获取与所述更新索引对应的有效系统表相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中;
所述更新模块,具体用于当所述判断模块判断出所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表未出现坏页时,更新所述更新索引对应的有效系统表中的新旧标记。
所述判断模块,还用于判断所述更新索引对应的有效系统表中的新旧标记;
所述更新模块,还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新旧标记为第一预设值时,将所述新旧标记更新为所述第三预设值;还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新旧标记为第二预设值时,将所述新旧标记更新为所述第一预设值;还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新旧标记为第三预设值时,将所述新旧标记更新为所述第二预设值。
所述计算模块,具体用于将所述待写数据的逻辑地址除以预设页长,将得到的商作为逻辑页号。
所述计算模块,具体用于将所述逻辑页号除以预设页长的二分之一,将得到的商作为所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
所述判断模块,具体用于根据所述地址映射页的逻辑页号,查找所述系统表中的地址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为0xffff。
步骤1:将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3;
步骤2:根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择模块;
步骤3:将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择模块;
所述写入模块,还用于将所述用户数据缓存区中的数据写入所述新用户数据页中。
所述判断模块,还用于判断判断所述用户数据缓存区中的数据写入所述新用户数据页时是否出现坏页;
所述写入模块,具体用于当所述判断模块判断出所述用户数据缓存区中的数据写入所述新用户数据页未出现坏页时,将所述用户数据缓存区中的数据写入所述新用户数据页中。
所述判断模块,具体用于执行以下操作:
步骤aa1:将执行写入读出次数置为初始值;
步骤aa2:将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤aa3;
步骤aa3:判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
所述更新模块,具体用于执行以下操作:
步骤b1:将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2;
步骤b2:将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执行步骤b3;
步骤b3:将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
所述判断模块,还用于判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页;
所述写入模块,具体用于当所述判断模块判断出所述地址映射缓存区中的数据写入所述新地址映射页未出现坏页时,将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
所述写入模块,具体用于执行以下操作:
步骤bb1:将执行写入读出的操作次数置为初始值;
步骤bb2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤bb3;
步骤bb3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
所述计算模块,还用于根据所述新用户数据页的页号和所述新地址映射页的物理页号,计算对应的擦除计数页;
所述选择模块,还用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
所述判断模块,还用于判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的第三物理页号;
所述写入模块,还用于当所述判断模块判断出从所述系统表中能够获取到与所述擦除计数页的页号对应的第三物理页号时,将所述第三物理页号对应的存储设备中的数据写入所述新擦除计数页中;
所述更新模块,还用于当所述判断模块判断出从所述系统表中不能够获取到与所述擦除计数页的页号对应的第三物理页号时,将所述新擦除计数页中的数据清空;还用于从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数;还用于根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表。
所述写入模块,具体用于执行以下操作:
步骤e1:将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2;
步骤e2:将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执行步骤e3;
步骤e3:将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
所述判断模块,还用于判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页;
所述写入模块,具体用于当所述判断模块判断出所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中未出现坏页时,将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
所述判断模块,具体用于执行以下操作:
步骤cc1:将执行写入读出的操作次数置为初始值;
步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤cc3;
步骤cc3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
所述更新模块中,所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体用于将所述新擦除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
所述更新模块中,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体用于根据所述更新后的擦除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表中。
所述判断模块,还用于判断所述新擦除计数页中的擦除次数是否大于第一预设值;还用于当所述计算模块计算得到平均擦除次数时,判断所述平均擦除次数是否大于第二预设值;
所述获取模块,还用于当所述判断模块判断出所述新擦除计数页中的擦除次数不大于第一预设值时或当所述设置模块将静态回收标记设置为需要进行静态回收时,获取所述系统表中的擦除总数;
所述计算模块,还用于当所述获取模块获取到所述系统表中的擦除总数时,根据所述擦除总数,计算得到平均擦除次数;
所述装置还包括:
设置模块,用于当所述判断模块判断出所述新擦除计数页中的擦除次数大于第一预设值时,将静态回收标记设置为需要进行静态回收;用于当所述判断模块判断出所述平均擦除次数大于第二预设值时,将静态回收标记置为需要进行静态回收。
所述静态回收模块,具体用于执行以下操作:
步骤g1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当前地址映射页;
步骤g2:判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤g16;
步骤g3:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特位对应的存储设备区域作为待回收地址映射页;
步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5;
步骤g5:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行步骤g6;
步骤g6:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g3,否则执行步骤g7;
步骤g7:将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页的页号,将第一个用户数据页作为当前用户数据页;
步骤g8:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前用户数据页的页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤g15;
步骤g9:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特位对应的存储设备区域作为待回收用户数据页;
步骤g10:判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤g11;
步骤g11:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤g14,否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步骤g12;
步骤g13:判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g9,否则执行步骤g14;
步骤g14:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号;
步骤g15:判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤g16,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8;
步骤g16:判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤g2。
所述选择模块,具体用于逐位查询所述系统表缓存区中所述系统表中的循环位图。
所述选择模块,具体用于从所述系统表缓存区中获取所述系统表中的动态控制指令,根据所述动态控制指令获取循环位图中相应的位置。
一种对存储设备进行数据读取的装置,包括:
调用模块:用于调用读取函数,向所述读取函数中传入读取地址和读取长度;
获取模块:用于当调用模块向所述读取函数中传入读取地址和读取长度后,从所述存储设备中获取系统表;
判断模块:用于当获取模块从所述存储设备中获取到系统表时,判断所述系统表是否为空;用于当计算模块计算出地址映射页的物理页号时,判断所述地址映射页的物理页号是否为第四预设值;用于当计算模块计算出用户数据页的页号时,判断所述用户数据页的页号是否为所述第四预设值;
计算模块:用于当所述判断模块判断出所述系统表不为空时,根据所述读取地址计算逻辑页号,用于计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
读取模块:用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设值时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号;用于当所述判断模块判断出所述用户数据页的页号为所述第四预设值时,根据所述读取长度,返回长度为所述读取长度的第五预设值;用于当所述判断模块判断出所述用户数据页的页号不为所述第三预设值时,根据所述读取地址和所述读取长度,从所述用户数据页中读取相应的数据,并将所述相应的数据返回。
所述获取模块,具体用于执行以下操作:
步骤h1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有效系统表;
步骤h2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第二有效系统表;
步骤h3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤h4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中;如果只有所述第二有效系统表通过校验,则将所述第二有效系统表写入所述系统表缓存区中;如果均未通过校验,则报错,结束;
步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中。
所述计算模块,具体用于将所述读取地址除以预设页长,将得到的商作为逻辑页号;具体用于将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取与所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
第一转换模块,用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设值时,将所述地址映射页的物理页号转换为所述地址映射页的物理地址;
所述判断模块,还用于当所述第一转换模块得到所述地址映射页的物理地址时,判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址;
所述读取模块:具体用于当所述判断模块判断出从所述地址映射缓存区中获取到所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在地址映射页的页内偏移,从所述地址映射缓存区读出用户数据页的页号;具体用于当所述判断模块判断出从所述地址映射缓存区中不能读取所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号。
第二转换模块,用于当所述判断模块判断出所述用户数据页的页号不为第四预设值时,将所述用户数据页的页号转换为所述用户数据页的物理地址;
所述判断模块,还用于当所述第二转换模块得到所述用户数据页的物理地址时,判断用户数据缓存区中是否存在所述用户数据页的物理地址;
所述读取模块:具体用于当所述判断模块判断出从所述用户数据缓存区中存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据缓存区中读取相应的数据,将读取到的数据返回;具体用于当所述判断模块判断出所述用户数据缓存区中不存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回。
本发明取得的有益效果是:采用本发明技术方案,通过系统表、地址映射页、用户数据页的两级映射关系进行数据的读写,通过管理循环位图,能够实现磨损平衡,通过采用缓存机制,减少对存储设备的擦写次数,延长了存储设备的使用寿命。
附图说明
为了更清楚的说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的一种对存储设备进行数据写入的方法流程图;
图2是本发明实施例二提供的一种对存储设备进行数据读取的方法流程图;
图3和图4是本发明实施例三提供的一种对存储设备进行数据写入的方法流程图;
图5是本发明实施例三中步骤302的具体细化图;
图6是本发明实施例四提供的一种对存储设备进行数据读取的方法流程图;
图7和图8是本发明实施例五提供的静态回收的具体操作流程图;
图9是本发明实施例六提供的一种对存储设备进行数据写入的装置图;
图10是本发明实施例七提供的一种对存储设备进行数据读取的装置图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。其中,存储设备由系统区和数据区组成,其中,数据区中包括多个数据页,其中,数据页包括用户数据页、地址映射页和擦除计数页,其中,用户数据页中存放的是用户有效数据,地址映射页中存放的是每个用户数据页的物理页号,擦除计数页中存放的是用户数据页和地址映射页的擦除次数;系统区中包括多个系统表和多个静态回收标记页。
优选的,本实施例中,以预设页长为256字节为例来说明,存储设备的前64页为64页的系统表,最后一页系统表之后的4页为静态回收标记页,最后一页静态回收标记页之后的区域为用户区;
其中,4页静态回收标记页中仅包含一页有效静态回收标记页,当有效静态回收标记页为坏页时,为防止数据丢失,将标识需要静态回收的预设值写入其余静态回收标记页中;
其中,64页系统表中仅包含两页有效系统表,当有效系统表为坏页时,为防止数据丢失,将系统表缓存区中的数据写入其余系统表中,每一页系统表中均包括地址映射索引、擦除计数索引、动态控制指针、用户区剩余未用空间大小、擦除总数、循环位图、新旧标记和校验码;
其中,地址映射索引具体占用系统表32字节,存储16个地址映射页的物理页号;擦除计数索引具体占用系统表16字节,存储8个擦除计数页的页号;动态控制指针占用系统表2字节,用于标识循环位图的当前位置;用户区剩余未用空间大小占用系统表2字节;擦除总数占用系统表4字节;循环位图占用系统表196字节,每个字节的每一位按顺序对应存储设备中的区域即存储设备的用户区中的每一个数据页是否未用,预先约定1表示未用,0表示已用;新旧标记占用系统表2字节,用于标识该系统表为新系统表或旧系统表;校验码占用系统表2字节;
本实施例中,预先设定,地址映射索引中第一、二字节代表第一个地址映射页的页号,第三、四字节代表第二个地址映射页的页号,以此类推;同样的,预先设定,擦除计数索引中第一、二个字节代表第一个擦除计数页的页号,第三、四个字节代表第二个擦除计数页的页号,以此类推;
例如,地址映射页的页号为0x0002,则为第三个地址映射页(第一个地址映射页的页号为0x0000、第二个地址映射页的页号为0x0001),则对应的获取地址映射索引的第五、六个字节;如果地址映射索引为00010203040506070809……则根据地址映射页的页号获取到的数据为0x0405;
例如,擦除计数页的页号为0x0001,则为第二个擦除计数页(第一个擦除计数页的页号为0x0000),则对应的获取擦除计数索引的第五、六个字节;如果擦除计数索引为00010203040506070809……则根据擦除计数页的页号获取到的数据为0x0203;
本实施例中,为了达到对存储设备的磨损平衡,相应地,与所述存储设备位于同一装置中的RAM里设置有擦除计数缓存区、地址映射缓存区、用户数据缓存区和系统表缓存区,长度各为1页;
其中,用户数据缓存区中存放的是用户数据页中的数据和用户数据页的物理地址,地址映射缓存区中存放的是地址映射页中的数据和地址映射页的物理地址,擦除计数缓存区中存放的是擦除计数页中的数据和擦除计数页的物理地址,系统表缓存区中存放的是系统表中的数据和系统表的物理地址;
实施例一
本发明实施例一提供了一种对存储设备进行数据读写的方法,如图1所示,包括:调用写入函数,向所述写入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址,所述写入函数接收到传入的待写数据、待写数据的长度和待写数据的逻辑地址后,执行以下操作:
步骤101:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号,根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
步骤102:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;
步骤103:根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号,如果是,则根据所述存储设备中所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页,执行步骤105,否则执行步骤104;
步骤104:将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据的长度,更新所述新用户数据页中的数据;
步骤105:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中所述第二比特位对应的数据页作为新地址映射页;
步骤106:判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号,如果是,则根据所述存储设备中所述第二物理页号对应的数据更新所述新地址映射页,执行步骤107,否则将所述新地址映射页中的数据清空,执行步骤107;
步骤107:将所述新用户数据页的物理页号写入所述新地址映射页中,并将所述新地址映射页的物理页号写入所述系统表缓存区的所述系统表中,获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位置为未用比特位;
步骤108:将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置,写入结束。
采用本发明技术方案,通过系统表、地址映射页、用户数据页的两级映射关系进行数据的读写,通过管理循环位图,能够实现磨损平衡,通过采用缓存机制,减少对存储设备的擦写次数,延长了存储设备的使用寿命。
实施例二
本发明实施例二提供了一种对存储设备进行数据读取的方法,如图2所示,本实施例中的存储设备采用实施例一提供的方法进行数据写入;所述方法包括:调用读取函数,向所述读取函数中传入读取地址(该地址为逻辑地址)和读取长度,所述读取函数接收到传入的读取地址和读取长度后,执行以下操作:
步骤201:从所述存储设备中获取系统表,判断所述系统表是否为空,如果是,则执行步骤207,否则执行步骤202;
步骤202:根据所述读取地址计算逻辑页号,计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
步骤203:判断所述地址映射页的物理页号是否为第四预设值,如果是,则执行步骤207,否则执行步骤204;
步骤204:根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的物理页号;
步骤205:判断所述用户数据页的物理页号是否为所述第四预设值,如果是,则执行步骤207,否则执行步骤206;
优选的,所述第四预设值为0xffff;
步骤206:根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回,读取结束;
步骤207:根据所述读取长度,返回相应长度的第五预设值,读取结束。
优选的,第五预设值为0xff,例如,读取长度为5字节,则返回的数据为0xff 0xff 0xff 0xff 0xff。
实施例三
本发明实施例三提供了一种对存储设备进行数据写入的方法,本实施例以预设页长为256字节为例来说明,如图3和图4所示,包括:调用写入函数,向所述写入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址,所述写入函数接收到传入的待写数据、待写数据的长度和待写数据的逻辑地址后执行以下操作:
步骤301:从存储设备中获取有效静态回收标记页中的静态回收标记,判断静态回收标记是否为预设值,如果是,则执行静态回收的操作,执行步骤302,否则直接执行步骤302;
具体地,获取全部静态回收标记页中的数据,获取每个静态回收标记页中的有效数据和校验值,对有效数据进行计算,得到的结果判断是否与校验值相同,是则确认该静态回收标记页为有效静态回收标记页,获取该静态回收标记页中的静态回收标记作为有效静态回收标记页中的静态回收标记;否则继续校验直至找到正确的有效静态回收标记页,如果均不相同,则报错;
本实施例中,静态回收标记为有效静态回收标记页的前四个字节,优选的,所述判断有效静态回收标记页中的静态回收标记是否为预设值,具体为:判断有效静态回收标记页中的前四个字节的值是否为0xAA55AA55,如果是,则标识需要进行静态回收,否则标识不需要进行静态回收;
其中,执行静态回收的操作在实施例五中具体描述,在此不再赘述;
步骤302:判断是否能够从系统表缓存区中获取到系统表,如果是,则执行步骤304,否则执行步骤303;
本实施例中,所述判断是否能够从系统表缓存区中获取到系统表,具体为:判断系统表缓存区是否为空,如果是,则不能获取到系统表,否则获取到系统表;
其中,存储设备的系统区中只有两页系统表中存放有效数据,其余系统表为空或已为坏页,优选采用从两边向中间的方法进行系统表的存储,例如,存储设备的系统区中一共有16页系统表,其中,存放有效数据的为第一页系统表和第十六页系统表,如果在对第一页系统表擦写时出现坏页,则将有效数据写入第二页系统表中,如果在对第十六页系统表擦写时出现坏页,则将有效数据写入第十五页系统表中,依次类推;
步骤303:从存储设备中获取系统表,将存储设备中系统表中的数据写入系统表缓存区中,执行步骤304;
参见图5,本实施例中,从存储设备中获取系统表,将存储设备中的系统表写入系统表缓存区中,具体操作为:
步骤a1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
优选的,第四预设值为0xff;预先设置系统区中最中间的一页为全ff页且不可修改,例如,本实施例中,系统区中共16页系统表,则将第8页系统表设置为全ff不可修改状态;
步骤a2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
步骤a3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验;
如果均通过校验,则执行步骤a4;
如果只有第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引,执行步骤304;
如果只有第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将第一有效系统表的页号记为更新索引,执行步骤304;
如果均未通过校验,则报错,结束;
其中,所述判断第一有效系统表和第二有效系统表中的数据是否能够通过校验,具体为:
获取所述第一有效系统表中的第一有效数据和第一校验码,根据所述第一有效数据进行校验计算,判断校验结果与所述第一校验码是否相同,如果是,则第一有效系统表通过校验,否则第一有效系统表未通过校验;
同时,获取所述第二有效系统表中的第二有效数据和第二校验码,根据所述第二有效数据进行校验计算,判断校验结果与所述第二校验码是否相同,如果是,则第二有效系统表通过校验,否则第二有效系统表未通过校验;
步骤a4:获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记;
如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引,执行步骤304;
如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引,执行步骤304;
如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引,执行步骤304。
优选的,第一预设值为0x5555,第二预设值为0x55AA,第三预设值为0xAA55;
进一步的,如果存储设备从未进行过数据擦写操作,则获取到的有效系统表中的数据全为ff,则将系统表缓存区中的数据直接置为全ff;
步骤304:根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号;
例如,本实施例中,所述待写数据为0x33,待写数据的逻辑地址为0x9D04;根据待写数据的逻辑地址计算逻辑页号,具体为:将待写数据的逻辑地址除以预设页长,得到的商为逻辑页号,本实施例得到的逻辑页号为0x9D;
步骤305:根据所述逻辑页号,获知与所述逻辑页号对应的地址映射页的物理页号和在地址映射页的页内偏移;
本实施例中,每张地址映射页可以存储用户区中连续的128个用户物理地址,因此,根据所述逻辑页号,获知所述逻辑页号在地址映射页中的页号和在地址映射页的页内偏移,具体为:将所述逻辑页号除以128,得到的商为与所述逻辑页号对应的地址映射页的物理页号,余数为逻辑页号在地址映射页中的页内偏移;
例如,本实施例中,逻辑页号为0x9D,除以128,得到的商为1,余数为29,即地址映射页的物理页号为1,在地址映射页的页内偏移为29;
步骤306:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述第一比特位对应的存储设备的区域作为新用户数据页;
例如,本实施例中,系统表缓存区中的数据为:
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
……
其中,从第57字节往后的196字节均为循环位图,循环位图的每一位按顺序对应存储设备中用户区的每一页,获取循环位图的第一个字节ff,即11111111,将最高位的1作为第一比特位,将第一比特位置为0,即01111111,则循环位图的第一个字节转为7f;第一比特位对应的新用户数据页的物理页号为0x0000;
本实施例中,通过管理循环位图,能够实现在出现坏页时存储设备仍能正常工作,并能够实现防掉电;
步骤307:根据地址映射页的逻辑页号和在地址映射页的页内偏移,判断是否能够从地址映射页中获取到第一物理页号,如果是,则执行步骤308,否则将用户数据缓存区中的数据清空,执行步骤313;
其中,所述根据地址映射页的逻辑页号和在地址映射页的页内偏移,判断是否能够从地址映射页中获取到第一物理页号,具体为:根据地址映射页的逻辑页号,查找系统表的地址映射索引,将逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数据,作为地址映射页的物理页号,然后根据地址映射页的物理页号和在地址映射页的页内偏移,从地址映射页中获取数据,判断获取到的数据是否为0xffff,如果是,则未找到第一物理页号,否则找到第一物理页号;
例如,所述地址映射页为:
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
……
步骤308:将第一物理页号转化为第一物理地址,并判断所述第一物理地址是否在用户数据缓存区中,如果是,则执行步骤313,否则执行步骤309;
步骤309:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤312,否则执行步骤310;
其中,判断用户数据缓存区中是否存在空闲缓存页,具体为:判断用户数据缓存区中的空闲标识是否置位,如果是,则存在空闲缓存页,否则不存在空闲缓存页,其中用户数据缓存区中可以包含一个或多个用户数据缓存页,本实施例以一页为例来说明;
步骤310:将用户数据缓存区中的数据写入存储设备的相应位置,将用户数据缓存区置为空闲;
具体为:获取用户数据缓存区中保存的物理地址,根据该物理地址将用户数据缓存区中的数据写入存储设备中与该物理地址对应的数据页中;
其中,将用户数据缓存区置为空闲,具体为:将用户数据缓存区中的空闲标识置位;
步骤311:判断用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤306,否则执行步骤312;
其中,判断是否出现坏页,具体为:
步骤aa1:将执行写入读出次数置为初始值;
步骤aa2:将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤aa3;
步骤aa3:判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2;
步骤312:将第一物理页号对应的存储设备中的数据写入用户数据缓存区中;
步骤313:根据待写数据及待写数据的长度,更新用户数据缓存区中的数据;
步骤314:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述第二比特位对应的存储设备的区域作为新地址映射页;
步骤315:判断是否能够从所述系统表缓存区中获取到与所述地址映射页的物理页号对应的第二物理页号,如果是,则执行步骤316,否则将所述地址映射缓存区中的数据清空,执行步骤321;
其中,判断是否能够从所述系统表缓存区中获取到与所述地址映射页的物理页号对应的第二物理页号,具体为:判断从系统表缓存区中获取到与地址映射页的物理页号对应的数据是否为第四预设值0xffff,如果是,则不能获取对应的第二物理地址,否则能够获取对应的第二物理地址;
其中,将所述地址映射缓存区中的数据清空,具体为:将所述地址映射缓存区中的数据置为全0xff;
步骤316:将所述第二物理页号转换为第二物理地址,并判断所述第二物理地址是否在地址映射缓存区中,如果是,则执行步骤321,否则执行步骤317;
步骤317:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤320,否则执行步骤318;
其中,判断地址映射表缓存区中是否存在空闲缓存页,具体为:判断地址映射表缓存区中的空闲标识是否置位,如果是,则存在空闲缓存页,否则不存在空闲缓存页;
步骤318:将地址映射缓存区中的数据写入存储设备的相应位置,将地址映射缓存区置为空闲;
具体为:获取地址映射缓存区中保存的物理地址,根据该物理地址将地址映射缓存区中的数据写入存储设备中与该物理地址对应的数据页中;
其中,所述将地址映射缓存区置为空闲,具体为:将地址映射缓存区中的空闲标识置位;
步骤319:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤314,否则执行步骤320;
其中,判断是否出现坏页,具体为:
步骤bb1:将执行写入读出的操作次数置为初始值;
步骤bb2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤bb3;
步骤bb3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤bb2;
其中,优选的,预设次数为3次;
步骤320:将新地址映射页中的数据写入地址映射缓存区中;
例如,将地址映射页的物理页号为0x0001对应的页中的数据写入地址映射表缓存区中;
步骤321:将所述新用户数据页的物理页号写入地址映射缓存区中,并将新地址映射页的物理页号写入系统表缓存区中;
例如,本实施例中,将用户数据页的物理页号0x0000写入地址映射缓存区中,将地址映射页的物理页号0x0001写入系统表缓存区中;
其中,写入后的地址映射缓存区为:
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff
……
写入后的系统表缓存区为:
ff ff 00 01 ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 02 05 e7 00 00 00 00 3f ff ff ff ff ff ff ff
……
其中,因循环位图中的第0位和第1位置为0,第2位为1,故将动态指针置为00 02,05 e7为用户数据区的未用空间,因未对存储设备进行擦除操作,故将擦除总数置为00 00 00 00,3f……为循环位图;
步骤322:根据所述新用户数据页的物理页号和新地址映射页的物理页号,计算对应的擦除计数页;
本实施例中,所述根据所述新用户数据页号和地址映射表页号,计算对应的擦除计数页,具体为:
步骤d1:将所述新用户数据页的物理页号除以预设页长,得到第一商值;
步骤d2:将所述新地址映射页的物理页号除以预设页长,得到第二商值;
步骤d3:判断所述第一商值与所述第二商值是否相同,如果是,则获取与所述第一商值对应的页作为擦除计数页,否则分别获取与所述第一商值对应的擦除计数页和与所述第二商值对应的擦除计数页,将获取到的页作为擦除计数页;
本实施例中,当计算得到的第一商值与第二商值不相同时,则分别获取与第一商值和第二商值对应的两页,对这两页的具体操作相同,因此将第一商值对应的页和第二商值对应的页均作为擦除计数页;以下各步骤对擦除计数页的操作,如果是在第一商值和第二商值不相同的情况下,则所指擦除计数页均为对两页进行操作;
步骤323:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述第三比特位对应的存储设备的区域作为新擦除计数页;
本实施例中,获取循环位图的第一个字节3f,即00111111,将第三位1作为第三比特位,将第三比特位置为0,即00011111,则循环位图的第一个字节转为1f,第三比特位对应的存储设备为页号是0x0002的页,将页号为0x0002的页作为新擦除计数页;
步骤324:判断从所述系统表缓存区中的系统表中是否能够获取到与所述擦除计数页的页号对应的第三物理页号,如果是,则执行步骤325,否则将所述擦除计数缓存区中的数据清空,执行步骤330;
其中,判断是否能够从系统表缓存区中读出擦除计数页对应的第三物理页号,具体为:判断从系统表缓存区中的擦除计数索引中获取到与擦除计数页的页号对应的数据是否0xffff,如果是,则未找到第三物理页号,否则将该数据作为第三物理页号;
步骤325:将第三物理页号转化为第三物理地址,判断第三物理地址是否在擦除计数缓存区中,如果是,则执行步骤330,否则执行步骤326;
其中,所述将第三物理页号转化为第三物理地址,具体为:将第三物理页号乘以预设页长的结果作为第三物理地址;
步骤326:判断擦除计数缓存区中是否存在空闲缓存页,如果是,则执行步骤329,否则执行步骤327;
其中,判断擦除计数缓存区中是否存在空闲缓存页,具体为:判断擦除计数缓存区中的空闲标识是否置位,如果是,则存在空闲缓存页,否则不存在空闲缓存页;
步骤327:将擦除计数缓存区中的数据写入存储设备的相应位置,将擦除计数缓存区置为空闲;
具体为:获取擦除计数缓存区中保存的物理地址,根据该物理地址将擦除计数缓存区中的数据写入存储设备中与该物理地址对应的数据页中;
其中,所述将擦除计数缓存区置为空闲,具体为:将擦除计数缓存区中的空闲标识置位;
步骤328:判断擦除计数缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤323,否则执行步骤329;
其中,判断是否出现坏页,具体为:
步骤cc1:将执行写入读出的操作次数置为初始值;
步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤cc3;
步骤cc3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤cc2;
步骤329:将新擦除计数页中的数据写入擦除计数缓存区中;
例如,将页号为0x0002的新擦除计数页中的数据读入擦除计数缓存区中;
步骤330:从所述擦除计数缓存区中查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表;
本实施例中,所述更新对应的擦除次数,具体为:将擦除计数缓存区中,与新用户数据页和新地址映射页对应的擦除次数均加0x01;
例如,本实施例中,更新后的擦除计数缓存区中的数据为:
01 01 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
……
进一步的,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体为:根据所述更新后的擦除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表的擦除计数索引中:
更新后的系统表缓存区为:
ff ff 00 01 ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 03 05 e7 00 00 00 02 1f ff ff ff ff ff ff ff
……
步骤331:判断擦除计数页中是否存在大于第六预设值的擦除次数,如果是,则执行步骤333,否则执行步骤332;
优选的,第六预设值为250;
步骤332:根据擦除计数页中的擦除次数和系统表缓存区中的擦除总数,计算平均擦除次数,判断平均擦除次数是否大于第七预设值,如果是,则执行步骤333,否则执行步骤334;
优选的,第七预设值为200;
其中,所述根据擦除计数页中的擦除次数和系统表缓存区中的擦除总数,计算平均擦除次数,具体为:获取擦除计数页中的所有擦除次数,将所有擦除次数相加,得到总擦除次数,从系统表缓存区中获取擦除总数,将总擦除次数除以擦除总数,得到平均擦除次数;
步骤333:将有效静态回收标记页中的静态回收标记置为预设值;
具体的,将静态回收标记页中的静态回收标记即前四个字节设置为0xaa55aa55,标识需要进行静态回收;
步骤334:根据第一物理地址、第二物理地址和第三物理地址,将用户数据缓存区、地址映射缓存区、擦除计数缓存区和系统表缓存区中的数据写入存储设备的相应位置;
本实施例中,优选的,按照用户数据缓存区、地址映射缓存区、擦除计数缓存区和系统表缓存区的顺序将其中的数据写入存储设备中;
本步骤中,先将用户数据缓存区中的数据写入存储设备的用户区中第一物理地址为0x0000的位置,然后将地址映射缓存区中的数据写入存储设备的用户区中第二物理地址为0x0001的位置,再将擦除计数缓存区中的数据写入存储设备的用户区中第三物理地址为0x0002的位置,最后将系统表缓存区写入存储设备的系统区中。
其中,将系统表缓存区中的数据写入存储设备的相应位置,具体为:将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中,更新所述更新索引对应的有效系统表中的新旧标记;
所述将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中,还包括:
判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时是否出现坏页,如果是,则获取与所述更新索引对应的有效系统表相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中;
例如,本实施例中,系统区包括16页系统表,如果当前有效系统表为第1页和第16页,则如果更新索引对应的有效系统表为第1页,写入时发现为坏页时,将相邻的第2页作为新的系统表,将数据写入第2页系统表中;如果更新索引对应的有效系统表为第16页,写入时发现为坏页时,将相邻的第15页作为新的系统表,将数据写入第15页系统表中,依次类推;
更新所述更新索引对应的有效系统表中的新旧标记,具体为:判断所述更新索引对应的有效系统表中的新旧标记,如果是所述第一预设值,则将该新旧标记更新为所述第三预设值,如果是所述第二预设值,则将该新旧标记更新为所述第一预设值,如果是所述第三预设值,则将该新旧标记更新为所述第二预设值。
采用本发明技术方案,通过系统表、地址映射页、用户数据页的两级映射关系进行数据的读写,通过管理循环位图,能够实现磨损平衡,通过采用缓存机制,减少对存储设备的擦写次数,延长了存储设备的使用寿命。
实施例四
本发明实施例四提供了一种对存储设备进行数据读取的方法,如图6所示,本实施例四中的存储设备采用实施例三提供的方法进行数据写入;所述方法包括:调用读取函数,向所述读取函数中传入读取地址(该地址为逻辑地址)和读取长度,所述读取函数接收到传入的读取地址和读取长度后执行以下操作:
步骤401:从存储设备中获取系统表,将系统表读入系统表缓存区中;
本实施例中,所述从存储设备中获取系统表,具体为:
步骤h1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
步骤h2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
步骤h3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤h4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,执行步骤402;如果只有所述第二有效系统表通过校验,则将所述第二有效系统表写入所述系统表缓存区中,执行步骤402;如果均未通过校验,则报错,结束;
步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中,执行步骤402;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,执行步骤402;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,执行步骤402;
优选的,第一预设值为0x5555,第二预设值为0x55AA,第三预设值为0xAA55;
本实施例中,获取到的系统表为:
ff ff 00 01 ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
00 03 05 e7 00 00 00 02 1f ff ff ff ff ff ff ff
……
步骤402:判断系统表是否为空,如果是,则执行步骤413,否则执行步骤403;
本实施例中,如果系统表为空,则说明存储设备未进行数据读写,即存储设备中的数据全为0xff;
步骤403:根据读取地址计算逻辑页号,计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在地址映射页的页内偏移;
其中,所述根据读取地址计算逻辑页号,具体为:将所述读取地址除以预设页长,将得到的商作为逻辑页号;
本实施例中,每张地址映射页可以存储用户区中连续的128个物理页号,因此,根据读取地址计算逻辑页号,计算与所述逻辑页号对应的地址映射页的物理页号和在地址映射页的页内偏移,具体为:将所述逻辑页号除以128,根据得到的商从系统表中读取逻辑页号对应的地址映射页的物理页号,得到的余数为所述逻辑页号在所述地址映射页的页内偏移其中,页内偏移是以2字节页号为单位的偏移;
例如,本实施例中,读取地址为0x9D04,除以256,得到的商为1,即逻辑页号为0x9D,将逻辑页号0x9D除以预设页长的二分之一128,得到的商为1,说明为第二张地址映射页(优选0标识第一张地址映射页),即从系统表中的第三四字节获取与第二张地址映射页对应的数据即为逻辑页号对应的地址映射页的物理页号0x0001,得到的余数为在地址映射页中的页内偏移29;
步骤404:判断地址映射页的物理页号是否为第四预设值,如果是,则执行步骤413,否则执行步骤405;
优选的,第四预设值为0xffff;
步骤405:根据所述地址映射页的物理页号计算所述地址映射页的物理地址;
其中,所述根据所述地址映射页的物理页号计算所述地址映射页的物理地址,具体为:将所述地址映射页的物理页号乘以预设页长的结果作为地址映射页的物理地址;
步骤406:判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址,如果是,则执行步骤408,否则执行步骤407;
步骤407:根据所述地址映射页的物理页号和在地址映射页的页内偏移,从地址映射页中读出用户数据页的物理页号,执行步骤409;
步骤408:根据所述地址映射页的物理页号和在地址映射页的页内偏移,从地址映射缓存区读出用户数据页的物理页号,执行步骤409;
例如,本实施例中,根据逻辑页号对应的地址映射页的物理页号0x0001得到的物理地址,获取到的地址映射页中的数据为:
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff 00 00 ff ff ff ff
……
根据在地址映射页中的页内偏移29,则从地址映射页偏移58字节的位置开始获取两个字节的数据,即为用户数据页的物理页号,即0x0000;
步骤409:判断用户数据页的物理页号是否为第四预设值,如果是,则执行步骤413,否则执行步骤410;
步骤410:根据用户数据页的物理页号计算用户数据页的物理地址,判断用户数据页的物理地址是否在用户数据缓存区中,如果是,则执行步骤411,否则执行步骤412;
例如,本实施例中,将用户数据页的物理页号0x0000乘以预设页长256,得到的用户数据页的物理地址为0x0000;
步骤411:根据所述读取地址和所述读取长度读取用户数据缓存区中的数据,将读取到的数据返回,读取结束;
例如,本实施例中,用户数据页为:
ff ff ff ff 33 ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
……
则根据读取地址可知需读取的数据的偏移为0x04,读取长度为0x01,读取到的数据为0x33;
步骤412:根据读取地址和读取长度读取存储设备中用户数据页中的数据,将读取到的数据返回,读取结束;
步骤413:根据所述读取长度,返回相应长度的0xff,读取结束;
例如,读取长度为5字节,则返回的数据为0x ff ff ff ff ff。
实施例五
本发明实施例五提供了静态回收的具体操作,如图7和图8所示,具体包括:
步骤501:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中;
本实施例中,步骤501与实施例4中的步骤401相同,在此不再赘述;
步骤502:获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当前地址映射页;
步骤503:判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则执行步骤504,否则执行步骤521;
优选的,所述第六预设值为250;
本实施例中,如果当前地址映射页的擦除次数达到第六预设值时,说明对该地址映射页进行擦写的次数太频繁,需要进行静态回收,实现磨损平衡;
步骤504:根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址;
其中,根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,具体为:将当前地址映射页的物理页号乘以预设页长,得到的值即为当前地址映射页的第四物理地址;
步骤505:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特位对应的存储设备区域作为待回收地址映射页;
步骤506:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将第四比特位置为未用比特位,执行步骤505,否则执行步骤507;
本实施例中,当待回收地址映射页的擦除次数小于第六预设值250时,则该待回收地址映射页不需要进行静态回收,则将第四比特位置为未用比特位;
步骤507:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤510,否则执行步骤508;
步骤508:将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲;
其中,将地址映射缓存区中的数据写入存储设备的相应位置,具体为:获取地址映射缓存区中保存的页号,将地址映射缓存区中的数据写入存储设备中该页号对应的位置;
步骤509:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤505,否则执行步骤510;
其中,判断是否出现坏页,具体为:
步骤dd1:将执行写入读出次数置为初始值;
步骤dd2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤dd3;
步骤dd3:判断执行写入读出的次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤dd2;
步骤510:将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号;
本实施例中,所述根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号,具体为:从系统表缓存区中系统表的地址映射索引中查找与当前地址映射页对应的页号,将该页号改为新地址映射页的页号;
步骤511:获取当前地址映射页中所有用户数据页的物理页号,将第一个用户数据页作为当前用户数据页;
步骤512:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则执行步骤513,否则执行步骤520;
本实施例中,如果当前用户数据页的擦除次数达到第六预设值时,说明对该用户数据页进行擦写的次数太频繁,需要进行静态回收,实现磨损平衡;
步骤513:根据当前用户数据页的物理页号计算当前用户数据页的第五物理地址;
其中,根据当前用户数据页的物理页号计算当前用户数据页的第五物理地址,具体为:将当前用户数据页的物理页号乘以预设页长,得到的值即为当前用户数据页的第五物理地址;
步骤514:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特位对应的存储设备区域作为待回收用户数据页;
步骤515:判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将第五比特位置为未用比特位,执行步骤514,否则执行步骤516;
本实施例中,当待回收用户数据页的擦除次数小于第六预设值250时,则该待回收用户数据页不需要进行静态回收,则将第五比特位置为未用比特位;
步骤516:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤519,否则执行步骤517;
步骤517:将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲;
其中,将用户数据缓存区中的数据写入存储设备的相应位置,具体为:获取用户数据缓存区中保存的页号,将用户数据缓存区中的数据写入存储设备中该页号对应的位置;
步骤518:判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤514,否则执行步骤519;
其中,判断是否出现坏页,具体为:
步骤ee1:将执行写入读出次数置为初始值;
步骤ee2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤ee3;
步骤ee3:判断执行写入读出的次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入的存储设备的相应位置为坏页,否则返回步骤ee2;
步骤519:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号;
本实施例中,所述根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号,具体为:从当前地址映射页中查找与当前用户数据页对应的页号,将该页号改为新用户数据页的物理页号;
步骤520:判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤521,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤512;
步骤521:判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静态回收标识置为除预设值外的任意值,将系统表缓存区中的系统表写入存储设备中,回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤503;
其中,将静态回收标识置为除预设值外的任意值,具体为将静态回收标记置为除0xaa55aa55外的任意值,优选的,将静态回收标识置位0xffffffff;
本实施例提供的静态回收机制,对于某些页的擦写次数太高或者平均擦除次数太高的情况,进行静态回收能够实现将擦写次数少的页与擦写次数多的页进行相互搬移,实现磨损平衡,进一步延长存储设备的使用寿命。
实施例六
本发明实施例六提供了一种对存储设备进行数据写入的装置,如图9所示,包括:调用模块101、获取模块102、计算模块103、选择模块104、判断模块105、更新模块106、写入模块107;各模块之间的具体功能如下:
调用模块101:用于调用写入函数,向所述写入函数传入待写数据、待写数据的长度和待写数据的逻辑地址;
获取模块102:用于当所述调用模块101向所述写入函数传入待写数据、待写数据的长度和待写数据的逻辑地址后,从所述存储设备中获取系统表;
计算模块103:用于根据待写数据的逻辑地址,计算所述待写数据的逻辑页号;用于根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
选择模块104:用于当所述计算模块103计算得到与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移时,从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中所述第二比特位对应数据页作为新地址映射页;
判断模块105:用于当所述计算模块103计算得到所述地址映射页的逻辑页号和在所述地址映射页的页内偏移时,根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号;用于判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号;
更新模块106:用于当所述判断模块105判断出能够从所述地址映射页中获取到第一物理页号时,根据所述存储设备中所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页;用于当所述判断模块105判断出不能够从所述地址映射页中获取到第一物理页号时,将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据的长度,更新所述新用户数据页中的数据;用于当所述判断模块105判断出能够获取到与所述地址映射页的物理页号对应的第二物理页号时,根据所述存储设备中所述第二物理页号对应的数据更新所述新地址映射页;
写入模块107:用于当所述获取模块102获取到系统表时,将所述系统表写入系统表缓存区中;用于当所述判断模块105判断出不能够获取到与所述地址映射页的物理页号对应的第二物理页号时,将所述新地址映射页中的数据清空;用于将所述新用户数据页的页号写入所述新地址映射页中;用于将所述新地址映射页的物理页号写入所述系统表缓存区的所述系统表中;用于获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位置为未用比特位,将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置。
其中,所述获取模块102,还用于从所述存储设备中获取有效静态回收标记页;
所述判断模块105,还用于当所述获取模块102获取到所述有效静态回收标记页时,根据所述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收;
所述装置还包括,静态回收模块,用于执行静态回收操作。
其中,所述获取模块102,具体用于执行以下操作:
步骤a1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
步骤a2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
步骤a3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤a4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将第一有效系统表的页号记为更新索引;如果均未通过校验,则报错,结束;
步骤a4:获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引。
进一步的,所述写入模块107,具体用于将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中;
所述更新模块106,还用于更新所述更新索引对应的有效系统表中的新旧标记。
更进一步的,所述判断模块105,还用于判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时是否出现坏页;
所述获取模块102,还用于当所述判断模块105判断出所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表出现坏页时,获取与所述更新索引对应的有效系统表相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中;
所述更新模块106,具体用于当所述判断模块105判断出所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表未出现坏页时,更新所述更新索引对应的有效系统表中的新旧标记。
其中,所述判断模块105,还用于判断所述更新索引对应的有效系统表中的新旧标记;
所述更新模块106,还用于当所述判断模块105判断出所述更新索引对应的有效系统表中的新旧标记为第一预设值时,将所述新旧标记更新为所述第三预设值;还用于当所述判断模块105判断出所述更新索引对应的有效系统表中的新旧标记为第二预设值时,将所述新旧标记更新为所述第一预设值;还用于当所述判断模块105判断出所述更新索引对应的有效系统表中的新旧标记为第三预设值时,将所述新旧标记更新为所述第二预设值。
其中,所述计算模块103,具体用于将所述待写数据的逻辑地址除以预设页长,将得到的商作为逻辑页号。
其中,所述计算模块103,具体用于将所述逻辑页号除以预设页长的二分之一,将得到的商作为所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
其中,所述判断模块105,具体用于根据所述地址映射页的逻辑页号,查找所述系统表中的地址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为0xffff。
其中,所述更新模块106,具体用于执行以下操作:
步骤1:将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3;
步骤2:根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择模块104;
步骤3:将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择模块104;
所述写入模块107,还用于将所述用户数据缓存区中的数据写入所述新用户数据页中。
其中,所述判断模块105,还用于判断判断所述用户数据缓存区中的数据写入所述新用户数据页时是否出现坏页;
所述写入模块107,具体用于当所述判断模块105判断出所述用户数据缓存区中的数据写入所述新用户数据页未出现坏页时,将所述用户数据缓存区中的数据写入所述新用户数据页中。
进一步的,所述判断模块105,具体用于执行以下操作:
步骤aa1:将执行写入读出次数置为初始值;
步骤aa2:将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤aa3;
步骤aa3:判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
其中,所述更新模块106,具体用于执行以下操作:
步骤b1:将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2;
步骤b2:将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执行步骤b3;
步骤b3:将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
进一步的,所述判断模块105,还用于判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页;
所述写入模块107,具体用于当所述判断模块105判断出所述地址映射缓存区中的数据写入所述新地址映射页未出现坏页时,将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
更进一步的,所述写入模块107,具体用于执行以下操作:
步骤bb1:将执行写入读出的操作次数置为初始值;
步骤bb2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤bb3;
步骤bb3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
其中,所述计算模块103,还用于根据所述新用户数据页的页号和所述新地址映射页的物理页号,计算对应的擦除计数页;
所述选择模块104,还用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
所述判断模块105,还用于判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的第三物理页号;
所述写入模块107,还用于当所述判断模块105判断出从所述系统表中能够获取到与所述擦除计数页的页号对应的第三物理页号时,将所述第三物理页号对应的存储设备中的数据写入所述新擦除计数页中;
所述更新模块106,还用于当所述判断模块105判断出从所述系统表中不能够获取到与所述擦除计数页的页号对应的第三物理页号时,将所述新擦除计数页中的数据清空;还用于从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数;还用于根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表。
其中,所述写入模块107,具体用于执行以下操作:
步骤e1:将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2;
步骤e2:将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执行步骤e3;
步骤e3:将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
进一步的,所述判断模块105,还用于判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页;
所述写入模块107,具体用于当所述判断模块105判断出所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中未出现坏页时,将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
其中,所述判断模块105,具体用于执行以下操作:
步骤cc1:将执行写入读出的操作次数置为初始值;
步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤cc3;
步骤cc3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
其中,所述更新模块106中,所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体用于将所述新擦除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
所述更新模块106中,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体用于根据所述更新后的擦除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表中。
所述判断模块105,还用于判断所述新擦除计数页中的擦除次数是否大于第一预设值;还用于当所述计算模块103计算得到平均擦除次数时,判断所述平均擦除次数是否大于第二预设值;
所述获取模块102,还用于当所述判断模块105判断出所述新擦除计数页中的擦除次数不大于第一预设值时或当所述设置模块将静态回收标记设置为需要进行静态回收时,获取所述系统表中的擦除总数;
所述计算模块103,还用于当所述获取模块102获取到所述系统表中的擦除总数时,根据所述擦除总数,计算得到平均擦除次数;
所述装置还包括设置模块,用于当所述判断模块105判断出所述新擦除计数页中的擦除次数大于第一预设值时,将静态回收标记设置为需要进行静态回收;用于当所述判断模块105判断出所述平均擦除次数大于第二预设值时,将静态回收标记置为需要进行静态回收。
所述静态回收模块,具体用于执行以下操作:
步骤g1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当前地址映射页;
步骤g2:判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤g16;
步骤g3:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特位对应的存储设备区域作为待回收地址映射页;
步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5;
步骤g5:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行步骤g6;
步骤g6:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g3,否则执行步骤g7;
步骤g7:将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页的页号,将第一个用户数据页作为当前用户数据页;
步骤g8:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前用户数据页的页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤g15;
步骤g9:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特位对应的存储设备区域作为待回收用户数据页;
步骤g10:判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤g11;
步骤g11:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤g14,否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步骤g12;
步骤g13:判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g9,否则执行步骤g14;
步骤g14:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号;
步骤g15:判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤g16,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8;
步骤g16:判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤g2。
所述选择模块104,具体用于逐位查询所述系统表缓存区中所述系统表中的循环位图。
所述选择模块104,具体用于从所述系统表缓存区中获取所述系统表中的动态控制指令,根据所述动态控制指令获取循环位图中相应的位置。
实施例七
本发明实施例七提供了一种对存储设备进行数据读取的装置,如图10所示,包括:调用模块201、获取模块202、判断模块203、计算模块204、读取模块205;各模块间的具体功能为:
调用模块201:用于调用读取函数,向所述读取函数中传入读取地址和读取长度;
获取模块202:用于当调用模块201向所述读取函数中传入读取地址和读取长度后,从所述存储设备中获取系统表;
判断模块203:用于当获取模块202从所述存储设备中获取到系统表时,判断所述系统表是否为空;用于当计算模块204计算出地址映射页的物理页号时,判断所述地址映射页的物理页号是否为第四预设值;用于当计算模块204计算出用户数据页的页号时,判断所述用户数据页的页号是否为所述第四预设值;
计算模块204:用于当所述判断模块203判断出所述系统表不为空时,根据所述读取地址计算逻辑页号,用于计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
读取模块205:用于当所述判断模块203判断出所述地址映射页的物理页号不为第四预设值时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号;用于当所述判断模块203判断出所述用户数据页的页号为所述第四预设值时,根据所述读取长度,返回相应长度的第五预设值;用于当所述判断模块203判断出所述用户数据页的页号不为所述第三预设值时,根据所述读取地址和所述读取长度,从所述用户数据页中读取相应的数据,并将所述相应的数据返回。
其中,所述获取模块202,具体用于执行以下操作:
步骤h1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有效系统表;
步骤h2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第二有效系统表;
步骤h3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤h4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中;如果只有所述第二有效系统表通过校验,则将所述第二有效系统表写入所述系统表缓存区中;如果均未通过校验,则报错,结束;
步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中。
其中,所述计算模块204,具体用于将所述读取地址除以预设页长,将得到的商作为逻辑页号;具体用于将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取与所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
其中,所述装置,还包括:第一转换模块,用于当所述判断模块203判断出所述地址映射页的物理页号不为第四预设值时,将所述地址映射页的物理页号转换为所述地址映射页的物理地址;
所述判断模块203,还用于当所述第一转换模块得到所述地址映射页的物理地址时,判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址;
所述读取模块205:具体用于当所述判断模块203判断出从所述地址映射缓存区中获取到所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在地址映射页的页内偏移,从所述地址映射缓存区读出用户数据页的页号;具体用于当所述判断模块203判断出从所述地址映射缓存区中不能读取所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号。
其中,所述装置,还包括:第二转换模块,用于当所述判断模块203判断出所述用户数据页的页号不为第四预设值时,将所述用户数据页的页号转换为所述用户数据页的物理地址;
所述判断模块203,还用于当所述第二转换模块得到所述用户数据页的物理地址时,判断用户数据缓存区中是否存在所述用户数据页的物理地址;
所述读取模块205:具体用于当所述判断模块203判断出从所述用户数据缓存区中存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据缓存区中读取相应的数据,将读取到的数据返回;具体用于当所述判断模块203判断出所述用户数据缓存区中不存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
Claims (60)
1.一种对存储设备进行数据写入的方法,其特征在于,包括:调用写入函数,向所述写入函数中传入待写数据、待写数据的长度和待写数据的逻辑地址,所述写入函数执行以下操作:
步骤S1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,根据所述待写数据的逻辑地址,计算所述待写数据的逻辑页号,根据所述逻辑页号,计算与所述逻辑页号对应的地址映射页的逻辑页号和在所述地址映射页的页内偏移;
步骤S2:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第一比特位,将所述第一比特位置为已用比特位,将所述存储设备中与所述第一比特位对应的数据页作为新用户数据页;
步骤S3:根据所述地址映射页的逻辑页号和在所述地址映射页的页内偏移,判断是否能够从所述地址映射页中获取到第一物理页号,如果是,则根据所述存储设备中与所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页,执行步骤S5,否则执行步骤S4;
步骤S4:将所述新用户数据页中的数据清空,根据所述待写数据及所述待写数据的长度,更新所述新用户数据页中的数据;
步骤S5:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第二比特位,将所述第二比特位置为已用比特位,将所述存储设备中与所述第二比特位对应的数据页作为新地址映射页;
步骤S6:判断是否能够从所述系统表缓存区的所述系统表中获取到与所述地址映射页的物理页号对应的第二物理页号,如果是,则根据所述存储设备中与所述第二物理页号对应的数据更新所述新地址映射页,执行步骤S7,否则将所述新地址映射页中的数据清空,执行步骤S7;
步骤S7:将所述新用户数据页的物理页号写入所述新地址映射页中,并将所述新地址映射页的物理页号写入所述系统表缓存区的所述系统表中,获取所述系统表的循环位图中与所述地址映射页对应的比特位,将该比特位置为未用比特位;
步骤S8:将所述系统表缓存区中的所述系统表写入所述存储设备的相应位置,写入结束。
2.根据权利要求1所述的方法,其特征在于,所述步骤S1之前,还包括:从所述存储设备中获取有效静态回收标记页,根据所述有效静态回收标记页中的静态回收标记判断是否需要进行静态回收,如果是,则执行静态回收操作,执行步骤S1,否则直接执行步骤S1。
3.根据权利要求1所述的方法,其特征在于,所述步骤S1中,所述从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,具体为:
步骤a1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
步骤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得到在地址映射索引的偏移,读取两个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为0xffff,如果是,则未找到第一物理页号,否则找到第一物理页号。
10.根据权利要求1所述的方法,其特征在于,
所述步骤S3中,所述根据所述存储设备中与所述第一物理页号对应的数据、所述待写数据及所述待写数据的长度,更新所述新用户数据页,具体为:
步骤1:将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3;
步骤2:根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,执行步骤S5;
步骤3:将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,执行步骤S5;
所述步骤S8之前还包括:将所述用户数据缓存区中的数据写入所述新用户数据页中。
11.根据权利要求10所述的方法,其特征在于,所述将所述用户数据缓存区中的数据写入所述新用户数据页中,还包括:判断所述用户数据缓存区中的数据写入所述新用户数据页时是否出现坏页,如果是,则返回执行步骤S2,否则将所述用户数据缓存区中的数据写入所述新用户数据页中。
12.根据权利要求11所述的方法,其特征在于,所述判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,具体为:
步骤aa1:将执行写入读出次数置为初始值;
步骤aa2:将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤aa3;
步骤aa3:判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
13.根据权利要求1所述的方法,其特征在于,
所述步骤S6中,所述根据所述存储设备中与所述第二物理页号对应的数据更新所述新地址映射页,具体为:
步骤b1:将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2;
步骤b2:将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执行步骤b3;
步骤b3:将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中,执行步骤S7。
14.根据权利要求13所述的方法,其特征在于,所述步骤b3,还包括:判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页,如果是,则返回步骤S5,否则将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
15.根据权利要求14所述的方法,其特征在于,所述判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页,具体为:
步骤bb1:将执行写入读出的操作次数置为初始值;
步骤bb2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤bb3;
步骤bb3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
16.根据权利要求1所述的方法,其特征在于,所述步骤S7与所述步骤S8之间还包括:
步骤c1:根据所述新用户数据页的物理页号和所述新地址映射页的物理页号,计算对应的擦除计数页;
步骤c2:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
步骤c3:判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的第三物理页号,如果是,则将所述第三物理页号对应存储设备中的数据写入所述新擦除计数页中,执行步骤c4,否则将所述新擦除计数页中的数据清空,执行步骤c4;
步骤c4:从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,执行步骤S8。
17.根据权利要求16所述的方法,其特征在于,所述步骤c3中,所述将所述第三物理页号对应存储设备中的数据写入所述新擦除计数页中,具体为:
步骤e1:将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2;
步骤e2:将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执行步骤e3;
步骤e3:将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中,执行步骤c4。
18.根据权利要求17所述的方法,其特征在于,所述步骤e3,还包括:判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页,如果是,则返回步骤S5,否则将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
19.根据权利要求18所述的方法,其特征在于,所述判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页,具体为:
步骤cc1:将执行写入读出的操作次数置为初始值;
步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤cc3;
步骤cc3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
20.根据权利要求16所述的方法,其特征在于,所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体为:将所述新擦除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
21.根据权利要求16所述的方法,其特征在于,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体为:根据所述更新后的擦除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表中。
22.根据权利要求16所述的方法,其特征在于,所述步骤c4与所述步骤S8之间还包括:
步骤f1:判断所述新擦除计数页中的擦除次数是否大于第一预设值,如果是,则将静态回收标记置为需要进行静态回收,执行步骤f2,否则执行步骤f2;
步骤f2:获取所述系统表中的擦除总数,根据所述擦除总数,计算得到平均擦除次数,判断所述平均擦除次数是否大于第二预设值,如果是,则将所述静态回收标识置位需要进行静态回收,执行步骤S8,否则直接执行步骤S8。
23.根据权利要求2所述的方法,其特征在于,所述执行静态回收操作,具体为:
步骤g1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当前地址映射页;
步骤g2:判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤g16;
步骤g3:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特位对应的存储设备区域作为待回收地址映射页;
步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5;
步骤g5:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行步骤g6;
步骤g6:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g3,否则执行步骤g7;
步骤g7:将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页的物理页号,将第一个用户数据页作为当前用户数据页;
步骤g8:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前用户数据页的物理页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤g15;
步骤g9:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特位对应的存储设备区域作为待回收用户数据页;
步骤g10:判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤g11;
步骤g11:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤g14,否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步骤g12;
步骤g13:判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g9,否则执行步骤g14;
步骤g14:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号;
步骤g15:判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤g16,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8;
步骤g16:判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤g2。
24.根据权利要求1或16所述的方法,其特征在于,所述从所述系统表缓存区中查询所述系统表中的循环位图,具体为:逐位查询所述系统表缓存区中所述系统表中的循环位图。
25.根据权利要求1或16所述的方法,其特征在于,所述从所述系统表缓存区中查询所述系统表中的循环位图,具体为:从所述系统表缓存区中获取所述系统表中的动态控制指令,根据所述动态控制指令获取循环位图中相应的位置。
26.一种对存储设备进行数据读取的方法,其特征在于,包括:调用读取函数,向所述读取函数中传入读取地址和读取长度,所述读取函数执行以下操作:
步骤A1:从所述存储设备中获取系统表,判断所述系统表是否为空,如果是,则执行步骤A7,否则执行步骤A2;
步骤A2:根据所述读取地址计算逻辑页号,根据所述逻辑页号计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
步骤A3:判断所述地址映射页的物理页号是否为第四预设值,如果是,则执行步骤A7,否则执行步骤A4;
步骤A4:根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的物理页号;
步骤A5:判断所述用户数据页的物理页号是否为所述第四预设值,如果是,则执行步骤A7,否则执行步骤A6;
步骤A6:根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回,读取结束;
步骤A7:根据所述读取长度,返回长度为所述读取长度的第五预设值,读取结束。
27.根据权利要求26所述的方法,其特征在于,所述从所述存储设备中获取系统表,具体包括:
步骤h1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有效系统表;
步骤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所述的装置,其特征在于,
所述获取模块,具体用于执行以下操作:
步骤a1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页,将该页的页号减一对应的页作为第一有效系统表;
步骤a2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第四预设值的第一个页时,将该页的页号加一对应的页作为第二有效系统表;
步骤a3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤a4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中,将所述第二有效系统表的页号记为更新索引;如果只有所述第二有效系统表通过校验,则将第二有效系统表写入系统表缓存区中,将第一有效系统表的页号记为更新索引;如果均未通过校验,则报错,结束;
步骤a4:获取并判断所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中,将所述第一预设值对应的有效系统表的页号记为更新索引;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中,将所述第二预设值对应的有效系统表的页号记为更新索引;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中,将所述第三预设值对应的有效系统表的页号记为更新索引。
34.根据权利要求33所述的装置,其特征在于,
所述写入模块,具体用于将所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表中;
所述更新模块,还用于更新所述更新索引对应的有效系统表中的新旧标记。
35.根据权利要求34所述的装置,其特征在于,
所述判断模块,还用于判断所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表时是否出现坏页;
所述获取模块,还用于当所述判断模块判断出所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表出现坏页时,获取与所述更新索引对应的有效系统表相邻的非坏页的系统表,将所述系统表缓存区中的所述系统表写入该相邻的非坏页的系统表中;
所述更新模块,具体用于当所述判断模块判断出所述系统表缓存区中的所述系统表写入所述更新索引对应的有效系统表未出现坏页时,更新所述更新索引对应的有效系统表中的新旧标记。
36.根据权利要求34所述的装置,其特征在于,
所述判断模块,还用于判断所述更新索引对应的有效系统表中的新旧标记;
所述更新模块,还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新旧标记为第一预设值时,将所述新旧标记更新为所述第三预设值;还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新旧标记为第二预设值时,将所述新旧标记更新为所述第一预设值;还用于当所述判断模块判断出所述更新索引对应的有效系统表中的新旧标记为第三预设值时,将所述新旧标记更新为所述第二预设值。
37.根据权利要求31所述的装置,其特征在于,
所述计算模块,具体用于将所述待写数据的逻辑地址除以预设页长,将得到的商作为逻辑页号。
38.根据权利要求31所述的装置,其特征在于,
所述计算模块,具体用于将所述逻辑页号除以预设页长的二分之一,将得到的商作为所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
39.根据权利要求31所述的装置,其特征在于,
所述判断模块,具体用于根据所述地址映射页的逻辑页号,查找所述系统表中的地址映射索引,将所述地址映射页的逻辑页号乘以2得到在地址映射索引的偏移,读取两个字节的数据,作为所述地址映射页的物理页号,然后根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中获取数据,判断获取到的数据是否为0xffff。
40.根据权利要求31所述的装置,其特征在于,
所述更新模块,具体用于执行以下操作:
步骤1:将所述第一物理页号转换为第一物理地址,判断所述第一物理地址是否在用户数据缓存区中,如果是,则执行步骤2,否则执行步骤3;
步骤2:根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择模块;
步骤3:将所述第一物理地址对应的存储设备中的数据写入所述用户数据缓存区中,根据所述待写数据及所述待写数据的长度,更新所述用户数据缓存区中的数据,触发选择模块;
所述写入模块,还用于将所述用户数据缓存区中的数据写入所述新用户数据页中。
41.根据权利要求40所述的装置,其特征在于,
所述判断模块,还用于判断判断所述用户数据缓存区中的数据写入所述新用户数据页时是否出现坏页;
所述写入模块,具体用于当所述判断模块判断出所述用户数据缓存区中的数据写入所述新用户数据页未出现坏页时,将所述用户数据缓存区中的数据写入所述新用户数据页中。
42.根据权利要求41所述的装置,其特征在于,
所述判断模块,具体用于执行以下操作:
步骤aa1:将执行写入读出次数置为初始值;
步骤aa2:将所述用户数据缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤aa3;
步骤aa3:判断执行写入读出的次数是否达到预设次数,如果是,则所述用户数据缓存区中的数据写入的对应的存储设备区域为坏页,否则返回步骤aa2。
43.根据权利要求31所述的装置,其特征在于,
所述更新模块,具体用于执行以下操作:
步骤b1:将所述第二物理页号转换为第二物理地址,判断所述第二物理地址是否在地址映射缓存区中,如果是,则执行步骤b3,否则执行步骤b2;
步骤b2:将所述第二物理地址对应存储设备中的数据写入所述地址映射缓存区中,执行步骤b3;
步骤b3:将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
44.根据权利要求43所述的装置,其特征在于,
所述判断模块,还用于判断所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页时是否出现坏页;
所述写入模块,具体用于当所述判断模块判断出所述地址映射缓存区中的数据写入所述新地址映射页未出现坏页时,将所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页中。
45.根据权利要求44所述的装置,其特征在于,
所述写入模块,具体用于执行以下操作:
步骤bb1:将执行写入读出的操作次数置为初始值;
步骤bb2:将所述地址映射缓存区中的数据写入存储设备的相应位置后,再从该相应位置处将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤bb3;
步骤bb3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述地址映射缓存区中的数据写入所述存储设备中的所述新地址映射页为坏页,否则返回步骤bb2。
46.根据权利要求31所述的装置,其特征在于,
所述计算模块,还用于根据所述新用户数据页的页号和所述新地址映射页的物理页号,计算对应的擦除计数页;
所述选择模块,还用于从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中一个未用比特位,作为第三比特位,将所述第三比特位置为已用比特位,将所述存储设备中所述第三比特位对应的数据页作为新擦除计数页;
所述判断模块,还用于判断从所述系统表中是否能够获取到与所述擦除计数页的页号对应的第三物理页号;
所述写入模块,还用于当所述判断模块判断出从所述系统表中能够获取到与所述擦除计数页的页号对应的第三物理页号时,将所述第三物理页号对应的存储设备中的数据写入所述新擦除计数页中;
所述更新模块,还用于当所述判断模块判断出从所述系统表中不能够获取到与所述擦除计数页的页号对应的第三物理页号时,将所述新擦除计数页中的数据清空;还用于从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数;还用于根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表。
47.根据权利要求46所述的装置,其特征在于,
所述写入模块,具体用于执行以下操作:
步骤e1:将所述第三物理页号转换为第三物理地址,判断所述第三物理地址是否在擦除计数缓存区中,如果是,则执行步骤e3,否则执行步骤e2;
步骤e2:将所述第三物理地址对应存储设备中的数据写入所述擦除计数缓存区中,执行步骤e3;
步骤e3:将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
48.根据权利要求47所述的装置,其特征在于,
所述判断模块,还用于判断所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中时是否出现坏页;
所述写入模块,具体用于当所述判断模块判断出所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中未出现坏页时,将所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页中。
49.根据权利要求48所述的装置,其特征在于,
所述判断模块,具体用于执行以下操作:
步骤cc1:将执行写入读出的操作次数置为初始值;
步骤cc2:将所述擦除计数缓存区中的数据写入存储设备的相应位置后,再从该相应位置中将该数据读出,判断读出的数据与写入的数据是否相同,如果是,则未出现坏页,否则更新所述执行写入读出的次数,执行步骤cc3;
步骤cc3:判断执行写入读出的操作次数是否达到预设次数,如果是,则所述擦除计数缓存区中的数据写入所述存储设备中的所述新擦除计数页为坏页,否则返回步骤cc2。
50.根据权利要求46所述的装置,其特征在于,
所述更新模块中,所述从所述新擦除计数页中分别查找与所述新用户数据页和所述新地址映射页对应的擦除次数,更新对应的擦除次数,具体用于将所述新擦除计数页中与所述新用户数据页和所述新地址映射页对应的擦除次数均加0x01。
51.根据权利要求46所述的装置,其特征在于,
所述更新模块中,所述根据所述新擦除计数页的页号和更新后的擦除次数更新所述系统表缓存区中的所述系统表,具体用于根据所述更新后的擦除次数更新所述系统表缓存区中的所述系统表中的擦除总数,并将所述新擦除计数页的页号写入所述系统表缓存区中的所述系统表中。
52.根据权利要求46所述的装置,其特征在于,
所述判断模块,还用于判断所述新擦除计数页中的擦除次数是否大于第一预设值;还用于当所述计算模块计算得到平均擦除次数时,判断所述平均擦除次数是否大于第二预设值;
所述获取模块,还用于当所述判断模块判断出所述新擦除计数页中的擦除次数不大于第一预设值时或当所述设置模块将静态回收标记设置为需要进行静态回收时,获取所述系统表中的擦除总数;
所述计算模块,还用于当所述获取模块获取到所述系统表中的擦除总数时,根据所述擦除总数,计算得到平均擦除次数;
所述装置还包括:
设置模块,用于当所述判断模块判断出所述新擦除计数页中的擦除次数大于第一预设值时,将静态回收标记设置为需要进行静态回收;用于当所述判断模块判断出所述平均擦除次数大于第二预设值时,将静态回收标记置为需要进行静态回收。
53.根据权利要求31所述的装置,其特征在于,
所述静态回收模块,具体用于执行以下操作:
步骤g1:从所述存储设备中获取系统表,将所述系统表写入系统表缓存区中,获取系统表缓存区中系统表的所有地址映射页,将所有地址映射页中的第一个地址映射页作为当前地址映射页;
步骤g2:判断当前地址映射页的擦除次数是否达到第六预设值,如果是,则根据当前地址映射页的物理页号计算当前地址映射页的第四物理地址,执行步骤g3,否则执行步骤g16;
步骤g3:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第四比特位,将所述第四比特位置为已用比特位,将所述第四比特位对应的存储设备区域作为待回收地址映射页;
步骤g4:判断所述待回收地址映射页的擦除次数是否小于第六预设值,如果是,则将第四比特位置为未用比特位,执行步骤g3,否则执行步骤g5;
步骤g5:判断地址映射缓存区中是否存在空闲缓存页,如果是,则执行步骤g7,否则将地址映射缓存区中的数据写入存储设备的相应位置,并将地址映射缓存区置为空闲,执行步骤g6;
步骤g6:判断地址映射缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g3,否则执行步骤g7;
步骤g7:将当前地址映射页中的数据写入地址映射缓存区中,根据新地址映射页修改所述系统表缓存区中当前地址映射页对应的页号,获取当前地址映射页中所有用户数据页的页号,将第一个用户数据页作为当前用户数据页;
步骤g8:判断当前用户数据页的擦除次数是否达到第六预设值,如果是,则根据当前用户数据页的页号计算当前用户数据页的第五物理地址,执行步骤g9,否则执行步骤g15;
步骤g9:从所述系统表缓存区中查询所述系统表中的循环位图,选择所述循环位图中的一个未用比特位,作为第五比特位,将所述第五比特位置为已用比特位,将所述第五比特位对应的存储设备区域作为待回收用户数据页;
步骤g10:判断所述待回收用户数据页的擦除次数是否小于第六预设值,如果是,则将第五比特位置为未用比特位,执行步骤g9,否则执行步骤g11;
步骤g11:判断用户数据缓存区中是否存在空闲缓存页,如果是,则执行步骤g14,否则将用户数据缓存区中的数据写入存储设备的相应位置,并将用户缓存区置为空闲,执行步骤g12;
步骤g13:判断所述用户数据缓存区中的数据写入存储设备的相应位置时是否出现坏页,如果是,则执行步骤g9,否则执行步骤g14;
步骤g14:将当前用户数据页中的数据写入所述用户数据缓存区中,根据新用户数据页修改当前地址映射页中当前用户数据页对应的页号;
步骤g15:判断是否处理完当前地址映射页中的所有用户数据页,如果是,则执行步骤g16,否则将当前用户数据页的下一用户数据页作为当前用户数据页,返回执行步骤g8;
步骤g16:判断是否处理完系统表缓存区中系统表的所有地址映射页,如果是,则将静态回收标识置为不需要进行静态回收,将系统表缓存区中的系统表写入存储设备中,回收成功,结束,否则将当前地址映射页的下一地址映射页作为当前地址映射页,返回执行步骤g2。
54.根据权利要求31或46所述的装置,其特征在于,
所述选择模块,具体用于逐位查询所述系统表缓存区中所述系统表中的循环位图。
55.根据权利要求31或46所述的装置,其特征在于,
所述选择模块,具体用于从所述系统表缓存区中获取所述系统表中的动态控制指令,根据所述动态控制指令获取循环位图中相应的位置。
56.一种对存储设备进行数据读取的装置,其特征在于,包括:
调用模块:用于调用读取函数,向所述读取函数中传入读取地址和读取长度;
获取模块:用于当调用模块向所述读取函数中传入读取地址和读取长度后,从所述存储设备中获取系统表;
判断模块:用于当获取模块从所述存储设备中获取到系统表时,判断所述系统表是否为空;用于当计算模块计算出地址映射页的物理页号时,判断所述地址映射页的物理页号是否为第四预设值;用于当计算模块计算出用户数据页的页号时,判断所述用户数据页的页号是否为所述第四预设值;
计算模块:用于当所述判断模块判断出所述系统表不为空时,根据所述读取地址计算逻辑页号,用于计算与所述逻辑页号对应的地址映射页的物理页号和所述逻辑页号在所述地址映射页的页内偏移;
读取模块:用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设值时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号;用于当所述判断模块判断出所述用户数据页的页号为所述第四预设值时,根据所述读取长度,返回长度为所述读取长度的第五预设值;用于当所述判断模块判断出所述用户数据页的页号不为所述第三预设值时,根据所述读取地址和所述读取长度,从所述用户数据页中读取相应的数据,并将所述相应的数据返回。
57.根据权利要求56所述的装置,其特征在于,
所述获取模块,具体用于执行以下操作:
步骤h1:从高地址向低地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号减一对应的页作为第一有效系统表;
步骤h2:从低地址向高地址依次遍历所述存储设备中的系统区,获取系统区中页内数据全为第二预设值的第一个页,将所述获取到的第一个页的页号加一对应的页作为第二有效系统表;
步骤h3:判断所述第一有效系统表和所述第二有效系统表中的数据是否能够通过校验,如果均通过校验,则执行步骤h4;如果只有所述第一有效系统表通过校验,则将所述第一有效系统表写入所述系统表缓存区中;如果只有所述第二有效系统表通过校验,则将所述第二有效系统表写入所述系统表缓存区中;如果均未通过校验,则报错,结束;
步骤h4:分别获取所述第一有效系统表和所述第二有效系统表中的新旧标记,如果是第一预设值和第二预设值,则将所述第二预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第二预设值和第三预设值,则将所述第三预设值对应的有效系统表读入所述系统表缓存区中;如果是所述第三预设值和所述第一预设值,则将所述第一预设值对应的有效系统表读入所述系统表缓存区中。
58.根据权利要求56所述的装置,其特征在于,
所述计算模块,具体用于将所述读取地址除以预设页长,将得到的商作为逻辑页号;具体用于将所述逻辑页号除以预设页长,根据得到的商从所述系统表中获取与所述逻辑页号对应的地址映射页的物理页号,将得到的余数作为所述逻辑页号在所述地址映射页的页内偏移。
59.根据权利要求56所述的装置,其特征在于,还包括:
第一转换模块,用于当所述判断模块判断出所述地址映射页的物理页号不为第四预设值时,将所述地址映射页的物理页号转换为所述地址映射页的物理地址;
所述判断模块,还用于当所述第一转换模块得到所述地址映射页的物理地址时,判断从地址映射缓存区中是否能够找到所述地址映射页的物理地址;
所述读取模块:具体用于当所述判断模块判断出从所述地址映射缓存区中获取到所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在地址映射页的页内偏移,从所述地址映射缓存区读出用户数据页的页号;具体用于当所述判断模块判断出从所述地址映射缓存区中不能读取所述地址映射页的物理地址时,根据所述地址映射页的物理页号和在所述地址映射页的页内偏移,从所述地址映射页中读出用户数据页的页号。
60.根据权利要求56所述的装置,其特征在于,还包括:
第二转换模块,用于当所述判断模块判断出所述用户数据页的页号不为第四预设值时,将所述用户数据页的页号转换为所述用户数据页的物理地址;
所述判断模块,还用于当所述第二转换模块得到所述用户数据页的物理地址时,判断用户数据缓存区中是否存在所述用户数据页的物理地址;
所述读取模块:具体用于当所述判断模块判断出从所述用户数据缓存区中存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据缓存区中读取相应的数据,将读取到的数据返回;具体用于当所述判断模块判断出所述用户数据缓存区中不存在所述用户数据页的物理地址时,根据所述读取地址和所述读取长度,从所述用户数据页中读出相应的数据,并将所述相应的数据返回。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410322860.7A CN104090730B (zh) | 2014-07-08 | 2014-07-08 | 一种对存储设备进行数据读写的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410322860.7A CN104090730B (zh) | 2014-07-08 | 2014-07-08 | 一种对存储设备进行数据读写的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104090730A true CN104090730A (zh) | 2014-10-08 |
CN104090730B CN104090730B (zh) | 2017-02-22 |
Family
ID=51638450
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410322860.7A Active CN104090730B (zh) | 2014-07-08 | 2014-07-08 | 一种对存储设备进行数据读写的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104090730B (zh) |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104461393A (zh) * | 2014-12-09 | 2015-03-25 | 华中科技大学 | 一种闪存存储器的混合映射方法 |
CN105094707A (zh) * | 2015-08-18 | 2015-11-25 | 华为技术有限公司 | 一种数据存储、读取方法及装置 |
CN106055279A (zh) * | 2016-06-12 | 2016-10-26 | 浪潮(北京)电子信息产业有限公司 | 管理固态硬盘的地址映射表的方法、装置及固态硬盘 |
CN106201778A (zh) * | 2016-06-30 | 2016-12-07 | 联想(北京)有限公司 | 信息处理方法及存储设备 |
CN106649132A (zh) * | 2016-12-29 | 2017-05-10 | 记忆科技(深圳)有限公司 | 一种固态硬盘垃圾回收的方法 |
CN107168647A (zh) * | 2017-04-17 | 2017-09-15 | 武汉永力科技股份有限公司 | Flash数据读写方法及系统 |
CN107229571A (zh) * | 2017-06-08 | 2017-10-03 | 中国电子信息产业集团有限公司第六研究所 | EtherCAT从站中FMMU的控制方法及系统 |
CN107454953A (zh) * | 2017-03-16 | 2017-12-08 | 深圳大趋智能科技有限公司 | Emv的实现方法及装置 |
CN107562646A (zh) * | 2017-08-28 | 2018-01-09 | 记忆科技(深圳)有限公司 | 一种提升固态存储垃圾回收性能的方法 |
CN108255740A (zh) * | 2017-12-07 | 2018-07-06 | 深圳市中易通安全芯科技有限公司 | 一种flash均衡擦写方法及系统 |
CN109815157A (zh) * | 2017-11-22 | 2019-05-28 | 北京忆芯科技有限公司 | 编程命令处理方法与装置 |
CN111008159A (zh) * | 2019-11-28 | 2020-04-14 | 北京握奇智能科技有限公司 | 存储设备数据保护方法、装置、设备及存储介质 |
CN111399781A (zh) * | 2020-04-21 | 2020-07-10 | 中国科学院光电技术研究所 | 一种提高实时图像记录系统可靠性的存储方法 |
CN114281248A (zh) * | 2021-11-29 | 2022-04-05 | 深圳三地一芯电子有限责任公司 | 一种提升ram读写性能的方法、电子设备及介质 |
CN114327258A (zh) * | 2021-11-30 | 2022-04-12 | 苏州浪潮智能科技有限公司 | 一种固态硬盘处理方法、系统、设备及计算机存储介质 |
CN114415942A (zh) * | 2021-12-21 | 2022-04-29 | 联芸科技(杭州)有限公司 | L2p映射表重建方法及固态硬盘 |
CN114518834A (zh) * | 2020-11-18 | 2022-05-20 | 中移物联网有限公司 | 一种信息存储方法、装置及电子设备 |
CN117420965A (zh) * | 2023-12-18 | 2024-01-19 | 合肥康芯威存储技术有限公司 | 一种存储器及其控制方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080307164A1 (en) * | 2007-06-08 | 2008-12-11 | Sinclair Alan W | Method And System For Memory Block Flushing |
US20090150599A1 (en) * | 2005-04-21 | 2009-06-11 | Bennett Jon C R | Method and system for storage of data in non-volatile media |
CN102089828A (zh) * | 2008-07-10 | 2011-06-08 | 美光科技公司 | 固态存储装置中的数据收集及压缩 |
US20110307667A1 (en) * | 2008-03-01 | 2011-12-15 | Kabushiki Kaisha Toshiba | Memory system |
-
2014
- 2014-07-08 CN CN201410322860.7A patent/CN104090730B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090150599A1 (en) * | 2005-04-21 | 2009-06-11 | Bennett Jon C R | Method and system for storage of data in non-volatile media |
US20080307164A1 (en) * | 2007-06-08 | 2008-12-11 | Sinclair Alan W | Method And System For Memory Block Flushing |
US20110307667A1 (en) * | 2008-03-01 | 2011-12-15 | Kabushiki Kaisha Toshiba | Memory system |
CN102089828A (zh) * | 2008-07-10 | 2011-06-08 | 美光科技公司 | 固态存储装置中的数据收集及压缩 |
Cited By (32)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104461393A (zh) * | 2014-12-09 | 2015-03-25 | 华中科技大学 | 一种闪存存储器的混合映射方法 |
CN104461393B (zh) * | 2014-12-09 | 2017-05-17 | 华中科技大学 | 一种闪存存储器的混合映射方法 |
CN105094707A (zh) * | 2015-08-18 | 2015-11-25 | 华为技术有限公司 | 一种数据存储、读取方法及装置 |
CN105094707B (zh) * | 2015-08-18 | 2018-03-13 | 华为技术有限公司 | 一种数据存储、读取方法及装置 |
CN106055279A (zh) * | 2016-06-12 | 2016-10-26 | 浪潮(北京)电子信息产业有限公司 | 管理固态硬盘的地址映射表的方法、装置及固态硬盘 |
CN106055279B (zh) * | 2016-06-12 | 2019-05-10 | 浪潮(北京)电子信息产业有限公司 | 管理固态硬盘的地址映射表的方法、装置及固态硬盘 |
CN106201778A (zh) * | 2016-06-30 | 2016-12-07 | 联想(北京)有限公司 | 信息处理方法及存储设备 |
CN106201778B (zh) * | 2016-06-30 | 2019-06-25 | 联想(北京)有限公司 | 信息处理方法及存储设备 |
CN106649132A (zh) * | 2016-12-29 | 2017-05-10 | 记忆科技(深圳)有限公司 | 一种固态硬盘垃圾回收的方法 |
CN107454953B (zh) * | 2017-03-16 | 2020-11-03 | 深圳大趋智能科技有限公司 | Emv的实现方法及装置 |
CN107454953A (zh) * | 2017-03-16 | 2017-12-08 | 深圳大趋智能科技有限公司 | Emv的实现方法及装置 |
CN107168647A (zh) * | 2017-04-17 | 2017-09-15 | 武汉永力科技股份有限公司 | Flash数据读写方法及系统 |
CN107168647B (zh) * | 2017-04-17 | 2020-10-23 | 武汉永力科技股份有限公司 | Flash数据读写方法及系统 |
CN107229571A (zh) * | 2017-06-08 | 2017-10-03 | 中国电子信息产业集团有限公司第六研究所 | EtherCAT从站中FMMU的控制方法及系统 |
CN107562646A (zh) * | 2017-08-28 | 2018-01-09 | 记忆科技(深圳)有限公司 | 一种提升固态存储垃圾回收性能的方法 |
CN109815157B (zh) * | 2017-11-22 | 2022-06-17 | 北京忆芯科技有限公司 | 编程命令处理方法与装置 |
CN109815157A (zh) * | 2017-11-22 | 2019-05-28 | 北京忆芯科技有限公司 | 编程命令处理方法与装置 |
CN108255740A (zh) * | 2017-12-07 | 2018-07-06 | 深圳市中易通安全芯科技有限公司 | 一种flash均衡擦写方法及系统 |
CN111008159A (zh) * | 2019-11-28 | 2020-04-14 | 北京握奇智能科技有限公司 | 存储设备数据保护方法、装置、设备及存储介质 |
CN111008159B (zh) * | 2019-11-28 | 2022-01-28 | 北京握奇智能科技有限公司 | 存储设备数据保护方法、装置、设备及存储介质 |
CN111399781B (zh) * | 2020-04-21 | 2023-09-19 | 中国科学院光电技术研究所 | 一种提高实时图像记录系统可靠性的存储方法 |
CN111399781A (zh) * | 2020-04-21 | 2020-07-10 | 中国科学院光电技术研究所 | 一种提高实时图像记录系统可靠性的存储方法 |
CN114518834A (zh) * | 2020-11-18 | 2022-05-20 | 中移物联网有限公司 | 一种信息存储方法、装置及电子设备 |
CN114518834B (zh) * | 2020-11-18 | 2023-10-27 | 中移物联网有限公司 | 一种信息存储方法、装置及电子设备 |
CN114281248A (zh) * | 2021-11-29 | 2022-04-05 | 深圳三地一芯电子有限责任公司 | 一种提升ram读写性能的方法、电子设备及介质 |
CN114281248B (zh) * | 2021-11-29 | 2022-12-09 | 深圳三地一芯电子有限责任公司 | 一种提升ram读写性能的方法、电子设备及介质 |
CN114327258A (zh) * | 2021-11-30 | 2022-04-12 | 苏州浪潮智能科技有限公司 | 一种固态硬盘处理方法、系统、设备及计算机存储介质 |
CN114327258B (zh) * | 2021-11-30 | 2023-08-15 | 苏州浪潮智能科技有限公司 | 一种固态硬盘处理方法、系统、设备及计算机存储介质 |
CN114415942A (zh) * | 2021-12-21 | 2022-04-29 | 联芸科技(杭州)有限公司 | L2p映射表重建方法及固态硬盘 |
CN114415942B (zh) * | 2021-12-21 | 2022-11-04 | 联芸科技(杭州)股份有限公司 | L2p映射表重建方法及固态硬盘 |
CN117420965A (zh) * | 2023-12-18 | 2024-01-19 | 合肥康芯威存储技术有限公司 | 一种存储器及其控制方法 |
CN117420965B (zh) * | 2023-12-18 | 2024-03-22 | 合肥康芯威存储技术有限公司 | 一种存储器及其控制方法 |
Also Published As
Publication number | Publication date |
---|---|
CN104090730B (zh) | 2017-02-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104090730A (zh) | 一种对存储设备进行数据读写的方法及装置 | |
CN101169751B (zh) | 具有闪存设备的系统及其数据恢复方法 | |
CN102135942B (zh) | 一种存储设备中实现损耗均衡的方法及存储设备 | |
CN100424655C (zh) | 快闪存储器管理方法 | |
CN101937319B (zh) | 存储器系统及其映射方法 | |
CN101582052B (zh) | 存储器模组及于存储器模组中实现平均磨损的方法 | |
CN101236789B (zh) | 检测静态数据区、磨损均衡和合并数据单元的方法和装置 | |
CN108710578B (zh) | 基于闪存的数据存储方法和装置 | |
CN102508788B (zh) | Ssd及ssd垃圾回收方法和装置 | |
CN101740110B (zh) | 一种Nand Flash擦除均衡的方法及装置 | |
CN103164346A (zh) | Lba位图使用 | |
CN100533408C (zh) | 一种闪存的安全读写方法 | |
CN102819496A (zh) | 闪存ftl的地址转换方法 | |
EP1542129A2 (en) | Flash memory and mapping control apparatus and method for flash memory | |
CN103106143A (zh) | 固态储存装置及其逻辑至实体对应表建立方法 | |
CN101123116A (zh) | 存储装置及其读写方法 | |
CN103699341A (zh) | 一种向存储设备中写数据的方法 | |
CN109669889B (zh) | 一种轻量型Nor Flash闪存控制方法和装置 | |
CN104424110A (zh) | 固态驱动器的主动回收 | |
CN108733577A (zh) | 存储器管理方法、存储器控制电路单元及存储器存储装置 | |
US20150220433A1 (en) | Method for managing flash memories having mixed memory types using a finely granulated allocation of logical memory addresses to physical memory addresses | |
CN104166627B (zh) | 一种基于单片机的nand‑flash写操作方法 | |
CN102541753B (zh) | 一种嵌入式存储器的读写优化方法 | |
CN105988950A (zh) | 存储器管理方法、存储器控制电路单元与存储器存储装置 | |
CN101154447B (zh) | 一种闪存控制方法及闪存 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |