内存检测方法和计算机系统技术方案

技术编号:30342346 阅读:30 留言:0更新日期:2021-10-12 23:15
本申请实施例提供一种内存检测方法,所述方法在运行任务时执行,所述任务中包括对第一变量的定义、以及对内存空间的访问,所述内存空间在初始化时被划分为存储区和编码区,所述方法包括:在所述存储区中为所述第一变量分配第一存储空间;在所述存储区中分配不可读不可写的对齐红区,用于将第一存储空间对齐为至少一个存储单元的大小;在所述编码区中的与所述第一存储单元对应的读-写指示单元中设置第一编码,并且将所述对齐红区中的最后的预定数目的字节存储的数值修改为所述第一存储单元中的可读可写字节数,以用于在对内存进行访问之前进行内存检测。通过根据本申请的内存检测方法减少了编码区占用的内存空间。法减少了编码区占用的内存空间。法减少了编码区占用的内存空间。

【技术实现步骤摘要】
内存检测方法和计算机系统


[0001]本申请涉及计算机
,具体涉及一种内存检测方法和基于该方法的计算机设备等。

技术介绍

[0002]随着物联网(Internet of Things,IOT)产业的迅速发展,应用于IOT设备的嵌入式设备已成为业界主流的研发产品,但由于嵌入式设备大都使用C语言开发,在内存安全性和可靠性方面存在较大的挑战。由于程序员的错误编码,或者移植调试等问题,会引起多种的内存安全问题:缓存区溢出(Buffer over flow,BOF),释放后使用(Use after free,UAF)、多重释放和零地址读写等内存安全相关问题。这些问题带来的损失可能是巨大的。
[0003]现代操作系统内核中常用的一种检测内存的技术,是在分配的内存后加入魔术字,当发生溢出时,该魔术字可能会被修改。在该内存空间被释之后,会检测魔术字的完整性,如果检测到被修改,则可判定为产生内存问题。这种传统内存检测方式实时性很差,难以准确定位到问题发生的地方。并且存在很大的几率被攻击者绕过。
[0004]在这样的背景下,出现了两大类方法对访问地址进行实时检测,一种是通过模拟CPU运行的方式,进行了系统仿真,在仿真的层面对地址进行检测;另外一种是通过插桩的方式在读写指令前插入函数接口,对即将访问地址的合法性进行检测。现有的对上述方法的实现,都是基于内存资源丰富的Linux或者Windows系统平台,现有的方案对内存系统资源的消耗巨大,是资源受限型的嵌入式设备难以承担的。因此,需要一种更有效的内存检测方案。
>
技术实现思路

[0005]本申请实施例旨在提供一种更有效的内存检测方案,以解决现有技术中的不足。
[0006]为实现上述目的,本申请一方面提供一种内存检测方法,所述方法在运行任务时执行,所述任务中包括对第一变量的定义、以及对内存空间的访问,所述内存空间在初始化时划分为存储区和编码区,其中,所述存储区包括多个大小相同的存储单元,所述编码区包括与所述多个存储单元分别对应的多个大小相同的读-写指示单元,所述方法包括:在所述存储区中为所述第一变量分配第一存储空间;在所述存储区中紧接着所述第一存储空间分配不可读不可写的对齐红区,其中,所述对齐红区属于第一存储单元,用于将所述第一存储空间对齐为至少一个存储单元的大小;在所述编码区中的与所述第一存储单元对应的读-写指示单元中设置第一编码,并且将所述对齐红区中的最后的预定数目的字节存储的数值修改为所述第一存储单元中的可读可写字节数,以用于在对内存进行访问之前进行内存检测。
[0007]在该内存检测方法中,通过将对齐红区最后预定数目字节设定为表示该存储单元中可读可写数据的字节数,从而可实现通过至少2位的数据来指示4*N字节的可读可写性,从而解决了现有技术中的编码区占用的内存空间过大的问题。
[0008]在一种实施方式中,所述内存空间在初始化时以预定比例划分为存储区和编码区,所述预定比例基于所述存储单元的大小和所述读-写指示单元的大小预先确定。在该实施方式中,通过以预定比例在内存中划分存储区和编码区,从而在内存池是由其他设备下发的情况下,不会像现有技术中那样由于通过预先确定好的偏移量来确定编码区,而产生内存冲突、造成内存检测错误。
[0009]在一种实施方式中,所述存储单元的大小为4*N字节,其中,N为大于或等于1的整数,N的值基于内存的大小预先确定。在该实施方式中,通过将红区的大小设定为4*N字节,并且根据设备内存的大小来设定N,从而对于内存较小的设备,将N可设置为较小,对于内存较大的设备,可将N设置为较大,最小的为4字节,这对于嵌入式设备更加适用。
[0010]在一种实施方式中,所述第一存储空间位于栈区或全局区中,其中,在所述编码区中的与所述第一存储单元对应的读-写指示单元中设置第一编码,并且将所述对齐红区中的最后的预定数目的字节存储的数值修改为所述第一存储单元中的可读可写字节数包括,通过基于在编译时插入的红区设置函数接口调用红区设置函数,在所述编码区中的与所述第一存储单元对应的读-写指示单元中设置第一编码,并且将所述对齐红区中的最后预定数目的字节中存储的数值修改为所述第一存储单元中的可读可写字节数。
[0011]由于资源受限的硬件会对烧录代码的大小进行限定,若编译器编译时插桩的内容过多会导致编译后的文件尺寸过大,以至于无法顺利地将镜像烧录到硬件当中。在该实施方式中,通过在编译中仅插入红区设置函数接口,而不插入完整的红区设置代码,在对每个变量设置编码区编码时,都可以插入函数接口,而在全部代码中仅需要对该函数的代码记录一次即可,从而大大减小了烧录代码的大小。
[0012]在一种实施方式中,所述第一存储空间位于堆区中,所述第一存储空间属于所述堆区中的第一节点,所述方法还包括,在在所述存储区中为所述第一变量分配第一存储空间之前,在所述存储区中为所述第一变量分配第一红区,并在所述第一红区中存储所述第一节点的节点头信息,其中,所述第一红区的大小为一个存储单元的大小。在该实施方式中,在堆区中,将节点头信息存储到红区中,进一步降低了内存占用空间。
[0013]在一种实施方式中,所述读-写指示单元的大小大于或等于2位。在该实施方式中,通过将读-写指示单元的最小空间设置为2位,从而可减小编码区占用空间。
[0014]在一种实施方式中,所述方法还包括,在对内存进行访问之前,确定访问地址对应的所述编码区的第一读-写指示单元;从所述第一读-写指示单元读取所述访问地址所在的存储单元对应的编码;基于所述读取的编码,确定是否执行对内存的访问。
[0015]在一种实施方式中,所述访问地址所在的存储单元对应的编码为所述第一编码,基于所述读取的编码,确定是否执行对内存的访问包括,读取所述访问地址所在的存储单元中最后预定数目的字节中存储的第一数值,基于所述第一数值确定所述访问地址是否可读可写,以确定是否执行对内存的访问。
[0016]本说明书另一方面提供一种计算机设备或计算机系统,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器在执行所述可执行代码时,实现上述任一项方法。其中所述计算机系统或设备例如为嵌入式设备
[0017]本说明书另一方面提供一种计算机程序产品,包括可执行代码,该可执行代码在一个或多个处理器上执行时,使得该一个或多个处理器实现上述任一项方法。
[0018]本说明书另一方面提供一种计算机存储介质,该计算机存储介质是非易失性的,该计算机存储介质内包括可执行代码,该可执行代码在一个或多个处理器上执行时,使得该一个或多个处理器实现上述任一项方法。
[0019]以上各个方面的实现方式和有益效果可互相参考。
附图说明
[0020]通过结合附图描述本申请实施例,可以使得本申请实施例更加清楚:
[0021]图1示出实施根据本申请实施例的内存检测方案的场景示意图;
[0022]图2示出了根据本申请实施例的内存检测方案的示意图;
[0023]图3示出根据本申请实施例的针对本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种内存检测方法,所述方法在运行任务时执行,所述任务中包括对第一变量的定义、以及对内存空间的访问,其特征在于,所述内存空间在初始化时被划分为存储区和编码区,其中,所述存储区包括多个大小相同的存储单元,所述编码区包括与所述多个存储单元分别对应的多个大小相同的读-写指示单元,所述方法包括:在所述存储区中为所述第一变量分配第一存储空间;在所述存储区中紧接着所述第一存储空间分配不可读不可写的对齐红区,其中,所述对齐红区属于所述多个存储单元中的第一存储单元,用于将所述第一存储空间对齐为至少一个存储单元的大小;在所述编码区中的与所述第一存储单元对应的读-写指示单元中设置第一编码,并且将所述对齐红区中的最后预定数目的字节中存储的数值修改为所述第一存储单元中的可读可写字节数,以用于在对内存进行访问之前进行内存检测。2.根据权利要求1所述的方法,其特征在于,所述内存空间在初始化时以预定比例划分为存储区和编码区,所述预定比例基于所述存储单元的大小和所述读-写指示单元的大小预先确定。3.根据权利要求1所述的方法,其特征在于,所述存储单元的大小为4*N字节,其中,N为大于或等于1的整数,N的值基于内存的大小预先确定。4.根据权利要求1所述的方法,其特征在于,所述第一存储空间位于栈区或全局区中,其中,在所述编码区中的与所述第一存储单元对应的读-写指示单元中设置第一编码,并且将所述对齐红区中的最后的预定数目的字节存储的数值修改为所述第一存储单元中的可读可写字节数包括,通过基于在编译时插入...

【专利技术属性】
技术研发人员:王维洲卢志明徐洋何号
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1