一种实现高可靠性链表的方法及装置的制作方法

文档序号:6574183阅读:154来源:国知局
专利名称:一种实现高可靠性链表的方法及装置的制作方法
技术领域
本发明涉及数据存储领域,特别涉及一种实现高可靠性链表的方法及装置。
背景技术
存储器(Memory)是电子系统中最常用的部件之一。CPU的运行代码、数据记录都需要保存在存储器中。
在对存储器进行空间管理的方法中,空闲链表(freelist)是一种常用的、简单有效的内存管理方式。其结构如下 链表有一个头指针变量Head,它存放一个地址,该地址指向一个元素。链表中每一个元素称为结点,每个结点都应包括两个部分一为用户需要用的实际数据Data,二为下一个结点的指针Next。因此,head指向第一个元素Data 1;第一个元素Data 1又指向第二个元素Data 2;……;直到最后一个元素Data n,该元素不再指向其它元素,它称为表尾,它的指针部分放一个NULL(表示空指针),链表到此结束。
在上述空闲链表中,如果指针发生错误,会导致对存储器内存混乱,甚至系统崩溃。为了避免上述问题,会在分配内存和释放内存时对空闲链表进行维护,现有技术采用以下两种方式1.增加奇偶校验。该方法就是利用计算数据的各个比特之和的奇偶性来检验数据的正确性。其优点是实现比较简便,一般CPU都带有该功能。但其只能检测出单比特的错误,且不能纠错。该方法在对可靠性要求不太高的情况下可使用。
2.增加ECC(Error Check and Correct,错误检查和纠正)校验。该方法是目前采用最为广泛、而且效果最好的方法。在服务器等对可靠性要求很高的应用场合,都采用了ECC功能模块。和奇偶校验技术一样,ECC纠错技术也需要额外的空间来储存校正码,但其占用的位数跟数据的长度并非成线性关系。具体来说,它是以8位数据、5位ECC码为基准,随后每增加一个8位数据只需另增加一位ECC码即可。例如,一个8位的数据产生的ECC码要占用5位的空间,而一个16位数据ECC码只需在原来基础上再增加一位,也就是6位;而32位的数据则只需再在原来基础增加一位,即7位的ECC码即可,如此类推。
每一次数据写入内存的时候,ECC码使用一种特殊的算法对数据进行计算,其结果称为校验位(check bits)。然后将所有校验位加在一起的和是校验和(checksum),校验和与数据一起存放。当这些数据从内存中读出时,采用同一算法再次计算校验和,并和前面的计算结果相比较,如果结果相同,说明数据是正确的,反之说明有错误,ECC可以从逻辑上分离错误并通知系统。
参见图1,为ECC原理图。
1.增加一片8比特的DRAM作为校验字的存储空间。
2.CPU数据写入DRAM时,ECC采用确定的算法计算出数据的校验值,和原始的数据一起写入内存。数据写入主存,校验比特写入校验存储器。
3.CPU读取数据时,相应的数据和其校验字被ECC读回,ECC根据数据算出校验字和回读的校验字比较,如果校验字相同才被写入CPU,如果不同启动纠错算法,将错误比特纠正后再写入CPU。
ECC校验能纠正所有单比特错误,同时发现2比特的错误,部分发现2比特以上错误,因而只能纠正单比特错误。在纠错的情况下,要增加额外的一个时钟,还需要增加额外的校验存储器,这样增加一定的成本。

发明内容
为了解决现有技术中对空闲链表维护时只能纠正单比特错误,并且纠错成本高的问题,本发明实施例提供了一种实现高可靠性链表的方法及装置。所述技术方案如下一种实现高可靠性链表的方法,在每个内存块增加备份指针及备份指针的校验信息,所述方法包括以下步骤获取头指针所指内存块的指针、指针的校验信息、备份指针、备份指针的校验信息;判断所述指针和所述备份指针是否相等,如果不相等,则判断所述指针的校验信息和所述备份指针的校验信息是否相等,如果所述指针的校验信息和所述备份指针的校验信息相等,则验证所述指针是否正确,如果所述指针不正确,则将所述指针的值赋为所述备份指针的值。
本发明实施例还提供了一种实现高可靠性链表的装置,在每个内存块增加备份指针及备份指针的校验信息,所述装置包括指针信息获取模块、判断模块、验证模块和指针维护模块;所述指针信息获取模块用于获取头指针所指内存块的指针、备份指针及指针的校验信息、备份指针的校验信息并发送给所述判断模块;所述判断模块用于获取所述指针信息获取模块发送的指针、备份指针及指针的校验信息、备份指针的校验信息,判断所述指针和所述备份指针是否相等,如果不相等,则判断所述指针的校验信息和所述备份指针的校验信息是否相等,如果所述指针的校验信息和所述备份指针的校验信息相等,则向所述验证模块发送验证请求;所述验证模块用于接收所述判断模块发送的验证请求后,验证所述指针是否正确,并将验证结果发送给所述指针维护模块;所述指针维护模块用于接收所述验证模块发送的验证结果,如果所述指针不正确,则将所述指针的值赋为所述备份指针的值。
本发明实施例所述的技术方案带来的有益效果是通过本发明实施例提供的一种实现高可靠性链表的方法及装置,采用本发明实施例所述的技术方案,能够纠正多比特错误,使链表具有高可靠性,提高了系统的可靠性和可用性。并且不需要增加时钟和额外校验存储器,节约了成本。


图1是现有技术中ECC原理图;图2是本发明实施例1所述实现高可靠性链表方法中分配内存块之前对freelist维护过程流程图;图3是本发明实施例1所述实现高可靠性链表方法中在释放内存时对freelist的维护过程流程图;图4是本发明实施例2所述实现高可靠性链表装置的结构图;图5是本发明实施例3所述实现高可靠性链表装置的结构图。
具体实施例方式
下面结合附图和具体实施例对本发明作进一步说明,但本发明不局限于以下实施例。
本发明实施例主要采用指针备份的方法来实现对freelist链表的维护,即在每个内存块的尾部(也可以是其它部位)增加备份指针及备份指针的校验信息。
以网络处理器Rainier下的存储器Z0(36比特)的Freelist保护为例,参见表1,32比特用以存放指针NextPtr,该指针指向下一个内存块。采用用户选择的算法计算指针校验信息Parity保存在4比特的内存中。该算法可以是奇偶校验算法、ECC校验算法或其它任何一种校验算法。备份指针Backup NextPtr及备份指针校验信息Backup Parity则是对指针及指针校验信息的备份。在正常情况下,指针等于备份指针,而且指针校验信息和备份指针校验信息也相等。

表1实施例1参见图2,从freelist中分配内存块之前,对freelist维护过程如下步骤101获取freelist中内存块的数量。
步骤102判断freelist中内存块数量是否大于1,如果大于1,说明有内存块需要维护,则执行步骤103;如果不大于1,则说明存在两种情况,一种是内存块数量为0,无需维护,另一种是只有一个内存块,该内存块的指针为空,不存在指向下一个内存块的指针,也无需维护,则返回,在需要释放内存块的时候可以释放该内存块。
步骤103获取freelist中的头指针。
步骤104判断头指针是否为本freelist的地址,如果不是说明该头指针不是本freelist的有效头指针,无需维护,则返回;如果是,则继续执行步骤105。
步骤105获取头指针所指内存块的指针及该指针的校验值。
步骤106获取头指针所指内存块的备份指针及备份指针的校验值。
步骤107判断头指针所指内存块的指针是否等于备份指针。如果相等,说明指针正确,不需要维护,则返回,在需要释放内存块的时候可以释放该内存块。如果不相等,说明指针可能错误,需要进一步判断,执行步骤108。
步骤108判断指针的校验信息和备份指针的校验信息是否相等。如果不相等,说明指针和备份指针中有一个是错误的,而指针的校验信息和备份指针的校验信息中也有一个是错误的,这时,我们认为内存已经不可信,不做处理,则返回;如果相等,说明指针的校验信息和备份指针的校验信息都正确,可以根据这两个校验信息判断是否指针错误,执行步骤109。
步骤109计算备份指针的校验信息。
步骤110将步骤109中计算出来的备份指针的校验信息与内存中保存的备份指针的校验信息相比较,如果不相等,说明指针正确,备份指针错误,不需要维护,则返回,在需要释放内存块的时候可以释放该内存块。如果相等,说明指针错误,备份指针正确,需要维护,执行步骤111。
步骤111将指针值赋值为备份指针的值,并返回,在需要释放内存块的时候可以释放该内存块。
本发明实施例中,备份指针和指针出错有四种情况1、备份指针正确 指针正确;2、备份指针正确 指针错误;3、备份指针错误 指针正确;4、备份指针错误 指针错误。
本发明对于情况1、2、3都是有效的,可以进行维护。对于情况4我们认为内存已经不可信,只能重新进行设备初始化操作了。指针发生错误而无法校正(备份指针也错误)的概率(假设单比特错误的概率是A=0.001)如下指针有1比特错误而无法校正的概率A*(1-A)^31*32*[32*A*(1-A)^31+(32*31)/2*A^2*(1-A)^30+(32*31*30)/(2*3)*A^3*(1-A)^29+......+A^32]=0.001;指针有2比特错误而无法校正的概率A^2*(1-A)^30*(32*31)/2*[32*A*(1-A)^31+(32*31)/2*A^2*(1-A)^30+(32*31*30)/(2*3)*A^3*(1-A)^29+......+A^32]=0.00002;也就是说,指针发生错误而无法校正(备份指针也错误)的概率大约为0.001+0.00002=0.00102;在内存块使用完毕后,需要把该内存释放回freelist中,在释放内存时也需要对freelist进行维护。
本实施例所述技术方案在释放内存之前,需要判断freelist中是否还有内存块,如果有内存块,则在释放内存块以后需要更新freelist倒数第二个(也即释放之前的最后一个)内存块指针的校验值、备份指针及备份指针的校验值。如果没有内存块,将该内存块释放到freelist中,由于释放内存块之后freelist中只有一个内存块,不需要更新上述信息。
参见图3,本发明实施例在释放内存时对freelist的维护过程如下步骤201获取freelist中内存块的数量。
步骤202判断freelist中内存块的数量是否为零,如果freelist中内存块的数量为零,说明freelist中没有内存块,则将变量pTail赋值为0xFFFF,执行步骤206。如果freelist中内存块的数量不为零,说明freelist中有内存块,需要进行维护,执行步骤203。
步骤203获取freelist中最后一个内存块的指针NxtPtr的地址FL_tail。
步骤204判断FL_tail是否为freelist地址,若是则执行步骤205,若不是则pTail赋值为0xFFFF,执行步骤206。
步骤205把FL_tail赋值给变量pTail,执行步骤206。
步骤206释放内存。把释放的内存块挂到freelist的尾部,将释放之前的最后一个内存块的指针值NxtPtr更新为被释放的内存块的地址。
步骤207判断pTail是否为0xFFFF,如果是,说明freelist中没有内存块或FL_tail不是本freelist地址,无需对freelist进行维护,则返回。如果不是,需要更新freelist倒数第二个(也即释放之前的最后一个)内存块的指针的校验值、备份指针及备份指针的校验值,执行步骤208。
步骤208读取pTail的内容NxtPtr,也就是获取释放之前空闲链表中的最后一个内存块的指针。
步骤209计算指针的校验信息。
步骤210把指针的校验信息写到内存块校验信息区,即更新所述指针的校验信息。
步骤211把指针和指针的校验信息分别写到内存块备份指针和备份指针的校验信息区,并返回。即把所述释放之前空闲链表中的最后一个内存块的备份指针和备份指针的校验信息更新为所述指针和指针的校验信息。
实施例2参见图4,本发明还提供了一种实现高可靠性链表的装置,在每个内存块的尾部或其它部位增加备份指针及备份指针的校验信息,该装置包括指针信息获取模块301、判断模块302、验证模块303和指针维护模块304;指针信息获取模块301用于获取头指针所指内存块的指针、指针的校验信息、备份指针、备份指针的校验信息并发送给判断模块302;判断模块302用于获取所述指针信息获取模块301发送的指针、指针的校验信息、备份指针、备份指针的校验信息,判断所述指针和所述备份指针是否相等,如果相等,则分配所述内存块,如果不相等,则判断所述指针的校验信息和所述备份指针的校验信息是否相等,如果所述指针的校验信息和所述备份指针的校验信息相等,则向验证模块303发送验证请求;验证模块303用于接收判断模块302发送的验证请求后,验证所述指针是否正确,并将验证结果发送给指针维护模块304;其中,验证模块303具体包括校验信息计算单元303a和校验信息验证单元303b。
校验信息计算单元303a用于计算指针的校验信息,并将所述计算出来的校验信息发送给校验信息验证单元303b;校验信息验证单元303b用于接收所述校验信息验证单元发送的校验信息,判断所述计算出来的指针的校验信息与内存中保存的指针的校验信息是否相等,如果相等,则所述指针正确,如果不相等,则所述指针不正确。
指针维护模块304用于接收所述验证模块发送的验证结果,如果所述指针正确,则分配所述内存块,如果所述指针不正确,则将所述指针的值赋为所述备份指针的值,并分配所述内存块。
本发明实施例所述装置还可以包括更新模块,用于判断空闲链表中是否有内存块,如果有内存块,则在释放内存块之后获取释放之前空闲链表中的最后一个内存块的指针,并计算并更新所述指针的校验信息,把所述释放之前空闲链表中的最后一个内存块的备份指针和备份指针的校验信息更新为所述指针和指针的校验信息。
实施例3参见图5,上述实施例1中,验证模块303也可以具体为备份校验信息计算单元303c和备份校验信息验证单元303d。其它部分同实施例1,不再赘述。
备份校验信息计算单元303c用于计算备份指针的校验信息,并将所述计算出来的校验信息发送给备份校验信息验证单元303d;备份校验信息验证单元303d用于接收所述备份校验信息计算单元发送的校验信息,判断所述计算出来的备份指针的校验信息与内存中保存的备份指针的校验信息是否相等,如果相等,则所述指针不正确,如果不相等,则所述指针正确。
以上实施例中所提供的方案对应的软件可以存储在一个计算机可读取存储介质中,如硬盘、软盘、光盘中。
采用本发明实施例所述的技术方案,能够纠正多比特错误,使链表具有高可靠性,提高了系统的可靠性和可用性。并且不需要增加时钟和额外校验存储器,节约了成本。
以上所述的实施例,只是本发明的一种较优选的具体实施方式
,本领域的技术人员在本发明技术方案范围内进行的通常变化和替换都应包含在本发明的保护范围内。
权利要求
1.一种实现高可靠性链表的方法,其特征在于,在每个内存块增加备份指针及备份指针的校验信息,所述方法包括以下步骤获取头指针所指内存块的指针、指针的校验信息、备份指针、备份指针的校验信息;判断所述指针和所述备份指针是否相等,如果不相等,则判断所述指针的校验信息和所述备份指针的校验信息是否相等,如果所述指针的校验信息和所述备份指针的校验信息相等,则验证所述指针是否正确,如果所述指针不正确,则将所述指针的值赋为所述备份指针的值。
2.如权利要求1所述的一种实现高可靠性链表的方法,其特征在于,所述验证所述指针是否正确的步骤具体包括计算指针的校验信息;判断所述计算出来的指针的校验信息与内存中保存的指针的校验信息是否相等,如果相等,则所述指针正确,如果不相等,则所述指针不正确。
3.如权利要求1所述的一种实现高可靠性链表的方法,其特征在于,所述验证所述指针是否正确的步骤具体包括计算备份指针的校验信息;判断所述计算出来的备份指针的校验信息与内存中保存的备份指针的校验信息是否相等,如果相等,则所述指针不正确,如果不相等,则所述指针正确。
4.如权利要求1-3中任意一项权利要求所述的一种实现高可靠性链表的方法,其特征在于,所述方法还包括以下步骤判断空闲链表中是否有内存块,如果有内存块,则在释放内存块之后获取释放之前空闲链表中的最后一个内存块的指针,计算并更新所述指针的校验信息,把所述释放之前空闲链表中的最后一个内存块的备份指针和备份指针的校验信息更新为所述指针和指针的校验信息。
5.一种实现高可靠性链表的装置,其特征在于,在每个内存块增加备份指针及备份指针的校验信息,所述装置包括指针信息获取模块、判断模块、验证模块和指针维护模块;所述指针信息获取模块用于获取头指针所指内存块的指针、指针的校验信息、备份指针、备份指针的校验信息并发送给所述判断模块;所述判断模块用于获取所述指针信息获取模块发送的指针、指针的校验信息、备份指针、备份指针的校验信息,判断所述指针和所述备份指针是否相等,如果不相等,则判断所述指针的校验信息和所述备份指针的校验信息是否相等,如果所述指针的校验信息和所述备份指针的校验信息相等,则向所述验证模块发送验证请求;所述验证模块用于接收所述判断模块发送的验证请求后,验证所述指针是否正确,并将验证结果发送给所述指针维护模块;所述指针维护模块用于接收所述验证模块发送的验证结果,如果所述指针不正确,则将所述指针的值赋为所述备份指针的值。
6.如权利要求5所述的一种实现高可靠性链表的装置,其特征在于,所述验证模块具体包括校验信息计算单元和校验信息验证单元;所述校验信息计算单元用于计算指针的校验信息,并将所述计算出来的指针的校验信息发送给所述校验信息验证单元;所述校验信息验证单元用于接收所述校验信息计算单元发送的计算出来的指针的校验信息,判断所述计算出来的指针的校验信息与内存中保存的指针的校验信息是否相等,如果相等,则所述指针正确,如果不相等,则所述指针不正确。
7.如权利要求5所述的一种实现高可靠性链表的装置,其特征在于,所述验证模块具体包括备份校验信息计算单元和备份校验信息验证单元;所述备份校验信息计算单元用于计算备份指针的校验信息,并将所述计算出来的备份指针的校验信息发送给所述备份校验信息验证单元;所述备份校验信息验证单元用于接收所述备份校验信息计算单元发送的校验信息,判断所述计算出来的备份指针的校验信息与内存中保存的备份指针的校验信息是否相等,如果相等,则所述指针不正确,如果不相等,则所述指针正确。
8.如权利要求5-7所述的一种实现高可靠性链表的装置,其特征在于,所述装置还包括更新模块,用于判断空闲链表中是否有内存块,如果有内存块,则在释放内存块之后获取释放之前空闲链表中的最后一个内存块的指针,并计算并更新所述指针的校验信息,把所述释放之前空闲链表中的最后一个内存块的备份指针和备份指针的校验信息更新为所述指针和指针的校验信息。
全文摘要
本发明提供了一种实现高可靠性链表的方法及装置,属于数据存储领域。为了解决现有技术中只能纠正链表指针的单比特错误,并且纠错成本高的问题,本发明提供了一种实现高可靠性链表的方法及装置,所述方法包括判断指针和备份指针是否相等,如果不相等,则判断指针的校验信息和备份指针的校验信息是否相等,如果相等,则验证指针是否正确,如果不正确,则将指针的值赋为所述备份指针的值。本发明还提供了一种实现高可靠性链表的装置,所述装置包括指针信息获取模块、判断模块、验证模块和指针维护模块。采用本发明所述方案能够纠正多比特错误,使链表具有高可靠性,提高了系统的可靠性和可用性。并且不需要增加时钟和额外校验存储器,节约了成本。
文档编号G06F17/30GK101030168SQ200710079318
公开日2007年9月5日 申请日期2007年2月15日 优先权日2007年2月15日
发明者张彦军, 郭英辉, 任广涛, 张瑞合, 杨名 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1