一种内存溢出检测方法和系统的制作方法
【技术领域】
[0001]本发明涉及计算机技术领域,尤其涉及一种内存溢出检测方法和系统。
【背景技术】
[0002]高效的内存分配、释放和整理在计算机应用中已越来越重要,内存在使用过程中经常出现内存溢出现象,导致计算机程序异常或者错误,严重时将导致计算机死机,因此内存溢出的检测对计算机系统非常重要。内存溢出是指计算机程序按照指定的大小分配内存区域存储数据后,写入内存的数据超出预先分配的内存区域,从而导致改写了其他内存区域的数据。
[0003]现有技术中,在申请的内存块的头部和末尾追加多个字节的特定标记值,然后在某个特定时机,比如内存释放时,通过主动检测上述特定标记值来判断内存块的使用是否发生溢出,如果检测到的特定标记值发生改变,则可以确定该段内存块的使用发生内存溢出现象。
[0004]在实现本发明过程中,发明人发现现有技术中至少存在如下问题:
[0005]由于程序在运行过程中往往会有大量的内存申请、释放操作,因此大量的特定标记值会占用额外物理内存,而且现有技术的内存溢出检测方法,只有在已经发生内存溢出现象之后进行主动检测时才会发现溢出,不能及时发现内存溢出现象的发生。
【发明内容】
[0006]本发明提供一种内存溢出检测的方法和系统,用以解决现有技术在内存溢出检测过程中存在的占用额外物理内存以及不能及时发现内存溢出现象的问题。
[0007]根据本发明的一个方面,提供了一种内存溢出检测方法,该方法包括:
[0008]在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段;
[0009]若存在任一程序对内存地址空间内的隔离页进行了访问,则判定该程序导致内存溢出。
[0010]可选的,所述检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,所述方法还包括:
[0011]捕获操作系统出现的内存访问异常事件。
[0012]可选的,所述检测是否存在任一程序对内存地址空间内的隔离页进行了访问,包括:
[0013]获取各程序运行过程中的内存访问记录;
[0014]根据所述内存访问记录,判断是否存在任一程序对内存地址空间内的隔离页进行了访问。
[0015]可选的,在检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,所述方法还包括:
[0016]在一程序启动时,确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页;
[0017]将所述当前启动的程序在内存地址空间内分配的内存地址段发送给操作系统,以使所述操作系统根据该内存地址段为当前启动的程序分配内存块;
[0018]所述使用内存地址段位于所述隔离页之前,所述使用内存地址段对应有物理内存。
[0019]可选的,所述确定当前启动的程序在内存地址空间内分配的内存地址段,包括:
[0020]接收所述当前启动的程序的内存分配请求,所述内存分配请求包括预请求分配的内存块的大小;
[0021]根据所述内存分配请求,以及当前操作系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0022]可选的,所述根据所述内存分配请求,以及当前系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段,包括:
[0023]在所述预请求分配的内存块的大小为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小等于所述预请求分配的内存块大小;
[0024]在所述预请求分配的内存块的大小不为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小为所述预请求分配的内存块的大小的向上取整对齐;
[0025]确定所述隔离页的大小为所述内存分配粒度;
[0026]根据所述使用内存地址段的大小和所述隔离页的大小,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0027]可选的,所述方法还包括:
[0028]在所述使用内存地址段对应的物理内存大于所述预请求分配的内存块时,向所述当前启动的程序返回与所述预请求分配的内存块的大小相等的物理内存块,所述物理内存块为从所述使用内存地址段对应的物理内存的高地址端向低地址端选取的连续物理内存块;
[0029]否则,将向所述当前启动的程序返回所述使用内存地址段对应的物理内存。
[0030]根据本发明的另一个方面,提供了一种内存溢出检测系统,该系统包括:
[0031]检测模块,用于在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段;
[0032]判定模块,用于当所述检测模块的检测结果为存在任一程序对内存地址空间内的隔离页进行了访问时,判定该程序导致内存溢出。
[0033]可选的,所述系统还包括:
[0034]捕获模块,用于在所述检测模块检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,捕获操作系统出现的内存访问异常事件。
[0035]可选的,所述检测模块,包括:
[0036]获取单元,用于获取各程序运行过程中的内存访问记录;
[0037]判断单元,用于根据所述获取单元获取的内存访问记录,判断是否存在任一程序对内存地址空间内的隔离页进行了访问。
[0038]可选的,所述系统还包括:
[0039]地址段确定模块,用于在检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,当一程序启动时,确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页;
[0040]发送模块,用于将所述当前启动的程序在内存地址空间内分配的内存地址段发送给操作系统,以使所述操作系统根据该内存地址段为当前启动的程序分配内存块;
[0041]所述使用内存地址段位于所述隔离页之前,所述使用内存地址段对应有物理内存。
[0042]可选的,所述地址段确定模块,包括:
[0043]接收单元,用于接收所述当前启动的程序的内存分配请求,所述内存分配请求包括预请求分配的内存块的大小;
[0044]地址段确定单元,用于根据所述内存分配请求,以及当前操作系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0045]可选的,所述地址段确定单元具体用于:
[0046]在所述预请求分配的内存块的大小为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小等于所述预请求分配的内存块大小;
[0047]在所述预请求分配的内存块的大小不为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小为所述预请求分配的内存块的大小的向上取整对齐;
[0048]确定所述隔离页的大小为所述内存分配粒度;
[0049]根据所述使用内存地址段的大小和所述隔离页的大小,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0050]可选的,所述系统还包括:
[0051]地址返回模块,用于在所述使用内存地址段对应的物理内存大于所述预请求分配的内存块时,向所述当前启动的程序返回与所述预请求分配的内存块的大小相等的物理内存块的内存地址,所述物理内存块为从所述使用内存地址段对应的物理内存的高地址端向低地址端选取的连续物理内存块;否则,将向所述当前启动的程序返回所述使用内存地址段对应的物理内存。
[0052]本发明的有益效果为:
[0053]本发明提供的内存溢出检测方法和系统,通过触发检测的方法,当捕获到内存访问异常事件时,触发内存溢出检测,可以有效检测和防御内存溢出类漏洞攻击手段,而且在软件测试工作中可以更有效的发现潜在的内存溢出问题,进而提高软件质量;
[0054]通过检测是否存在任一程序对预先设置的具有不可访问属性的隔离页进行了访问,判断内存溢出的发生,由于隔离页只占用内存地址空间,不占用物理内存的属性,避免额外物理内存的占用,降低内存消耗,提升系统性能。
【附图说明】
[0055]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0056]图1为本发明实施例提出的一种内存溢出检测方法的流程图;
[0057]图2为本发明另实施例提出的一种内存溢出检测方法的流程图;
[0058]图3为本发明实施例中提出的在内存地址空间内申请8KB的内存地址段的示意图;
[0059]图4为本发明实施例提出的一种内存溢出检测系统的结构框图;
[0060]图5为本发明另实施例提出的一种内存溢出检测系统的结构框图。
【具体实施方式】
[0061]下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
[0062]本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。
[0063]本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非被特定定义,否则不会用理想化或过于正式的含义来解释。
[0064]为了更好的理解本发明的技术方案,首先对技术方案中使用的一些术语进行解释,其中:内存块是指物理内存块;
[0065]内存地址空间是指对物理存储器编码(编码地址)的范围,每一个物理内存块在内存地址空间内分配有对应有的内存地址段,根据内存地址空间对物理存储器完成数据的读写;
[0066]使用内存地址段,为内存地址空间内对应有物理内存的内存地址段,操作系统根据使用内存地址段对完成对应的物理内存的数据的读写;
[0067]隔离页,设置在使用内存地址段的结束地址之后,与使用内存地址段共同组成程序在内存地址空间内分配的内存地址段,只占用内存地址空间的具有不可访问属性的内存地址段,不占用物理内存。
[0068]另外,需要说明的是,以下实施例是以Windows操作系统为例进行说明的,本发明不限定Windows操作系统,对于其他的操作系统本发明的方案也是能够实现的。
[0069]图1示出了本发明实施例的一种内存溢出检测方法的流程图。
[0070]参照图1,本发明实施例提出的内存溢出检测方法包括:
[0071]S11、在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段;
[0072]本发明实施例的步骤Sll中,检测是否存在任一程序对内存地址空间内的隔离页进行了访问,包括:
[0073]获取各程序运行过程中的内存访问记录;
[0074]根据所述内存访问记录,判断是否存在任一程序对内存地址空间内的隔离页进行了访问。
[0075]S12、若存在任一程序对内存地址空间内的隔离页进行了访问,则判定该程序导致内存溢出。
[0076]在实际应用中,前述图1所示的方法在步骤SI I之前,还可包括下述的步骤S10,如图2所示,内存溢出检测方法还包括:
[0077]S10、捕获操作系统出现的内存访问异常事件。
[0078]本发明实施例中,由于隔离页的不可访问属性当发生内存溢出时,就会对使用内存地址段后面的隔离页进行读写操作,因为隔离页属性为不可访问,此时就会触发内存访问异常时间,本发明实施例只需要及时捕获操作系统出现的内存访问异常事件,即可及时发现内存溢出现象的发生,而且由于隔离页只占用内存地址空间,不占用物理内存的属性,避免额外物理内存的占用,降低内存消耗,提升系统性能。
[0079]举例来说,可通过预设的向量化异常处理函数VEH,在第一时间捕获操作系统出现的内存访问异常。
[0080]在实际应用中,前述步骤SlO中的在检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,图1所示的方法还可包括下述的图中未示出的步骤AOl和步骤A02:
[0081]AO1、在一程序启动时,确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页;
[0082]A02、将所述当前启动的程序在内存地址空间内分配的内存地址段发送给操作系统,以使所述操作系统根据该内存地址段为当前启动的程序分配内存块。
[0083]应理解的是,本实施例中使用内存地址段位于所述隔离页之前,所述使用内存地址段对应有物理内存。
[0084]在实际应用中,步骤AOl和步骤A02可位于前述图2所示的步骤SlO之前,也可位于步骤SlO之后,本实施例可根据实际需要设置,不对其进行限定。
[0085]本发明实施例中,在系统进行内存分配之前,本发明采用代码钩子技术,接管内存申请函数,在一程序启动时,接收到当前启动的程序的内存分配请求,根据所述内存分配请求,以及当前操作系统的内存分配粒度,重新确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页;并重新确定的内存地址段发送给操作系统,以使所述操作系统根据该重新确定的内存地址段为当前启动的程序分配内存块。
[0086]另外,前述步骤AOl中的确定当前启动的程序在内存地址空间内分配的内存地址段,可包括下述的图中未示出的步骤AOll和步骤A012:
[0087]A011、接收所述当前启动的程序的内存分配请求,所述内存分配请求包括预请求分配的内存块的大小;
[0088]A012、根据所述内存分配请求,以及当前操作系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0089]举例来说,步骤AO12可具体为:
[0090]在所述预请求分配的内存块的大小为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小等于所述预请求分配的内存块大小;在所述预请求分配的内存块的大小不为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小为所述预请求分配的内存块的大小的向上取整对齐;确定所述隔离页的大小为所述内存分配粒度;
[0091]根据所述使用内存地址段的大小和所述隔离页的大小,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0092]下面以预请求分配的内存块的大小不为所述内存分配粒度的整数倍的情况进行说明;
[0093]例如,当前启动的程序申请3KB的内存块,此时将预请求分配的内存块的大小为3KB,根据内存分配粒度向上取整对齐,也就是4KB大小,则确定当前启动的程序在内存地址空间内分配的内存地址段为包括4KB的使用内存地址段和追加在使用内存地址段之后的4KB的隔离页,此时大小就是8KB,然后在内存地址空间内申请8KB的内存地址段,所述8KB的内存地址段的示意图,如图3所示。
[0094]需要说明的是,Windows操作系统的内存管理是以4KB作为基本分配粒度的,内存属性的修改也以4KB作为基本单位,所以隔离页要消耗4KB的内存地址空间。
[0095]本发明实施例提出的内存溢出检测方法,还包括下述的图中未示出的步骤A03:
[0096]A03、在所述使用内存地址段对应的物理内存大于所述预请求分配的内存块时,向所述当前启动的程序返回与所述预请求分配的内存块的大小相等的物理内存块,所述物理内存块为从所述使用内存地址段对应的物理内存的高地址端向低地址端选取的连续物理内存块;
[0097]否则,将向所述当前启动的程序返回所述使用内存地址段对应的物理内存。
[0098]本发明实施例,操作系统根据重新确定的内存地址段为当前启动的程序分配内存块之后,当前程序运行时,本发明将会根据调用者实际申请的内存块的大小,为调用者返回对应的物理内存。
[0099]例如,将使用内存地址段对应的物理内存末尾的3KB部分返回给调用者使用。
[0100]本发明实施例提供的内存分配及内存溢出检测的方法,通过触发检测的方法,当捕获到内存访问异常事件时,触发内存溢出检测,可以有效检测和防御内存溢出类漏洞攻击手段,而且在软件测试工作中可以更有效的发现潜在的内存溢出问题,进而提高软件质量。
[0101]图4示出了本发明实施例的一种内存溢出检测系统的结构框图。
[0102]参照图4,本发明实施例提出的内存溢出检测系统包括检测模块101和判定模块102,其中:
[0103]所述的检测模块101,用于在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段;
[0104]其中,检测模块101,包括:
[0105]获取单元,用于获取各程序运行过程中的内存访问记录;
[0106]判断单元,用于根据所述获取单元获取的内存访问记录,判断是否存在任一程序对内存地址空间内的隔离页进行了访问。
[0107]所述的判定模块102,用于当所述检测模块的检测结果为存在任一程序对内存地址空间内的隔离页进行了访问时,判定该程序导致内存溢出。
[0108]进一步地,本发明另一实施例提出的内存溢出检测系统,如图5所示,还包括捕获模块100:
[0109]所述的捕获模块100,用于在所述检测模块检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,捕获操作系统出现的内存访问异常事件。
[0110]进一步地,本发明实施例提出的内存溢出检测系统还包括地址段确定模块和发送丰吴块:
[0111]所述的地址段确定模块,用于在检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,当一程序启动时,确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页;
[0112]所述的发送模块,用于将所述当前启动的程序在内存地址空间内分配的内存地址段发送给操作系统,以使所述操作系统根据该内存地址段为当前启动的程序分配内存块;
[0113]所述使用内存地址段位于所述隔离页之前,所述使用内存地址段对应有物理内存。
[0114]其中,地址段确定模块,包括:
[0115]接收单元,用于接收所述当前启动的程序的内存分配请求,所述内存分配请求包括预请求分配的内存块的大小;
[0116]地址段确定单元,用于根据所述内存分配请求,以及当前操作系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0117]更进一步地,所述地址段确定单元具体用于:
[0118]在所述预请求分配的内存块的大小为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小等于所述预请求分配的内存块大小;
[0119]在所述预请求分配的内存块的大小不为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小为所述预请求分配的内存块的大小的向上取整对齐;
[0120]确定所述隔离页的大小为所述内存分配粒度;
[0121]根据所述使用内存地址段的大小和所述隔离页的大小,确定所述当前启动的程序在内存地址空间内分配的内存地址段。
[0122]本发明实施例提出的内存溢出检测系统还包括:
[0123]地址返回模块,用于在所述使用内存地址段对应的物理内存大于所述预请求分配的内存块时,向所述当前启动的程序返回与所述预请求分配的内存块的大小相等的物理内存块的内存地址,所述物理内存块为从所述使用内存地址段对应的物理内存的高地址端向低地址端选取的连续物理内存块;否则,将向所述当前启动的程序返回所述使用内存地址段对应的物理内存。
[0124]本发明实施例,通过触发检测的方法,当捕获到内存访问异常事件时,触发内存溢出检测,可以有效检测和防御内存溢出类漏洞攻击手段,而且在软件测试工作中可以更有效的发现潜在的内存溢出问题,进而提高软件质量。
[0125]需要说明的是,本发明实施例提出的内存溢出检测系统的具体实现方式与本发明实施例的内存溢出检测方法的具体实现方式类似,具体请参见方法部分的描述,为了减少冗余,不做赘述。
[0126]综上所述,本发明提供的内存溢出检测方法和系统,通过触发检测的方法,当捕获到内存访问异常事件时,触发内存溢出检测,可以有效检测和防御内存溢出类漏洞攻击手段,而且在软件测试工作中可以更有效的发现潜在的内存溢出问题,进而提高软件质量;
[0127]通过检测是否存在任一程序对预先设置的具有不可访问属性的隔离页进行了访问,判断内存溢出的发生,由于隔离页只占用内存地址空间,不占用物理内存的属性,避免额外物理内存的占用,降低内存消耗,提升系统性能。
[0128]通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本发明可以通过硬件实现,也可以借助软件加必要的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以
是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0129]本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。
[0130]本领域技术人员可以理解实施例中的系统中的模块可以按照实施例描述进行分布于实施例的系统中,也可以进行相应变化位于不同于本实施例的一个或多个系统中。上述实施例的模块可以合并为一个模块,也可以进一步拆分成多个子模块。
[0131]以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
【主权项】
1.一种内存溢出检测方法,其特征在于,所述方法包括: 在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段; 若存在任一程序对内存地址空间内的隔离页进行了访问,则判定该程序导致内存溢出。2.根据权利要求1所述的方法,其特征在于,所述检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,所述方法还包括: 捕获操作系统出现的内存访问异常事件。3.根据权利要求1或2所述的方法,其特征在于,所述检测是否存在任一程序对内存地址空间内的隔离页进行了访问,包括: 获取各程序运行过程中的内存访问记录; 根据所述内存访问记录,判断是否存在任一程序对内存地址空间内的隔离页进行了访问。4.根据权利要求1所述的方法,其特征在于,在检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,所述方法还包括: 在一程序启动时,确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页; 将所述当前启动的程序在内存地址空间内分配的内存地址段发送给操作系统,以使所述操作系统根据该内存地址段为当前启动的程序分配内存块; 所述使用内存地址段位于所述隔离页之前,所述使用内存地址段对应有物理内存。5.根据权利要求4所述的方法,其特征在于,所述确定当前启动的程序在内存地址空间内分配的内存地址段,包括: 接收所述当前启动的程序的内存分配请求,所述内存分配请求包括预请求分配的内存块的大小; 根据所述内存分配请求,以及当前操作系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段。6.根据权利要求5所述的方法,其特征在于,所述根据所述内存分配请求,以及当前系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段,包括: 在所述预请求分配的内存块的大小为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小等于所述预请求分配的内存块大小; 在所述预请求分配的内存块的大小不为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小为所述预请求分配的内存块的大小的向上取整对齐; 确定所述隔离页的大小为所述内存分配粒度; 根据所述使用内存地址段的大小和所述隔离页的大小,确定所述当前启动的程序在内存地址空间内分配的内存地址段。7.根据权利要求6所述的方法,其特征在于,所述方法还包括: 在所述使用内存地址段对应的物理内存大于所述预请求分配的内存块时,向所述当前启动的程序返回与所述预请求分配的内存块的大小相等的物理内存块,所述物理内存块为从所述使用内存地址段对应的物理内存的高地址端向低地址端选取的连续物理内存块;否则,将向所述当前启动的程序返回所述使用内存地址段对应的物理内存。8.一种内存溢出检测系统,其特征在于,所述系统包括: 检测模块,用于在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段; 判定模块,用于当所述检测模块的检测结果为存在任一程序对内存地址空间内的隔离页进行了访问时,判定该程序导致内存溢出。9.根据权利要求8所述的系统,其特征在于,所述系统还包括: 捕获模块,用于在所述检测模块检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,捕获操作系统出现的内存访问异常事件。10.根据权利要求8或9所述的系统,其特征在于,所述检测模块,包括: 获取单元,用于获取各程序运行过程中的内存访问记录; 判断单元,用于根据所述获取单元获取的内存访问记录,判断是否存在任一程序对内存地址空间内的隔离页进行了访问。11.根据权利要求8所述的系统,其特征在于,所述系统还包括: 地址段确定模块,用于在检测是否存在任一程序对内存地址空间内的隔离页进行了访问之前,当一程序启动时,确定当前启动的程序在内存地址空间内分配的内存地址段,所述内存地址段包括连续设置的使用内存地址段和隔离页; 发送模块,用于将所述当前启动的程序在内存地址空间内分配的内存地址段发送给操作系统,以使所述操作系统根据该内存地址段为当前启动的程序分配内存块; 所述使用内存地址段位于所述隔离页之前,所述使用内存地址段对应有物理内存。12.根据权利要求11所述的系统,其特征在于,所述地址段确定模块,包括: 接收单元,用于接收所述当前启动的程序的内存分配请求,所述内存分配请求包括预请求分配的内存块的大小; 地址段确定单元,用于根据所述内存分配请求,以及当前操作系统的内存分配粒度,确定所述当前启动的程序在内存地址空间内分配的内存地址段。13.根据权利要求12所述的系统,其特征在于,所述地址段确定单元具体用于: 在所述预请求分配的内存块的大小为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小等于所述预请求分配的内存块大小; 在所述预请求分配的内存块的大小不为所述内存分配粒度的整数倍时,确定所述使用内存地址段的大小为所述预请求分配的内存块的大小的向上取整对齐; 确定所述隔离页的大小为所述内存分配粒度; 根据所述使用内存地址段的大小和所述隔离页的大小,确定所述当前启动的程序在内存地址空间内分配的内存地址段。14.根据权利要求13所述的方法,其特征在于,所述系统还包括: 地址返回模块,用于在所述使用内存地址段对应的物理内存大于所述预请求分配的内存块时,向所述当前启动的程序返回与所述预请求分配的内存块的大小相等的物理内存块的内存地址,所述物理内存块为从所述使用内存地址段对应的物理内存的高地址端向低地址端选取的连续物理内存块;否则,将向所述当前启动的程序返回所述使用内存地址段对应的物理内存。
【专利摘要】本发明提供了一种内存溢出检测方法和系统,该内存分配方法包括:在出现内存访问异常事件时,检测是否存在任一程序对内存地址空间内的隔离页进行了访问;所述隔离页为预先为每一程序在内存地址空间内分配的内存地址段的末尾处设置的具有不可访问属性的一部分内存地址段;若存在任一程序对内存地址空间内的隔离页进行了访问,则判定该程序导致内存溢出。本发明提出的内存溢出检测方法和系统,能够及时发现潜在的内存溢出问题,无需占用物理内存的属性,避免额外物理内存的占用,降低内存消耗,提升系统性能。
【IPC分类】G06F12/06
【公开号】CN104899157
【申请号】CN201510284289
【发明人】林皓, 张聪, 吴振芳
【申请人】北京北信源软件股份有限公司
【公开日】2015年9月9日
【申请日】2015年5月28日