内存块有效性检测方法

文档序号:6371536阅读:283来源:国知局
专利名称:内存块有效性检测方法
内存块有效性检测方法
技术领域
本发明涉及一种内存块有效性检测方法,尤其是涉及嵌入式系统中内存块的有效性检测方法。
背景技术
针对内存块有效性的检测的方法,例如,内存访问越界的检测方法,现有技术中的解决方案,往往是在内存管理系统中通过扩展内存块组织结构,在访问时设置各类标记,并且经过特殊的中间接口进行。在检测过程中,通过检查扩展的内存块结构标记,判断内存是否发生越界。对于嵌入式系统而言,内存资源是非常宝贵的,通过扩展内存块组织结构,设置各·类标记,可以一定程度上检测出访问越界的情况,但是必然会增加内存资源的附加消耗,而且随着内存块的增加,消耗的程度更加明显,这将导致实际可用的内存大小被削减。如公开号CN 100487658C,
公开日为2009年5月13日的中国专利还揭示了一种内存访问越界的检测方法,该检测方法的主要步骤是在应用程序所申请内存块的前端增加申请该内存块的调用代码地址信息,尾端增加保护字和空闲区长度信息,同时,在空闲区填充保护标记,当应用程序释放内存时,检测是否存在内存写入越界,并提示相关的异常信息。该检测方法设置了保护标记,增加内存资源的附加消耗,而且随着内存块的增加,消耗的程度更加明显,这将导致实际可用的内存大小被削减。

发明内容本发明需解决的技术问题是克服上述的不足,在不需要增加任何标记而消耗额外内存的条件下,提供一种能方便地检测出内存管理系统中出现的内存坏块,并提示坏块位置及信息的内存块有效性检测方法。为解决上述的技术问题,本发明设计了一种内存块有效性检测方法,其包括如下步骤stepl :获取内存管理系统中内存池的起始地址及结束地址,从而确定内存管理系统的范围;step2 :检索内存管理系统中的空闲内存块AVL树,收集所有空闲内存块的信息,以数组形式存储,并按照内存块地址进行由低到高排序;st印3 :判断是否存在空闲块,如果是存在空闲块,执行step4,如果不存在空闲块,则检测完成;Step4 :检测当前空闲块的有效性step4. I :如果不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3,即,重复判断是否还存在空闲块,如果还存在空闲块,重复检测该空闲块的有效性;如果不存在空闲块,则检测完成;step4. 2 :如果能通过有效性检测,则检测下一个内存块的有效性,如果能通过有效性检测,则执行step5,如果不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复st印3 ;step5 :判断再下一个内存块是否为空闲块,如果是空闲块,重复step4 ;如果不是空闲块,则判断是否为最后一个分配块,如果是最后一个分配块,则检测完成,如果不是最后一个分配块,则执行step6 ;step6 :检测该分配块的有效性,如果该分配块能通过有效性检测,则重复step5 ;如果该分配块不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3。本发明检测内存块管理系统中各个内存块的有效性时,自第一个空闲块开始,依序向后检测各个空闲块的有效性。这样可以检测出更多的坏块。在上述检测内存块的有效性时,所采用的方法包括(I)、内存块地址是否对齐,·如果不对齐,则该内存块为坏块,如果对齐,则该内存块有效。(2)、检测内存块地址是否超过内存系统的管理范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。(3 )、检测内存块的大小是否对齐(什么大小?空气大小、与谁对齐?),如果对齐,则该内存块为坏块,如果不对齐,则该内存块有效。(4)、检测内存块的大小是否超出内存系统管理的范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。(5 )、检测内存块的前后块地址是否超出内存系统管理的范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。作为本发明进一步改进,执行step4. 2时,在检测下一个内存块的有效性之前,检查该下一个内存块是否连续,若不连续,则说明该下一个内存块的头部信息被破坏,则为坏块,提示该坏块的位置以及其详细信息,不再进行有效性检测;如果连续,再继续进行有效性检测。作为本发明进一步改进,在执行step6时,检测该分配块的有效性之前,也先检查该分配块是否连续,若不连续,则说明该分配块的头部信息被破坏,则为坏块,提示该坏块的位置以及其详细信息,不再进行有效性检测;如果连续,再继续进行有效性检测。在有效性检测之前,先检测是否连续,即可马上判断出是否是坏块,节省程序和时间。与现有技术相比,本发明在不扩展内存块现有组织结构以及不需要增加任何标记消耗额外内存的基础上,能有效地检测出内存管理系统中出现的内存坏块,并提示坏块位置及信息,以方便开发人员定位解决出现坏块的原因。

图I是本发明实施例内存管理系统中内存块结构示意图;图2是本发明实施例内存管理系统中各个内存块维护的内存信息示意图;图3是本发明实施例内存块有效性检测方法的流程图。
具体实施方式下面结合附图和实施方式对本发明作进一步说明。本发明内存块有效性检测方法用于检测嵌入式系统中内存块的有效性,在嵌入式系统中植入该内存块有效性检测方法机制,从而检测出嵌入式系统内存中出现的坏块,该坏块可能是内存块访问越界产生的,也有可能是直接内存指针访问破坏了内存块的头部信息造成的。在发现坏块时,提示坏块的位置及坏块的具体信息。在内存管理系统中存在两种类型的内存块,包括:ALL0C块和FREE块。ALLOC块为被使用、已被分配的内存块,在本文中简称分配块;FREE块为空闲内存块,在本文中简称空闲块。如图I所示,为本发明的一种实施例,内存管理系统中ALLOC块和FREE块的示意图。ALLOC块和FREE块交替存在,并且,不存在两个或两个以上的FREE块相邻,所以,FREE块后面相邻的空闲块一定为ALLOC块。并且,最后一个内存块为ALLOC块。如图2所示,每个内存块(即ALLOC块和FREE)都具有同样的结构,即包括头部信息和用户数据。头部信息中包含了前一个内存块的大小及本内存块的大小和FREE标记(空闲标记)等其他信息,通过这些信息可以获得相邻的前一个内存块及后一个内存块的位置。·本发明内存块有效性检测方法从第一个空闲内存块开始,向其后逐个检查每个内存块的有效性,直到发现坏块,再到达下一个空闲块的位置,自该空闲块开始检测,向其后逐个检查每个内存块的有效性,直到发现坏块,再到达下一个空闲块的位置,循序检测,至无空闲块或最后一个ALLOC块,检测完成,这样可以检测出更多的坏块。如图3所示,内存块有效性检测方法包括的步骤如下stepl :获取内存管理系统中内存池的起始地址及结束地址,从而确定内存管理系统的范围,为开始做准备;step2 :检索内存管理系统中的空闲内存块AVL树(自平衡二叉查找树),收集所有空闲内存块的信息,以数组形式存储,并按照内存块地址进行由低到高排序,从而获取空闲块链表;step3 :判断是否存在空闲块,如果是存在空闲块,就检测当前空闲块的有效性,即执行下一个步骤step4,如果不存在空闲块,则检测完成。此处判断程序的目的是判断如果内存管理系统中已不存在空闲块,则检测完成;反之,则继续检测。step4 :检测当前空闲块的有效性,在本发明的实施方式,自第一个空闲块开始,依序向后检测各个空闲块的有效性检测当前空闲块的有效性时,存在两种情况第一种情况(即step4. I):如果当前空闲块不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3,即,重复判断是否还存在空闲块,如果还存在空闲块,重复检测该空闲块的有效性;如果不存在空闲块,则检测完成。换句话说,如果第一个空闲块或第N个空闲块(N代表自然数)为坏块,则检测程序跳到下一个空闲块,即获取下一个空闲块,如果后面不再存在空闲块,则检测完成;如果还存在空闲块,则继续检测当前空闲块的有效性,循序检测。第二种情况(st印4. 2):如果当前空闲块能通过有效性检测,则检测下一个内存块的有效性,如果能通过有效性检测,则判断再下一个内存块是否为空闲块,执行step5,如果不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3。换句话说,如果第一个空闲块或第N个空闲块(N代表自然数)通过有效性检测,则不是坏块,则检测第一个空闲块或第N个空闲块后面的ALLOC块,检测第一个空闲块或第N个空闲块后面的ALLOC块可能是I个、2个或3个或N个。如果后面的ALLOC块出现坏块,则检测程序跳到下一个空闲块,即获取下一个空闲块,如果后面不再存在空闲块,则检测完成;如果还存在空闲块,则继续检测当前空闲块的有效性,循序检测。如果第一个空闲块或第N个空闲块的下一个内存块(即为ALLOC块)通过有效性检测,不是坏块,则获取再下一个内存块,该内存块可能是空闲块,也可能亦是ALLOC块,后面则根据step5来执行。st印5 :判断再下一个内存块是否为空闲块,如果是空闲块,重复step4 ;如果不是空闲块,则判断是否为最后一个分配块,如果是最后一个分配块,则检测完成,如果不是最后一个分配块,则执行step6。step6 :检测该分配块的有效性,如果该分配块能通过有效性检测,则重复step5 ;如果该分配块不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3。在本发明的实施方式中,检测内存块的有效性所采用的方法包括(I)、内存块地址是否对齐,如果不对齐,则该内存块为坏块,如果对齐,则该内存块有效。(2)、检测内存块地址是否超过内存系统的管理范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。(3)、检测内存块的大小是否对齐(什么大小?空气大小、与谁对齐?),如果对齐,则该内存块为坏块,如果不对齐,则该内存块有效。(4 )、检测内存块的大小是否超出内存系统管理的范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。(5 )、检测内存块的前后块地址是否超出内存系统管理的范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。在检测时,上述5种方法应当全部检测,只要其中I种方法检测出坏块,则不再检测其他的方法。检测空闲块后面的下一个空闲块或再下一个空闲块的有效性时,在采用上述5种方法之前,先检查该下一个空闲块是否连续,(连续是指下一个内存块的上一个块是否为当前块),若不连续,则说明该下一个内存块的头部信息被破坏,则为坏块,提示该坏块的位置以及其详细信息,不再进行上述5种方法的有效性检测;如果连续,再继续进行述5种方法的有效性检测。本发明在不扩展内存块现有组织结构以及不需要增加任何标记消耗额外内存的基础上,能有效地检测出内存管理系统中出现的内存坏块,并提示坏块位置及信息,以方便开发人员定位解决出现坏块的原因。 以上所述的仅是本发明的实施方式,在此应当指出,对于本领域的普通技术人员来说,在不脱离本发明创造构思的前提下,还可以做出改进,但这些均属于本发明的保护范围。
权利要求
1.一种内存块有效性检测方法,其特征在于所述内存块有效性检测方法包括如下步骤 stepl :获取内存管理系统中内存池的起始地址及结束地址,从而确定内存管理系统的范围; step2 :检索内存管理系统中的空闲内存块AVL树,收集所有空闲内存块的信息,以数组形式存储,并按照内存块地址进行由低到高排序; step3 :判断是否存在空闲块,如果是存在空闲块,执行step4,如果不存在空闲块,则检测完成; step4 :检测当前空闲块的有效性 step4. I :如果不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3,即,重复判断是否还存在空闲块,如果还存在空闲块,重复检测该空闲块的有效性;如果不存在空闲块,则检测完成; step4. 2 :如果能通过有效性检测,则检测下一个内存块的有效性,如果能通过有效性检测,则执行step5,如果不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复St印3 ; step5 :判断再下一个内存块是否为空闲块,如果是空闲块,重复step4 ;如果不是空闲块,则判断是否为最后一个分配块,如果是最后一个分配块,则检测完成,如果不是最后一个分配块,则执行step6 ; step6 :检测该分配块的有效性,如果该分配块能通过有效性检测,则重复step5 ;如果该分配块不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块并重复step3。
2.根据权利要求I所述的内存块有效性检测方法,其特征在于自第一个空闲块开始,依序向后检测各个空闲块的有效性。
3.根据权利要求I所述的内存块有效性检测方法,其特征在于检测内存块的有效性的方法是检测内存块地址是否对齐,如果不对齐,则该内存块为坏块,如果对齐,则该内存块有效。
4.根据权利要求I所述的内存块有效性检测方法,其特征在于检测内存块的有效性的方法是检测内存块地址是否超过内存系统的管理范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。
5.根据权利要求I所述的内存块有效性检测方法,其特征在于检测内存块的有效性的方法是检测内存块的大小是否对齐(什么大小?空气大小、与谁对齐?),如果对齐,则该内存块为坏块,如果不对齐,则该内存块有效。
6.根据权利要求I所述的内存块有效性检测方法,其特征在于检测内存块的有效性的方法是检测内存块的大小是否超出内存系统管理的范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。
7.根据权利要求I所述的内存块有效性检测方法,其特征在于检测内存块的有效性的方法是检测内存块的前后块地址是否超出内存系统管理的范围,如果超出,则该内存块为坏块,如果不超出,则该内存块有效。
8.根据权利要求2-7中任意一项所述的内存块有效性检测方法,其特征在于执行step4. 2时,在检测下一个内存块的有效性之前,检查该下一个内存块是否连续,若不连续,则说明该下一个内存块的头部信息被破坏,则为坏块,提示该坏块的位置以及其详细信息,不再进行有效性检测;如果连续,再继续进行有效性检测。
9.根据权利要求8所述的内存块有效性检测方法,其特征在于执行step6时,检测该分配块的有效性之前,检查该分配块是否连续,若不连续,则说明该分配块的头部信息被破坏,则为坏块,提示该坏块的位置以及其详细信息,不再进行有效性检测;如果连续,再继续进行有效性检测。
全文摘要
本发明提供了一种内存块有效性检测方法,主要包括获取内存管理系统中内存池的起始地址及结束地址;检索内存管理系统中的空闲内存块AVL树,收集所有空闲内存块的信息,以数组形式存储,并按照内存块地址进行由低到高排序;判断是否存在空闲块,如果是存在空闲块,检测当前空闲块的有效性,如果不存在空闲块,则检测完成;如果内存块不能通过有效性检测,则作为坏块,提示该坏块的位置以及其详细信息,再获取下一个空闲块循环检测。本发明在不扩展内存块现有组织结构以及不需要增加任何标记消耗额外内存的基础上,能有效地检测出内存管理系统中出现的内存坏块,并提示坏块位置及信息,以方便开发人员定位解决出现坏块的原因。
文档编号G06F12/02GK102789407SQ201210199999
公开日2012年11月21日 申请日期2012年6月18日 优先权日2012年6月18日
发明者周琳, 罗德贵, 车任秋 申请人:上海斐讯数据通信技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1