基于异构混合内存的NVM坏块识别处理及纠错方法和系统与流程

文档序号:13259027阅读:283来源:国知局
技术领域本发明涉及计算机技术领域,特别是涉及一种基于异构混合内存的NVM坏块识别处理及纠错方法和系统。

背景技术:
随着电阻存储器、铁电存储器、相变存储器等为代表的新兴非易失性随机存储介质(Non-VolatileMemory,NVM)技术的发展,推进了存储技术的发展,为新型的内存与存储体系结构的产生打下了良好的基础。通过把新型的NVM和动态随机访问存储器(DynamicRandomAccessMemory,DRAM)相结合,搭建混合内存架构,形成异构混合内存。异构混合内存同时具有NVM和DRAM的特点,不仅仅具备常规内存的功能,存储在DRAM中的数据在断电后会立即消失,是易失性的;同时还能发挥NVM在断电后还能保存数据的优势,充分发挥NVM非易失性的特点,是一种混合使用的新型内存。异构混合内存满足现有工业控制设备的常规内存接口,无需引进新的工业控制设备或添加新的辅助设备,成为了一个研究热点。异构混合内存中的NVM与DRAM特性不同,NVM存在擦写总次数有限制的先天缺陷,达到一定擦写次数后NVM将会失效,并且NVM存储区域出现的损坏是永久性的,同时限于当今的制造工艺和寿命限制,NVM将不可避免的出现坏块,常规的DRAM内存数据处理方法不涉及到NVM坏块,不适用于异构混合内存中的NVM内存。

技术实现要素:
基于此,有必要针对上述问题,提供一种基于异构混合内存的NVM坏块识别处理及纠错方法和系统,能识别NVM中的坏块,并进行处理和数据纠错,保证NVM内存中的数据的可靠性和完整性。一种基于异构混合内存的NVM坏块识别处理及纠错方法,所述方法包括:在自检过程中,执行:检测NVM的块中的每个地址单元中的数据;如果块中任一地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据不相同,则判定所述块为坏块;如果块中所有地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据都相同,则判定所述块为好块。在其中一个实施例中,所述检测NVM的块中的每个地址单元中的数据的步骤包括:将NVM的块的起始地址单元作为当前地址单元,执行:读取所述当前地址单元的数据,得到第一读取数据,将所述第一读取数据进行运算,得到第一运算数据;将所述第一运算数据写入所述当前地址单元,读取所述第一运算数据得到第二读取数据;判断所述第二读取数据与第一运算数据是否相同,如果不同,则所述块为坏块;如果相同,则进一步判断所述当前地址单元是否为NVM的块的结束地址单元,如果是,则所述块为好块,否则将下一个地址单元作为当前地址单元,返回所述读取所述当前地址单元的数据的步骤。在其中一个实施例中,所述NVM包含数据存储区和备用块区;所述备用块区中保存了用于记录NVM的块状态的状态表和用于记录坏块和好块的替换关系的映射表;所述方法还包括:如果所述块为好块,则在状态表和映射表中与所述块对应的位置标记为好块;如果所述块为坏块,则在状态表中与所述块对应的位置标记为坏块;如果所述坏块为数据存储区或备用块区用作替换块的块,则获取备用块区的好块,将所述备用块区的好块作为所述坏块的替换块,在映射表中与所述坏块对应的位置保存所述好块的位置信息,在映射表中与所述好块对应的位置保存所述坏块的位置信息;如果所述坏块为备用块区用作替换块的块,还需要在映射表中与所述坏块对应的位置标记为不可用作替换块。如果所述坏块为备用块区没有用作替换块的块,则在映射表中与所述坏块对应的位置标记为不可用作替换块。在其中一个实施例中,在所述判断第二读取数据与第一运算数据是否相同,如果不同的步骤之后,还包括:将第一运算数据再次写入所述当前地址单元,再次读取所述第一运算数据,得到第三读取数据;判断所述第三读取数据与第一运算数据是否相同,如果不同,则所述块为坏块,如果相同,则再进入所述进一步判断所述当前地址单元是否为NVM的块的结束地址单元的步骤。在其中一个实施例中,在所述判断第二读取数据与第一运算数据是否相同,如果相同的步骤之后还包括:将所述第二读取数据反运算后存入所述当前地址单元;在所述判断第三读取数据与第一运算数据是否相同,如果相同的步骤之后还包括:将所述第三读取数据反运算后存入所述当前地址单元。在其中一个实施例中,所述运算和反运算都为对数据进行取反。在其中一个实施例中,所述备用块区还保存了页面擦写次数记录表,所述页面擦写次数记录表中保存了页面的序号和所对应的擦写次数,所述方法还包括:获取所述页面擦写次数记录表;根据所述页面擦写次数记录表,判断NVM的块中是否存在超过最大擦写次数的页面,如果是,则判定所述块为坏块,否则判定所述块为好块。在其中一个实施例中,所述方法还包括:S1:获取数据写入请求;S2:将数据写入到NVM内存中,将所述数据进行ECC校验生成写入校验和;S3:从所述数据写入的位置读取所述数据,将读取出的数据进行ECC校验生成读取校验和;S4:将所述写入校验和以及读取校验和进行异或运算,得到运算结果;S5:如果运算结果为0,则所述数据正确,否则重复执行预设次数步骤S2-S4,当每次执行完步骤S2-S4得到的运算结果都不为0时,判定所述数据出错,并根据所述运算结果进行数据纠错。在其中一个实施例中,所述将所述数据进行ECC校验生成写入校验和以及将读取出的数据进行ECC校验生成读取校验和中对数据进行ECC校验的步骤包括:判断需要进行ECC校验的数据是否满足预设字节;如果不满足则将所述数据进行拆分和补齐生成预设字节的数据;对所述预设字节的数据进行行校验和列校验,得到行校验值和列校验值;将所述行校验值和列校验值顺序存储并补齐生成预设字节的校验和。在其中一个实施例中,所述根据所述运算结果进行数据纠错的步骤包括:判断所述运算结果的比特位是否存在预设数目的1,如果是则判定为数据可纠错,否则判定为数据不可纠错;如果数据可纠错,则根据所述运算结果确定出错的行地址和列地址;根据所述行地址和列地址获取出错数据,将所述出错数据进行取反运算得到正确数据。一种基于异构混合内存的NVM坏块识别处理及纠错系统,所述系统包括:检测模块,用于在自检过程中,检测NVM的块中的每个地址单元中的数据;判定模块,用于如果块中任一地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据不相同,则判定所述块为坏块;所述判定模块还用于如果块中所有地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据都相同,则判定所述块为好块。在其中一个实施例中,所述检测模块包括:第一数据获取单元,用于将NVM的块的起始地址单元作为当前地址单元,读取所述当前地址单元的数据,得到第一读取数据,将所述第一读取数据进行运算,得到第一运算数据;第二数据获取单元,用于将所述第一运算数据写入所述当前地址单元,读取所述第一运算数据得到第二读取数据;处理单元,用于判断所述第二读取数据与第一运算数据是否相同,如果不同,则所述块为坏块;如果相同,则进一步判断所述当前地址单元是否为NVM的块的结束地址单元,如果是,则所述块为好块,否则将下一个地址单元作为当前地址单元,返回第一数据获取模块进入读取所述当前地址单元的数据的步骤。在其中一个实施例中,所述NVM包含数据存储区和备用块区,所述备用块区中保存了用于记录NVM的块状态的状态表和用于记录坏块和好块的替换关系的映射表,所述系统还包括:块处理模块,用于如果所述块为好块,则在状态表和映射表中与所述块对应的位置标记为好块;所述块处理模块还用于如果所述块为坏块,则在状态表中与所述块对应的位置标记为坏块;所述块处理模块还用于如果所述坏块为数据存储区或备用块区用作替换块的块,则获取备用块区的好块,将所述备用块区的好块作为所述坏块的替换块,在映射表中与所述坏块对应的位置保存所述好块的位置信息,在映射表中与所述好块对应的位置保存所述坏块的位置信息,如果所述坏块为备用块区用作替换块的块,还需要在映射表中与所述坏块对应的位置标记为不可用作替换块;所述块处理模块还用于如果所述坏块为备用块区没有用作替换块的块,则在映射表中与所述坏块对应的位置标记为不可用作替换块。在其中一个实施例中,所述处理单元还用于将第一运算数据再次写入所述当前地址单元,再次读取所述第一运算数据,得到第三读取数据,判断所述第三读取数据与第一运算数据是否相同,如果不同,则所述块为坏块,如果相同,则再进入所述进一步判断所述当前地址单元是否为NVM的块的结束地址单元的步骤。在其中一个实施例中,所述处理单元还用于在判断第二读取数据与第一运算数据是否相同,如果相同之后,将所述第二读取数据反运算后存入所述当前地址单元;还用于在判断第三读取数据与第一运算数据是否相同,如果相同之后,将所述第三读取数据反运算后存入所述当前地址单元。在其中一个实施例中,所述运算和反运算都为对数据进行取反。在其中一个实施例中,所述备用块区还保存了页面擦写次数记录表,所述页面擦写次数记录表中保存了页面的序号和所对应的擦写次数,所述系统还包括:记录表判定模块,用于获取所述页面擦写次数记录表,根据所述页面擦写次数记录表,判断NVM的块中是否存在超过最大擦写次数的页面,如果是,则判定所述块为坏块,否则判定所述块为好块。在其中一个实施例中,所述系统还包括:纠错模块,用于执行:S1:获取数据写入请求;S2:将数据到NVM内存中,将所述数据进行ECC校验生成写入校验和;S3:从所述数据写入的位置读取所述数据,将读取出的数据进行ECC校验生成读取校验和;S4:将所述写入校验和以及读取校验和进行异或运算,得到运算结果;S5:如果运算结果为0,则所述数据正确,否则重复执行预设次数S2-S4,当每次执行完S2-S4得到的运算结果都不为0时,判定所述数据出错,并根据所述运算结果进行数据纠错。在其中一个实施例中,所述纠错模块对数据进行ECC校验具体是判断需要进行ECC校验的数据是否满足预设字节,如果不满足则将所述数据进行拆分和补齐生成预设字节的数据,对所述预设字节的数据进行行校验和列校验,得到行校验值和列校验值,将所述行校验值和列校验值顺序存储并补齐生成预设字节的校验和。在其中一个实施例中,所述纠错模块还用于判断所述运算结果的比特位是否存在预设数目的1,如果是则判定为数据可纠错,否则判定为数据不可纠错,如果数据可纠错,则根据所述运算结果确定出错的行地址和列地址,根据所述行地址和列地址获取出错数据,将所述出错数据进行取反运算得到正确数据。上述基于异构混合内存的NVM坏块识别处理及纠错方法和系统,通过在自检过程中,检测NVM的块中的每个地址单元中的数据,如果块中任一地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据不相同,则判定所述块为坏块;如果块中所有地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据都相同,则判定所述块为好块。将读取的数据进行运算后写入相同的地址,而不是直接将读取的数据写入相同的地址,再读出来和第一次读取的数据进行运算后的结果进行比较,根据比较结果判断是否是坏块,能识别NVM中的坏块并且降低误判的几率,保证NVM内存中的数据的可靠性和完整性。附图说明图1为一个实施例中基于异构混合内存的NVM坏块识别方法的流程图;图2为一个实施例中基于异构混合内存的NVM坏块处理的流程图;图3为一个实施例中NVM内存、状态表和映射表的示意图;图4为一个实施例中更新的状态表和映射表的示意图;图5为另一个实施例中基于异构混合内存的NVM坏块识别方法的流程图;图6为一个实施例中将数据进行ECC校验生成校验和的流程图;图7为一个实施例中根据运算结果进行数据纠错的流程图;图8为一个实施例中基于异构混合内存的NVM坏块识别系统的结构框图;图9为一个实施例中检测模块的结构框图;图10为另一个实施例中基于异构混合内存的NVM坏块识别处理系统的结构框图;图11为一个实施例中基于异构混合内存的NVM坏块识别处理系统的结构框图;图12为一个实施例中基于异构混合内存的NVM坏块识别处理及纠错系统的结构框图。具体实施方式为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。在一个实施例中,提供了一种基于异构混合内存的NVM坏块识别处理及纠错方法,该方法包括:在自检过程中,执行:检测NVM的块中的每个地址单元中的数据;如果块中任一地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据不相同,则判定所述块为坏块;如果块中所有地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据都相同,则判定所述块为好块。本实施例中,对NVM的块进行自检,是在第一次开机使用NVM前进行自检或者由用户发出特殊指令自检,自检由应用层向NVM内存缓冲控制器发出特殊指令执行。自检时,检测NVM的块中的每个地址单元中的数据,地址单元是指NVM的块中的内存空间,NVM的块由多个地址单元组成,以地址单元为单位进行自检,地址单元的大小可以自定义,优选的,以1字节为一个地址单元。运算的规则可以自定义,如对数据进行加减乘除、取反等运算。本实施例中,通过在自检过程中,检测NVM的块中的每个地址单元中的数据,如果块中任一地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据不相同,则判定所述块为坏块;如果块中所有地址单元中的数据,对读取的所述数据运算后得到的数据与将所述运算后得到的数据写入地址单元后再次读取得到的数据都相同,则判定所述块为好块。对于某类坏块,可以正确读取数据,不能写入数据,则第一次读取的数据是正确的数据,和块中保存的原始数据相同,如果不对第一次读取的数据进行运算就直接将此数据进行写入,虽然坏块不能写入数据,但是坏块中本来就保存有原始数据,则导致第二次再读取的数据是坏块中本来保存的原始数据与第一次读取的数据相同,从而判定为好坏,导致不能识别出此类坏块。本实施例中,将读取的数据进行运算后写入相同的地址,而不是直接将读取的数据写入相同的地址,再读出来和第一次读取的数据进行运算后的结果进行比较,根据比较结果判断是否是坏块,能识别NVM中的坏块并且降低误判的几率,保证NVM内存中的数据的可靠性和完整性。在一个实施例中,如图1所示,提供了一种基于异构混合内存的NVM坏块识别处理及纠错方法,该方法包括:将NVM的块的起始地址单元作为当前地址单元执行步骤S110,读取当前地址单元的数据,得到第一读取数据,将所述第一读取数据进行运算,得到第一运算数据。本实施例中,从NVM块的起始地址单元开始进行检测,地址单元的大小可以自定义,优选的,以1字节为一个地址单元。运算的规则可以自定义,如对数据进行加减乘除、取反等运算。步骤S120,将第一运算数据写入所述当前地址单元,读取第一运算数据得到第二读取数据。本实施例中,将运算后的第一运算数据写入当前地址单元,再从当前地址单元读取第一运算数据得到第二读取数据,保证第二次读取的数据是经过运算后保存的数据,而不是NVM的块中原先保存的原始数据。步骤S130,判断第二读取数据与第一运算数据是否相同,如果不同,则所述块为坏块,否则进入步骤S140。本实施例中,如果地址单元的读取或写入功能有一项出错,则会导致第二读取数据与第一运算数据不相同,则所述地址单元不能正常使用,NVM的一个块中包含的地址单元中只要有一个地址单元不正常,则此块为坏块,就不用再对剩下的地址单元进行检测了。步骤S140,判断当前地址单元是否为NVM的块的结束地址单元,如果是,则所述块为好坏,否则进入步骤S150。本实施例中,当前地址单元如果为NVM的块的结束地址单元,则说明NVM的块中从起始地址单元到结束地址单元的所有地址单元都能正常使用,则此块为好块。步骤S150,将下一个地址单元作为当前地址单元,返回步骤S110。本实施例中,如果当前地址单元不是NVM的块的结束地址单元,则将下一个地址单元作为当前地址单元返回步骤S110,对块中还没有检测的剩下的地址单元进行检测。本实施例中,从NVM的块的起始地址单元开始顺序对地址单元进行检测,如果检测出不正常的地址单元,则不需要对剩下的地址单元进行检测,判断此块为坏块。在一个实施例中,NVM包含数据存储区和备用块区,备用块区中保存了用于记录NVM的块状态的状态表和用于记录坏块和好块的替换关系的映射表,本实施例中,NVM包含数据存储区用于存储数据,还包含NVM内存缓冲控制器划出的一个特殊存储区域即备用块区,备用块区保存了用于记录和管理数据坏块的链表包括状态表和映射表,备用块区还用于作为坏块的替换存储空间。状态表中记录了NVM的所有块的块状态,即是坏块还是好块。映射表记录了坏块和好块的替换关系,通过坏块的位置可以找到替换它的好块的位置,通过好块的位置也可以找到它所替换的坏块的位置,如图2所示,所述方法还包括:步骤S210,如果块为好块,则在状态表和映射表中与块对应的位置标记为好块。本实施例中,状态表中包括NVM块的位置信息和各个位置对应的块状态。映射表中包括NVM块的位置信息和各个位置对应的信息。可以理解的是,位置信息可以用块序号来表示。如果块为好块,则在状态表和映射表中与块对应的位置标记为好块,标记的符号可以自定义,如在状态表中用“Good”表示好块,在映射表中用“0xFFFF”表示好块,可以被用作替换块。步骤S220,如果块为坏块,则在状态表中与块对应的位置标记为坏块。本实施例中,标记的符号可以自定义,如在状态表中用“Bad”表示坏块。经过自检之后,NVM数据存储区和备用块区的块都有了自己的块状态,记录在状态表中。步骤S230,如果坏块为数据存储区或备用块区用作替换块的块,则获取备用块区的好块,将所述备用块区的好块作为所述坏块的替换块,在映射表中与坏块对应的位置保存好块的位置信息,在映射表中与好块对应的位置保存坏块的位置信息,如果坏块为备用块区用作替换块的块,还需要在映射表中与坏块对应的位置标记为不可用作替换块。本实施例中,如果数据存储区的块是坏块,则需要用备用块区的好块替换坏块,通过映射表,把备用块区的好块的位置映射到坏块位置,在映射表中与坏块对应的位置保存好块的位置信息,在映射表中与好块对应的位置保存坏块的位置信息,使在保存或读取数据时可根据位置映射关系直接将数据写入好块或直接从好块读取数据,起到对系统屏蔽坏块的作用。可以理解的是,经过ECC校验后出错的数据可以经过纠正后再写入映射位置的好块。如图3所示,例如如果检测出序号为No.47的块出错,先在状态表中标记该块为坏块“Bad”,同时从备用块区中获取一个新的好块,假设其序号为No.71,然后将此好块的序号No.71保存在映射中的序号No.47所在的位置,而且映射表中的备用块No.71所在位置保存序号No.47。经过映射处理后,当将数据Data2写入序号为No.47的块时,由于状态表中记录该块为坏块,就通过映射表找到替换块No.71,直接将数据Data2写入替换块No.71;当读取序号为No.47的块的数据时,由于状态表中记录该块为坏块,就通过映射表找到替换块No.71,直接去替换块No.71中读取数据Data2;映射表中的这种双向映射可确保数据的可靠性。进一步的,备用块区域中的块也有可能成为坏块,如果备用块区用作替换块的块是坏块,如用作序号No.47的块的替换块,即序号No.71的块成为了坏块,则需要重新在备用块区获取一个新的好块,假设其序号为No.72,然后将此好块的序号No.72保存在映射表中序号No.47所在的位置,而且映射表中序号No.72所在位置保存序号No.47,还需要在映射表中与坏块对应的位置标记为不可用作替换块,如在No.71所在位置标记为“0x0000”表示不可用作替换块,如图4所示,为更新后的状态表和映射表。可以理解的是,标记的符号可以自定义。步骤S240,如果坏块为备用块区没有用作替换块的块,则在映射表中与坏块对应的位置标记为不可用作替换块。本实施例中,如果备用块区没有用作替换块的块是坏块,则由于它还没有被用作替换块,只需要在映射表中与坏块对应的位置标记为不可用作替换块即可。如图3所示,在No.70所在位置标记为“0x0000”表示不可用作替换块,可以理解的是,标记的符号可以自定义。在另一个实施例中,如图5所示,提供了一种基于异构混合内存的NVM坏块识别处理及纠错方法,该方法包括:步骤S310,读取当前地址单元的数据,得到第一读取数据,将所述第一读取数据进行运算,得到第一运算数据。步骤S320,将第一运算数据写入所述当前地址单元,读取第一运算数据得到第二读取数据。步骤S330,判断第二读取数据与第一运算数据是否相同,如果不同,则进入步骤S340,否则进入步骤S370。本实施例中,当第二读取数据与第一运算数据不相同时,没有直接判定所述块是坏块,是为了避免不是NVM块本身引起的出错,导致误判其为坏块,减少了误判的几率。步骤S340,将第一运算数据再次写入所述当前地址单元,再次读取所述第一运算数据,得到第三读取数据。本实施例中,再次保证第三次读取的数据是第一次读取的数据经过运算后保存的数据,而不是NVM的块中原先保存的原始数据。步骤S350,判断第三读取数据与第一运算数据是否相同,如果不同,则进入步骤S360判定所述块为坏块,否则进入步骤S370。本实施例中,如果地址单元的读取或写入功能有一项出错,则会导致第三读取数据与第一运算数据不相同,则所述地址单元不能正常使用,NVM的一个块中包含的地址单元中只要有一个地址单元不正常,则此块为坏块,就不用再对剩下的地址单元进行检测了。步骤S370,判断当前地址单元是否为NVM的块的结束地址单元,如果是,则进入步骤S380判定所述块为好坏,否则进入步骤S390。步骤S390,将下一个地址单元作为当前地址单元,返回步骤S310。在一个实施例中,在判断第二读取数据与第一运算数据是否相同,如果相同的步骤之后还包括:将第二读取数据反运算后存入当前地址单元;在判断第三读取数据与第一运算数据是否相同,如果相同的步骤之后还包括:将所述第三读取数据反运算后存入当前地址单元。本实施例中,将第二读取数据反运算后存入当前地址单元或将第三读取数据反运算后存入当前地址单元,由于第二读取数据和第三读取数据都是第一读取数据经过运算后的数据,则再进行反运算后就又恢复了第一读取数据,是为了保证原始数据被读取又保存后没有被改写。其中反运算是指与运算对应的相反的运算,如对原始数据加1,则其反运算为减1。在一个实施例中,运算和反运算都为对数据进行取反。本实施例中,运算和反运算都为对数据进行取反,取反运算的反运算就是取反运算本身,简单方便。在一个实施例中,备用块区还保存了页面擦写次数记录表,页面擦写次数记录表中保存了页面的序号和所对应的擦写次数,所述方法还包括:获取页面擦写次数记录表,根据页面擦写次数记录表,判断NVM的块中是否存在超过最大擦写次数的页面,如果是,则判定所述块为坏块,否则判定所述块为好块。本实施例中,最大擦写次数是所选用的NVM的设计手册中规定的值。如果NVM的块中存在超过最大擦写次数的页面,则此页面己失效不可用,则此块为坏块,否则NVM的块中不存在超过最大擦写次数的页面,说明NVM的块中各个页面都可用,则此块为好坏。通过页面擦写次数记录表也可以识别坏块,进一步的保证了数据的可靠性和完整性。。在一个实施例中,所述方法还包括:S1:获取数据写入请求;S2:将数据到NVM内存中,将所述数据进行ECC校验生成写入校验和;S3:从所述数据写入的位置读取所述数据,将读取出的数据进行ECC校验生成读取校验和;S4:将所述写入校验和以及读取校验和进行异或运算,得到运算结果;S5:如果运算结果为0,则所述数据正确,否则重复执行预设次数步骤S2-S4,当每次执行完步骤S2-S4得到的运算结果都不为0时,判定所述数据出错,并根据所述运算结果进行数据纠错。本实施例中,ECC校验是指对数据块进行奇偶检验生成ECC校验和的过程。奇偶检验是指分别对数据块的行、列进行校验生成行校验值和列校验值的过程。当写入数据的时候进行ECC校验生成一个写入校验和,当重新读取所述写入的数据时进行ECC校验生成一个读取校验和,将写入校验和以及读取校验和按位进行异或运算,如果为0,则所述数据正确。否则,为了避免误判,根据预设次数,重复执行步骤S2-S4,得到的运算结果都不为0时,判定所述数据出错。优选的,预设次数为1,则再执行一次步骤S2-S4,如果结果为0,则判定所述数据正确,如果不为0,则判定所述数据出错,并根据所述运算结果进行数据纠错。只有符合条件的运算结果才能进行纠错,其它的情况则表示出现了不可纠正的错误。在一个实施例中,如图6所示,所述将所述数据进行ECC校验生成写入校验和以及将读取出的数据进行ECC校验生成读取校验和的步骤中对数据进行ECC校验的过程包括:步骤S410,判断需要进行ECC校验的数据是否满足预设字节,如果不满足,则进入步骤S420,否则进入步骤S430。本实施例中,以预设字节为单位对数据进行ECC校验,优选的,预设字节为256字节。步骤S420,将数据进行拆分和补齐生成预设字节的数据。本实施例中,如果数据长度小于预设字节,则直接添加预设数据补齐成预设字节的数据。如在后添加0使数据长度达到预设字节。如果数据长度大于预设字节,则进行拆分和补齐生成多个预设字节的数据。步骤S430,对预设字节的数据进行行校验和列校验,得到行校验值和列校验值。本实施例中,通过对数据的指定行进行异或运算进行行校验,得到行校验值,通过对数据的指定列进行异或运算进行列校验,得到列校验值。对每个待校验的Bit(比特)位求异或,若结果为0,则表明待校验的数据含有偶数个1;若结果为1,则表明待校验的数据含有奇数个1。优先的,每256字节原始数据生成16Bit的行校验值6Bit的列校验值。具体的,256字节数据形成256行、8列的矩阵,矩阵每个元素表示一个Bit位。如表1所示,Byte0~Byte255表示256字节数据,Bit0~Bit7表示每个字节有8bit。表1行校验的规则具体是:用指定行的数据进行异或得到16个Bit的数据,这16个bit位用RP0~RP15表示,代表行极性。RP0表示第0、2、4、6、…252、254个字节的极性,即处理1个Byte,跳过1个Byte。RP1表示第1、3、5、7…253、255个字节的极性,即跳过1个Byte,处理1个Byte。RP2表示第0、1、4、5、8、9…252、253个字节的极性,即处理2个Byte,跳过2个Byte。RP3表示第2、3、6、7、10、11…254、255个字节的极性,即跳过2个Byte,处理2个Byte。RP4表示处理4个Byte,跳过4个Byte。RP5表示跳过4个Byte,处理4个Byte。RP6表示处理8个Byte,跳过8个Byte。RP7表示跳过8个Byte,处理8个Byte。RP8表示处理16个Byte,跳过16个Byte。RP9表示跳过16个Byte,处理16个Byte。RP10表示处理32个Byte,跳过32个Byte。RP11表示跳过32个Byte,处理32个Byte。RP12表示处理64个Byte,跳过64个Byte。RP13表示跳过64个Byte,处理64个Byte。RP14表示处理128个Byte,跳过128个Byte。RP15表示跳过128个Byte,处理128个Byte。用公式表示就是:RP0=Byte0^Byte2^Byte4^Byte6…^Byte252^Byte254,表示第0行的8个Bit位跟第2行8个Bit位异或后,再跟第4行的8个Bit位异或,以此类推,直到跟254行的8个Bit位异或得到RP0,RP0就是128行,即128*8=1024个Bit位求异或的结果。以此类推,RP0~RP15每个Bit位都是128个字节(也就是128行)即128*8=1024个Bit位求异或的结果。表2如表2所示,列校验的规则具体是:用指定列的数据进行异或得到6个Bit的数据,这6个Bit位用CP0~CP5表示,代表列极性。CP0表示第0、2、4、6列的极性,CP1表示第1、3、5、7列的极性。CP2表示第0、1、4、5列的极性,CP3表示第2、3、6、7列的极性。CP4表示第0、1、2、3列的极性,CP5表示第4、5、6、7列的极性。用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6,表示第0列的256个Bit位跟第2列的256个Bit位异或之后,再跟第4列的256个Bit位异或、再跟第6列的256个Bit位异或得到CP0,CP0其实是256*4=1024个Bit位异或的结果。CP1~CP5依此类推。步骤S440,将行校验值和列校验值顺序存储并补齐生成预设字节的校验和。本实施例中,预设字节根据行校验值和列校验值的bit数进行调整,补齐生成整数字节的校验和。如行校验值为16bit、列校验值为6bit时,使用3个字节存放校验结果,进行顺序存储后如表3所示,并将多余的两个Bit位置1。表3ECCBit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0Byte0RP7RP6RP5RP4RP3RP2RP1RP0Byte1RP15RP14RP13RP12RP11RP10RP9RP8Byte2CP5CP4CP3CP2CP1CP011在一个实施例中,如图7所示,根据所述运算结果进行数据纠错的步骤包括:步骤S510,判断运算结果的比特位是否存在预设数目的1,如果是则进入步骤S520,否则数据不可纠错。本实施例中,先判断运算结果的比特位是否存在预设数目的1,其中预设数目会根据行校验值和列校验值的bit位数进行调整,为行校验值和列校验值的总bit位数的一半。如行校验值为16bit、列校验值为6bit时,总bit位数为22,则预设数目为11。如果运算结果的比特位存在预设数目的1,则判定为数据可纠错,进入步骤S520,否则数据不可纠错。步骤S520,根据所述运算结果确定出错的行地址和列地址。本实施例中,抽取行极性对应的运算结果的每个字节的奇数bit位的值并按照从低bit位到高bit位的顺序存储,得到的值就是出错数据的行地址。抽取列极性对应的运算结果的字节的Bit7,Bit5,Bit3作为的低三bit位,其余位置0,表示出错数据的列地址。比如对256字节的数据进行ECC校验生成的校验和经过运算后的结果为3字节,保存在s0,s1,s2中,如果s0,s1,s2中共有11个Bit位为1,则表示数据出现了一个比特位的错误,可以纠错。定位出错的比特位的方法是,先确定行地址(即哪个字节出错),再确定列地址(即该字节中的哪一个Bit位出错)。确定行地址的方法是,抽取s1中的Bit7,Bit5,Bit3,Bit1,作为高四位,抽取s0中的Bit7,Bit5,Bit3,Bit1作为低四位,则高四位、低四位组成的值就表示出错字节的行地址(范围为0~255)。确定列地址的方法是:用一个字节表示列地址,抽取s2中的Bit7,Bit5,Bit3作为低三位,其余位置0,则这个字节的值表示出错比特位的列地址(范围为0~7)。步骤S530,根据所述行地址和列地址获取出错数据,将所述出错数据进行取反运算得到正确数据。本实施例中,根据行地址和列地址确定出错数据的位置,获取出错数据,将出错数据进行取反运算得到正确数据。如行地址是10,列地址是5,则代表表2中Byte10,Bit5所在位置的数据出错,将出错数据进行取反运算得到正确数据。在一个实施例中,如图8所示,提供了一种基于异构混合内存的NVM坏块识别处理及纠错系统,包括:检测模块610,用于在自检过程中,检测NVM的块中的每个地址单元中的数据。判定模块620,用于如果块中任一地址单元中的数据,对读取的数据运算后得到的数据与将运算后得到的数据写入地址单元后再次读取得到的数据不相同,则判定块为坏块。判定模块620还用于如果块中所有地址单元中的数据,对读取的数据运算后得到的数据与将运算后得到的数据写入地址单元后再次读取得到的数据都相同,则判定块为好块。在一个实施例中,如图9所示,检测模块610包括:第一数据获取单元611,用于将NVM的块的起始地址单元作为当前地址单元,读取当前地址单元的数据,得到第一读取数据,将第一读取数据进行运算,得到第一运算数据。第二数据获取单元612,用于将第一运算数据写入当前地址单元,读取第一运算数据得到第二读取数据。处理单元613,用于判断第二读取数据与第一运算数据是否相同,如果不同,则块为坏块;如果相同,则进一步判断当前地址单元是否为NVM的块的结束地址单元,如果是,则块为好块,否则将下一个地址单元作为当前地址单元,返回第一数据获取模块进入读取当前地址单元的数据的步骤。在另一个实施例中,所述NVM包含数据存储区和备用块区,备用块区中保存了用于记录NVM的块状态的状态表和用于记录坏块和好块的替换关系的映射表,在上述实施例的基础上,如图10所示,还包括:块处理模块630,用于如果所述块为好块,则在状态表和映射表中与所述块对应的位置标记为好块。所述块处理模块630还用于如果块为坏块,则在状态表中与块对应的位置标记为坏块。所述块处理模块630还用于如果坏块为数据存储区或备用块区用作替换块的块,则获取备用块区的好块,将所述备用块区的好块作为坏块的替换块,在映射表中与所述坏块对应的位置保存好块的位置信息,在映射表中与好块对应的位置保存坏块的位置信息,如果坏块为备用块区用作替换块的块,还需要在映射表中与坏块对应的位置标记为不可用作替换块。所述块处理模块630还用于如果坏块为备用块区没有用作替换块的块,则在映射表中与坏块对应的位置标记为不可用作替换块。在一个实施例中,所述处理单元613还用于将第一运算数据再次写入当前地址单元,再次读取第一运算数据,得到第三读取数据,判断第三读取数据与第一运算数据是否相同,如果不同,则块为坏块,如果相同,则再进入进一步判断所述当前地址单元是否为NVM的块的结束地址单元的步骤。在一个实施例中,所述处理单元613还用于在判断第二读取数据与第一运算数据是否相同,如果相同之后,将第二读取数据反运算后存入当前地址单元;还用于在判断第三读取数据与第一运算数据是否相同,如果相同之后,将第三读取数据反运算后存入所述当前地址单元。在一个实施例中,运算和反运算都为对数据进行取反。在又一个实施例中,备用块区还保存了页面擦写次数记录表,页面擦写次数记录表中保存了页面的序号和所对应的擦写次数,如图11所示,所述系统还包括:记录表判定模块640,用于获取页面擦写次数记录表,根据页面擦写次数记录表,判断NVM的块中是否存在超过最大擦写次数的页面,如果是,则判定块为坏块,否则判定块为好块。在再一个实施例中,如图12所示,所述系统还包括:纠错模块650,用于执行:S1:获取数据写入请求;S2:将数据到NVM内存中,将数据进行ECC校验生成写入校验和;S3:从数据写入的位置读取数据,将读取出的数据进行ECC校验生成读取校验和;S4:将写入校验和以及读取校验和进行异或运算,得到运算结果;S5:如果运算结果为0,则数据正确,否则重复执行预设次数S2-S4,当每次执行完S2-S4得到的运算结果都不为0时,判定数据出错,并根据运算结果进行数据纠错。在一个实施例中,所述纠错模块650对数据进行ECC校验具体是判断需要进行ECC校验的数据是否满足预设字节,如果不满足则将数据进行拆分和补齐生成预设字节的数据,对预设字节的数据进行行校验和列校验,得到行校验值和列校验值,将行校验值和列校验值顺序存储并补齐生成预设字节的校验和。在一个实施例中,所述纠错模块650还用于判断运算结果的比特位是否存在预设数目的1,如果是则判定为数据可纠错,否则判定为数据不可纠错,如果数据可纠错,则根据运算结果确定出错的行地址和列地址,根据行地址和列地址获取出错数据,将出错数据进行取反运算得到正确数据。以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1