G06F11/00 G06F12/02
1.一种应用内存管理方法,其特征在于,所述方法包括:
接收到应用的申请内存请求后,查询操作内存分页的内存申请接口;
根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述应用分配内存块;
在为所述应用分配的内存块的开始或结束位置加入保护页,所述保护页用于为调试器提 供异常检测。
2.根据权利要求1所述的方法,其特征在于,所述根据所述操作内存分页的内存申请接 口提供的内存分页的大小,为所述应用分配内存块,包括:
为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页的内存申请接口提 供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内存分页字节;所述 保护内存分页字节的属性为不可读写或是不为所述应用提交内存,
则所述在为所述应用分配的内存块的开始或结束位置加入保护页,包括:
在为所述应用分配的内存块的结束位置加入保护页;
或在所述分配的内存块的结束位置预留保护内存分页字节,
则所述在为所述应用分配的内存块的开始或结束位置加入保护页,包括:
在为所述应用分配的内存块的开始位置加入保护页。
3.根据权利要求1所述的方法,其特征在于,所述在为所述应用分配的内存块的开始或 结束处加入保护页之后,还包括:
当所述应用在读写所述保护页时,操作系统产生异常信息,所述调试器捕捉到所述异常 信息后,中断所述应用的进行,使分配给所述应用的内存块被挂起。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存 块的最大地址之后,为所述其它应用分配内存块。
5.一种应用内存管理装置,其特征在于,所述装置包括:
接管模块,用于接收到应用的申请内存请求后,查询操作内存分页的内存申请接口;
分配模块,用于根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述 应用分配内存块;
添加模块,用于在为所述应用分配的内存块的开始或结束位置加入保护页,所述保护页 用于为调试器提供异常检测。
6.根据权利要求5所述的装置,其特征在于,所述分配模块具体用于:
为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页的内存申请接口提 供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内存分页字节;所述 保护内存分页字节的属性为不可读写或是不为所述应用提交内存,
则所述添加模块具体用于包括:
在为所述应用分配的内存块的结束位置加入保护页;
或在所述分配的内存块的结束位置预留保护内存分页字节,
则所述添加模块具体用于:
在为所述应用分配的内存块的开始位置加入保护页。
7.根据权利要求5所述的装置,其特征在于,所述分配模块还用于:
当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存 块的最大地址之后,为所述其它应用分配内存块。
本发明涉及通信技术领域,特别涉及一种应用内存管理方法和装置。
开发低端手机平台上的原生应用程序(手机Java应用不属于)一般是使用C语言或者 C++语言,并且平台提供的内存管理机制比较原始,需要应用开发者具有良好的素质,否则很 容易造成内存泄漏或者非法内存访问,轻则应用或系统运行速度变慢,重则死机。
为了在这些平台上开发更稳定的原生应用程序,现在的一种管理应用内存的方法是运行 时接管MMU(Memory Management Unit,内存管理单元)。运行时接管MMU的做法是,应用自 身建立一个内存管理模块,接管系统的MMU,常规的做法是在申请的内存前后加入保护字节, 并记录申请内存的操作,放置在申请内存前后的保护字节,一般是固定长度并会填充特定的 字节内容,比如说填充0x0D,这样,如果在释放该内存时,发现保护字节不是0x0D,就可以 认为存在非法的内存写操作。
但对于现有的在申请的内存前后加入保护字节的方法,只能检测到内存非法写的情况, 而不能检测出内存非法读,而这种非法读异常往往是代码逻辑不正确造成,而且一般会是低 效率的代码。其次保护字节完整只是无内存非法写的必要非充分条件,对于非法写操作不在 保护字节区,以及非法写入的字节与保护字节一致的这两种情况,是无法检测出来的。
为了解决现有技术中应用内存的管理不足的问题,本发明实施例提供了一种应用内存管 理方法和装置。所述技术方案如下:
一方面,提供了一种应用内存管理方法,所述方法包括:
接收到应用的申请内存请求后,查询操作内存分页的内存申请接口;
根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述应用分配内存块;
在为所述应用分配的内存块的开始或结束位置加入保护页,所述保护页用于为调试器提 供异常检测。
所述根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述应用分配内 存块,包括:
为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页的内存申请接口提 供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内存分页字节;所述 保护内存分页字节的属性为不可读写或是不为所述应用提交内存,
则所述在为所述应用分配的内存块的开始或结束位置加入保护页,包括:
在为所述应用分配的内存块的结束位置加入保护页;
或在所述分配的内存块的结束位置预留保护内存分页字节,
则所述在为所述应用分配的内存块的开始或结束位置加入保护页,包括:
在为所述应用分配的内存块的开始位置加入保护页。
所述在为所述应用分配的内存块的开始或结束处加入保护页之后,还包括:
当所述应用在读写所述保护页时,操作系统产生异常信息,所述调试器捕捉到所述异常 信息后,中断所述应用的进行,使分配给所述应用的内存块被挂起。
所述方法还包括:
当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存 块的最大地址之后,为所述其它应用分配内存块。
另一方面,还提供了一种应用内存管理装置,所述装置包括:
接管模块,用于接收到应用的申请内存请求后,查询操作内存分页的内存申请接口;
分配模块,用于根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述 应用分配内存块;
添加模块,用于在为所述应用分配的内存块的开始或结束位置加入保护页,所述保护页 用于为调试器提供异常检测。
所述分配模块具体用于:
为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页的内存申请接口提 供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内存分页字节;所述 保护内存分页字节的属性为不可读写或是不为所述应用提交内存,
则所述添加模块具体用于包括:
在为所述应用分配的内存块的结束位置加入保护页;
或在所述分配的内存块的结束位置预留保护内存分页字节,
则所述添加模块具体用于:
在为所述应用分配的内存块的开始位置加入保护页。
所述分配模块还用于:
当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存 块的最大地址之后,为所述其它应用分配内存块。
本发明实施例提供的技术方案带来的有益效果是:通过直接接管内存分页的内存申请接 口,根据内存分页的大小为应用分配内存块,并在内存块的一端加入保护页,可以对内存非 法读写都进行检测,同时其检测的覆盖率更高。
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附 图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域 普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例1中提供的一种应用内存管理的方法的流程图;
图2是本发明实施例2中提供的一种Windows操作系统的内存分层示意图;
图3是本发明实施例2中提供的一种应用内存管理的方法的流程图;
图4是本发明实施例2中提供的一种应用内存分配的示意图;
图5是本发明实施例3中提供的一种应用内存管理装置的示意图。
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进 一步地详细描述。
因为Feature Phone平台的内存模型往往是平面/线性内存模型,没有保护与隔离机制, 非法的内存访问往往会造成死机,所以本发明实施例提供了一种管理应用内存的方法,使用 该方法可以在模拟器环境下更方便有效进行内存异常检测。
实施例1
参见图1,本发明实施例提供了一种应用内存管理方法,包括:
101:接收到应用的申请内存请求后,查询操作内存分页的内存申请接口;
102:根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述应用分配内 存块;
103:在为所述应用分配的内存块的开始或结束位置加入保护页,所述保护页用于为调试 器提供异常检测。
本实施例中,所述根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所 述应用分配内存块,包括:
为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页的内存申请接口提 供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内存分页字节;所述 保护内存分页字节的属性为不可读写或是不为所述应用提交内存,
则所述在为所述应用分配的内存块的开始或结束位置加入保护页,包括:
在为所述应用分配的内存块的结束位置加入保护页;
或在所述分配的内存块的结束位置预留保护内存分页字节,则
则所述在为所述应用分配的内存块的开始或结束位置加入保护页,包括:
在为所述应用分配的内存块的开始位置加入保护页。
进一步地,所述在为所述应用分配的内存块的一端加入保护页之后,包括:
在为所述应用分配的内存块的开始或结束处加入保护页之后,还包括:
当所述应用在读写所述保护页时,操作系统产生异常信息,所述调试器捕捉到所述异常 信息后,中断所述应用的进行,使分配给所述应用的内存块被挂起。
本实施例中的方法还包括:
当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存 块的最大地址之后,为所述其它应用分配内存块。
本发明提供的方法实施例的有益效果是:通过直接接管内存分页的内存申请接口,根据 内存分页的大小为应用分配内存块,并在内存块的一端加入保护页,可以对内存非法读写都 进行检测,同时其检测的覆盖率更高。
实施例2
本发明实施例提供了一种应用内存管理方法,本发明实施例所提供的管理应用内存的方 法适用于模拟器,本发明实施例提供的方法,只能在支持内存分页机制的操作系统上使用比 如Windows、Linux、Mac OS等操作系统。
本发明实施例中,如图2所示,Windows操作系统的内存使用模型一般分层包括:应用 上层模块、应用内存管理装置、C库封装Malloc、HeapAlloc和VirtualAlloc接口。基于该 Windows操作系统的系统架构,应用程序内存管理模块并不直接使用系统(指手机平台/手机 模拟器平台)内存管理模块所提供的接口申请内存,而是直接使用操作系统底层的可以操作 内存分页的内存申请接口(同样不能使用C库封装的malloc接口),本实施例中,以Windows 操作系统为例进行说明。参见图3,本发明实施例提供的管理应用内存的方法,具体包括:
201:应用上层模块向应用内存管理装置申请内存。
本实施例中,应用在运行时,会向应用内存管理装置申请内存以存储数据。
202:应用内存管理装置接收到应用上层模块申请内存的请求,查询VirtualAlloc接口。
本实施例中,应用内存管理装置不接管系统内存管理模块,而是直接使用操作系统底层 的可以操作内存分页的内存申请接口,该接口在Windows操作系统中是VirtualAlloc接口, 应用内存管理装置查询该接口,从而获知内存分页情况。
203:根据VirtualAlloc接口提供的内存分页的大小,为该应用分配内存块。
本实施例中,根据所述操作内存分页的内存申请接口提供的内存分页的大小,为所述应 用分配内存块,包括:为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页 的内存申请接口提供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内 存分页字节。
本实施例中,应用上层模块向应用内存管理装置申请内存(假设大小是X)的时候,应 用程序内存管理模块实际上申请的内存大小是按照内存分页的大小对齐的,如图4所示,假 设应用申请的内存大小是19K,而VirtualAlloc接口提供的内存分页每页为4K,则应用内存 管理装置需要给该应用分配五个分页,且分配的内存大小要与分页的大小对齐,即将19K大 小的内存分到与分页大小对齐的五个分页地址上,由于每个分页为4K。而应用实际申请的大 小为19K,为该应用分配的五个分页后,还剩余1K的大小,本实施例中,将该1K大小的内 存中填充保护字节,作为预留保护内存分页字节,并将该保护分页自己的属性设置为不可读 写或是不为该应用提交内存。同时该预留保护内存分页字节中还存有返回给应用的内存地址 信息。本实施例中,如图4所示,可以将预留的保护内存分页字节放在分配的内存块的开始 位置,也可以将预留的保护内存分页字节放在分配的内存块的结束位置,对此本实施例不做 具体限定。
204:应用内存管理装置在为该应用分配的内存块的结束位置加入保护页。
本实施例中,在为内存分配好内存块后,在分配的内存块的结束位置加上保护页,该保 护页用于为调试器提供异常检测。本实施例中,,如果在所述分配的内存块的开始位置预留保 护内存分页字节;则在为所述应用分配的内存块的结束位置加入保护页;或如果在所述分配 的内存块的结束位置预留保护内存分页字节,则在为所述应用分配的内存块的开始位置加入 保护页。
本实施例中,当应用程序对保护页进行读写操作的时候,操作系统会产生一个异常,这 个异常可以被调试器捕捉到,进而可以中断应用的执行,使分配给该应用的内存块被挂起, 以供开发人员查解决问题。在一次运行的情况下,保护页要么放在内存块之前要么选择放 置在内存块之后,在前后均放置保护页的做法没有意义,因为内存块要按照内存分页的大小 进行字节对齐,不能保证内存块两端都紧邻保护页,因此开发人员的测试运行可以进行两次, 一次将保护页放在内存块前,一次将保护页放在内存块后。这样就更能准确的到内存中出 现的异常。
在32位Windows下,应用程序内存管理模块可以使用多达2G的地址空间,而在64位系 统下可以使用的地址空间更大(跟操作系统的内存分页模型有关)。通过本实施例中提供的管 理应用内存的方法,可以利用加大对无效指针的检测力度。这里所谓的无效指针,是说假设 第一个应用申请了一片8K的内存并赋值给了指针ptrA,然后将该内存释放了,然后第二个 应用又立即申请了一片8K的内存并赋值给了指针ptrB,此时ptrA指向的地址就是或者有可 能是ptrB指向的内存地址。因此本实施例中,每次应用程序内存管理模块调用VirtualAlloc 保留地址时,都保留比上次保留的地址数值要大的地址,直到达到了最大地址后再重新开始。 即当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存块 的最大地址之后,为所述其它应用分配内存块。例如,分配给第一个应用的内存块的最大地 址是128K,则在第一个应用释放该内存地址后,第二个应用申请内存块,则从128K以后为 第二个内存块分配地址。此外也可以设计跟时间相关的散列函数,这样可以让保留的内存地 址尽量散列在整个内存地址空间。因为应用程序通常使用的内存只有几百KB,加上模拟器进 程的内存开销可能只有几十MB,将几十MB的内存块散列到2G或者更大的空间里,能让无效 指针指向有效内存区域这种情况出现的概率非常非常小,可以提高非法内存访问被检测到的 可能性。具体的跟时间相关的散列函数属于现有技术,本实施例对此不做具体限定。
本发明提供的方法实施例的有益效果是:通过直接接管内存分页的内存申请接口,根据 内存分页的大小为应用分配内存块,并在内存块的一端加入保护页,可以对内存非法读写都 进行检测,同时其检测的覆盖率更高,此外,在检测到内存非法读写时,可以在模拟器环境 下实时中断代码执行,开发人员可以准确知道在什么情况下代码的什么位置进行了非法的内 存读写。
实施例3
参见图5,本发明实施例提供了一种应用内存管理装置,包括:接管模块301,分配模块 302和添加模块303。
接管模块301,用于接收到应用的申请内存请求后,查询操作内存分页的内存申请接口;
分配模块302,用于根据所述操作内存分页的内存申请接口提供的内存分页的大小,为 所述应用分配内存块;
添加模块303,用于在为所述应用分配的内存块的开始或结束位置加入保护页,所述保 护页用于为调试器提供异常检测。
其中,分配模块302具体用于:
为所述应用分配内存块,并将所述分配的内存块与所述操作内存分页的内存申请接口提 供的内存分页的大小对齐,并在所述分配的内存块的开始位置预留保护内存分页字节;所述 保护内存分页字节的属性为不可读写或是不为所述应用提交内存,
则所述添加模块303具体用于包括:
在为所述应用分配的内存块的结束位置加入保护页;
或在所述分配的内存块的结束位置预留保护内存分页字节,
则所述添加模块303具体用于:
在为所述应用分配的内存块的开始位置加入保护页。
本实施例中,分配模块还用于:
当所述应用释放所述分配的内存块后,在其它应用申请内存时,从所述应用释放的内存 块的最大地址之后,为所述其它应用分配内存块。
本发明提供的装置实施例的有益效果是:通过直接接管内存分页的内存申请接口,根据 内存分页的大小为应用分配内存块,并在内存块的一端加入保护页,可以对内存非法读写都 进行检测,同时其检测的覆盖率更高。
本实施例提供的装置,具体可以与方法实施例属于同一构思,其具体实现过程详见方法 实施例,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成, 也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中, 上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之 内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
本文发布于:2023-04-14 02:45:48,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/1/86894.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |