首页> 中国专利> 用于实时检测缓冲区溢出致堆内存损坏的方法和设备

用于实时检测缓冲区溢出致堆内存损坏的方法和设备

摘要

本发明描述了用于实时检测缓冲区溢出致堆内存损坏的方法和设备。本发明的一种实施方式涉及一种堆溢出检测系统,包括算术逻辑单元、数据路径和地址违规检测逻辑。算术逻辑单元被配置为接收具有操作码和操作数的指令并生成最终地址,以及基于表示有关堆内存访问的指令的操作码,生成比较信号。数据路径被配置为向算术逻辑单元提供操作码和操作数。地址违规检测逻辑在从算术逻辑单元接收到比较信号之后,根据操作码和最终地址来确定堆内存访问是否违规。

著录项

  • 公开/公告号CN103116529A

    专利类型发明专利

  • 公开/公告日2013-05-22

    原文格式PDF

  • 申请/专利权人 英飞凌科技股份有限公司;

    申请/专利号CN201210250070.3

  • 发明设计人 普拉卡什·巴拉苏布拉马尼安;

    申请日2012-07-18

  • 分类号G06F11/00(20060101);

  • 代理机构11240 北京康信知识产权代理有限责任公司;

  • 代理人余刚;吴孟秋

  • 地址 德国瑙伊比贝尔格市

  • 入库时间 2024-02-19 18:53:05

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-03-02

    授权

    授权

  • 2013-06-19

    实质审查的生效 IPC(主分类):G06F11/00 申请日:20120718

    实质审查的生效

  • 2013-05-22

    公开

    公开

说明书

技术领域

本发明涉及用于实时检测缓冲区溢出致堆内存损坏的方法和设备。

背景技术

内存在计算机系统和电子装置中普遍使用。内存用于存储包括程序、 记录等的信息。内存的完整性对于系统和/或与之相关的装置的工作而言是 很重要的。

当错误修改了预期或实际的内存内容时,会发生内存的损坏。内存可 能通过多种机制而被损坏。一旦出现内存损坏,数据可能丢失、程序内容 可能被修改、系统可能变得不可操作等。

物理内存是在正常工作期间被写入和从其读取的基于硬件的存储器。 物理内存的损坏可能从各种源头(诸如有缺陷的内存、RF干扰等)发生。 存在多种用于识别物理内存损坏的技术。一个实例是奇偶校验,其中,在 写操作时设置奇偶位,并在读取期间校验该位。若该奇偶位与数据不匹配, 则可能已经发生数据损坏。另外,调试逻辑可以在内存位置上配置观察点, 以验证对该内存位置的适当的读/写访问。任何错误都将导致调试逻辑,并 创建警告以允许采取适当的纠正措施。

堆内存,也被称为动态内存,是在程序运行时期间分配的内存。在执 行完程序之后,所分配的内存被归还至内存池。堆内存可能由于编程错误 (诸如缓冲区溢出)而损坏。例如,超出所分配内存的边界而写入的数据 可能损坏相邻内存。该损坏可能是偶然的,并导致数据丢失。然而,该损 坏也可以是故意或恶意的,并导致病毒和安全性问题。不同于其位置刚在 链接之后即被提前知晓的旨在用于程序数据的程序内存,堆内存位置是动 态确定的,且直到运行时才知道。采用识别物理内存的损坏的技术不能用 于堆内存,因为所使用的物理内存在运行时会改变。

一种用于识别堆内存损坏的技术是采用传统的调试断点技术。然而, 采用这些技术困难且耗时。另一技术是依靠堆内存的定期评估。然而,这 可能未能识别损坏,或仅识别堆内存损坏的子集。此外,定期评估对头部 段执行,并忽略数据段。因此,可能遗漏了数据段的损坏。即使通过已知 方法(诸如CRC码比较)对头部段和数据进行定期评估,该评估也需要 大量CPU带宽。因此,为了维持性能标准,需要更快且更昂贵的硬件。 另外,该解决方案关系到材料清单,并增加了功耗。另一技术是监视函数 调用,并识别落在许可内存位置以外的调用。然而,该技术不能检查溢出。

发明内容

根据本发明的一种实施方式,提供了一种堆溢出检测系统,包括:算 术逻辑单元,其被配置为接收具有操作码和操作数的指令并生成最终地 址,以及基于表示有关堆内存访问的指令的操作码,生成比较信号;数据 路径,其被配置为向算术逻辑单元提供操作码和操作数;以及地址违规检 测逻辑,其从算术逻辑单元接收到比较信号之后,根据操作数和最终地址 来确定堆内存访问是否违规。

根据本发明的另一实施方式,提供了另一种堆溢出检测系统,包括: 编译器,其被配置为根据策略约束,将高级程序编译为一条或多条指令; 程序内存,其被配置为存储一条或多条指令;处理器架构,其被配置为从 程序内存获取一条或多条指令;内存分配器,其被配置为基于内存分配请 求,分配堆内存的内存块;以及寄存器逻辑,其包括用于基于堆内存的内 存块的内存分配指令来存储命令、基址和大小的地址寄存器、大小寄存器 和命令寄存器。

根据本发明的一种实施方式,提供了一种检测堆溢出的方法,该方法 包括:接收具有操作码和操作数的有关内存访问的指令;根据有关内存访 问的指令生成最终地址;根据操作码生成比较信号;根据从有关内存访问 的指令获取的基址在地址范围文件中识别一条目;以及将所识别的条目与 最终地址相比较,以确定堆内存访问是否违规。

附图说明

图1A描述了示出适当和不适当的堆内存访问的实例性程序代码。

图1B描述了示出适当和不适当的堆内存访问的汇编语言代码。

图1C描述了示出适当和不适当的指针操作的实例性程序代码。

图1D描述了示出不适当的指针操作的汇编语言代码。

图2A是示出可实施本发明的实例性计算机系统的框图。

图2B是示出可用于本发明的典型的内存组织的框图。

图2C是可用于本发明的实施方式的实例性CPU架构的框图。

图2D是可用于本发明的实施方式的实例性执行单元的框图。

图3是示出根据本发明实施方式的堆溢出检测系统的框图。

图4是示出根据本发明实施方式的编译系统的框图。

图5是进一步示出根据本发明实施方式的用于堆溢出检测系统的地 址范围文件的框图。

图6A是描述使用在其中检测堆内存访问违规的堆溢出检测系统的运 行时执行的一个实例的示意图。

图6B是描述使用在其中从地址范围文件去除条目的堆溢出检测系统 的运行时执行的一个实例的示意图。

图6C是描述使用在其中确定内存访问不是堆内存的堆溢出检测系统 的运行时执行的一个实例的示意图。

图6D是描述使用在其中发生适当堆内存访问和未检测到违规的堆溢 出检测系统的运行时执行的一个实例的示意图。

图7是示出根据本发明实施方式的检测堆内存溢出的方法的流程图。

具体实施方式

本文所公开的是用于在基于内存的系统中检测堆内存溢出的系统和 方法。在一种实施方式中,堆溢出检测系统包括算术逻辑单元、数据路径 和地址违规检测逻辑。算术逻辑单元被配置为接收具有操作码和操作数的 指令并生成最终地址,以及基于表示堆内存访问指令的操作码,生成比较 信号。数据路径被配置为向算术逻辑单元提供操作码和操作数。在从算术 逻辑单元接收到比较信号时,地址违规检测逻辑根据操作数和最终地址来 确定堆内存访问是否违规。有关堆内存访问的指令包括内存访问指令(诸 如存储(STORE)命令)和指针算术指令(诸如用于建立地址的算术指令)。 在可选实施方式中,该系统还包括跟踪缓冲区,其被配置为在违规的情况 下接收指令或指令地址。在另一可选实施方式中,地址违规检测逻辑包括 具有关于所分配的堆内存块的条目的地址范围文件。

在另一实施方式中,公开了一种堆溢出检测系统。该系统包括编译器、 程序内存、中央处理单元(CPU)架构和地址寄存器逻辑。编译器被配置 为根据策略约束(policy constraint)将高级程序(诸如用“C”编写的程 序)编译为一条或多条机器指令或代码。策略约束能限制或限定与指针算 术操作相关的代码。程序内存被配置为存储一条或多条指令。CPU架构被 配置为从程序内存获取一条或多条指令。在运行时执行之前,为堆内存保 留物理内存的一部分。在运行时,对动态获取内存块的需求引发要调用的 保留堆内存的内存块的内存分配例程。寄存器逻辑包括地址寄存器、大小 寄存器和命令寄存器。地址寄存器存储内存块的基址。大小寄存器存储内 存块的大小。命令寄存器存储插入或去除命令。插入命令对应于内存块的 分配。去除命令对应于内存块的取消分配或去除。在可选实施方式中,该 系统还包括地址违规检测逻辑,其确定堆内存访问是否违规。基于内存分 配请求,地址违规检测逻辑向地址范围文件中插入一条目。

在本发明的又一方法中,公开了一种检测堆内存溢出的方法。接收有 关内存访问的指令。该指令包括操作码和操作数。根据操作码生成比较信 号。基于表示有关内存访问或内存地址修改的指令(诸如指针算术指令) 的操作码,生成比较信号。根据内存访问指令连同上述比较信号,生成最 终地址。根据从内存访问指令获取的基址在地址范围文件中识别一条目。 将所识别的条目与最终地址相比较,以确定堆内存访问是否违规。在可选 实施方式中,调用有关内存访问或内存地址修改的指令,并在地址范围文 件中插入对应于内存分配指令的条目。

现将参照附图来描述本发明,其中,通篇使用类似的附图标记来表示 类似的元件,且其中,所示结构和装置不一定按比例绘制。

本发明的发明人认识到,用于识别堆损坏的传统解决方案本质上是反 应性的,且可能损害性能配置。此外,可能在损坏发生后很久才检测到堆 损坏或不一致。另外,违规指令可能很难识别,且需要大量调试。通常, 从未找到导致内存损坏或溢出的根源。

图1A-图1D包括便于理解本发明的程序代码的实例。图1A描述了 示出适当堆内存访问和违规的实例性C程序代码。第1行从堆内存中动态 分配20字节大小的缓冲区或内存块。值得注意的是,术语“内存块”和 “缓冲区”可互换。为内存块分配基址。通过基址和偏移量对内存块中的 位置寻址。这里,偏移量应当小于或等于20,以避免对其他内存块的损坏。 第2行示出了适当的存储操作,其中,将一整数写入偏移量为15的缓冲 区。存储操作的偏移量小于或等于为内存块分配的大小20,因此不会导致 溢出条件。第3行示出了不适当的存储操作,其中,将一整数写入偏移量 为42的缓冲区或内存块。该偏移量大于所分配的大小20,并导致对相邻 内存块的损坏(如果它们已经被分配了的话)。

图1B描述了用汇编语言编译后图1A的代码实例。第1行使变量 Buffer的地址被存储在寄存器r0中。在该实例中,大小为20,且变量Buffer 保存具有由内存分配例程分配的20字节的大小的内存块或缓冲区的基址。 为访问属于该内存块的任何位置,需要从基址到所需位置的偏移量。该偏 移量或者直接被配置为数值,或者利用寄存器传递到存储(STR)指令。 在存储指令执行期间,向CPU的算术逻辑单元(ALU)提供基址以及偏 移量作为输入,且ALU生成最终内存地址作为输出。

第2行使变量Buffer的内容被存储在寄存器r1中。第3行使整数0x25 被存储在寄存器r2中。第4行使整数0x25从存储在寄存器r1中的地址移 动偏移量15。由于所指定的偏移量在分配给内存块的大小以内,所以这不 会导致溢出条件或违规。第5行使整数0x35被存储在寄存器r2中。随后, 第6行使整数0x35从存储在寄存器r1中的地址移动偏移量42,由于偏移 量42大于所分配的大小/偏移量20,所以这会产生溢出条件或违规。第6 行导致数据被写入所分配的内存块以外,并可能损坏相邻或附近的内存 (如果它们已经被分配了的话)。

图1C描述了指针操作的“C”程序代码。第1行从堆内存动态分配 了20字节大小的缓冲区。第2行使变量Buffer的地址增加偏移量35,由 于变量Buffer现在指向了所分配的内存块以外的地址,所以这将导致将来 的违规。

图1D描述了来自图1C的代码的汇编语言等价版。第1行使变量 Buffer的地址被存储在寄存器r0中。第2行使包括在寄存器r0中的地址 内容被存储在寄存器r1中。有效地,堆块的地址当前在寄存器r1中可用。 第3行使堆块的基址与偏移量值35相加,致使最终内存地址被存储在寄 存器r1中。有效地,第3行设置了指向20字节范围以外的地址的指针, 并可能导致将来的违规。使用“ADD.A”而不是“ADD”来将此标识为 有关内存访问的指令。第4行使寄存器r1的内容被存储在寄存器r0中保 存的地址。因此,更新后的堆块地址被存回变量Buffer。

本发明的发明人认识到,在运行时期间,传统的调试和计算机系统缺 少充分监视和检查堆内存访问操作(诸如加载操作、存储操作和指针算术 内存操作)的溢出的能力。此外,需要认识到,由算术逻辑单元(ALU) 计算的最终内存地址可以与先前存储的针对给定的基址的地址范围相比 较,以确定内存访问是否违反了基址的有效范围。

图2A是可以实施本发明的实例性计算机系统的示意图。该系统由从 内存206获取指令并执行该指令的CPU204来操作。CPU204还访问内存 206,以获得指令执行所需的数据或者更新数据作为指令执行的结果。需 要理解,提供实例性计算机系统是用于说明的目的,且本发明可在其他适 当的计算机系统中实施。

图2B是示出可用本发明实施的内存206的典型组织的示意图。内存 206具有内存起点和内存终点。在内存的起点和终点之间,有在该组织中 内存的四个典型用途:程序内存206a、数据内存206b、堆内存206c和栈 内存206d。程序内存206a包括待执行的程序指令。数据内存206b包括在 编译时以及程序可执行之前已知的数据元素。这些数据元素具有所分配的 地址。堆内存206c包括仅在程序运行时才知道的数据元素的地址。堆内 存206c还可被称为动态内存。栈内存206d用于在嵌套程序调用期间保留 程序的上下文。其还用于存储未保存在CPU寄存器中的活动程序的局部 变量。需要理解,根据本发明,可采用其他适当的采用了堆内存或动态内 存的内存组织。

图2C是可实施本发明的实施方式的通用CPU架构210的框图。架 构210包括内存206,该内存206包括程序内存、数据内存和堆内存。该 架构还包括获取单元212、解码和控制单元214以及执行单元216。

有CPU架构(诸如架构210)执行的几个基本任务。该架构获取指 令、解码指令并从寄存器获取操作数、执行指令、访问内存以及将结果写 回寄存器。

内存206包括一种或多种类型的内存,其包括堆或动态内存。内存 206还可包括其他类型的内存,其包括但不限于数据内存、程序内存和堆 内存。内存206可如图2B所示或者以包括堆内存的其他适当的内存配置 来组织。

这里,获取单元212从内存206获取指令。该指令是根据所存储的由 程序计数器指定的内存地址而被获取的。程序计数器包括下一指令的内存 地址。内存地址标识了内存206中放置下一指令的位置。一般地,当前获 取的指令存储在指令寄存器(未示出)中。

指令包括至少一个操作码和至少一个操作数。操作码指定了操作类型 以及执行什么。一些实例包括加、减、存储、加载、跳转等。操作数标识 了待操作或运算的数据,且可包括寻址模式。

解码和控制单元214解释或解码指令,并从寄存器单元获取操作数, 以及激活数据路径的相关部分。解码和控制单元214从当前指令获取操作 码和操作数。

执行单元216基于指令的操作码,对从解码单元214接收到的操作数 执行操作。来自解码单元214的信息可以是传送至相关单元并执行指令所 要求的动作(诸如从寄存器读取值、传递用于数学或逻辑函数的值、将结 果写入寄存器等)的控制信号的形式。这些指令生成的结果可被存储在内 存中,或者发送至输出装置。通常,在执行当前指令之后,更新或递增程 序计数器。

调试逻辑230包括诸如断点处理、观察点、暂停和跟踪功能的基础结 构,以检查和修改CPU上下文以及跟踪执行序列。

需要理解,提供架构210是用于说明的目的,且无论有或没有管线的 其他适当的架构均可被用于本发明。

图2D是可实施本发明的实施方式的通用执行单元216的框图。执行 单元216是可被用于图2C和本发明的适当单元的一个实例。提供执行单 元216作为一个实例,且需要理解,根据本发明,可以使用其他类似单元。 执行单元216包括算术逻辑单元216a、内存访问单元216b和寄存器写回 单元216c。值得注意的是,上述单元是逻辑功能单元,并可在一个或多个 硬件单元中实施。

算术逻辑单元216a对操作数执行算术和逻辑运算,并生成输出和比 较信号。内存访问单元216b是用于访问内存206的硬件,并用于有关内 存的指令,包括有关内存访问的指令(诸如加载和存储指令)。寄存器单 元216c控制并执行寄存器写操作,即,存储到寄存器。

ALU输出可被写入用于有关非内存访问和非程序控制的指令的寄存 器。对于有关程序控制的指令,可用诸如跳转指令的ALU输出来更新或 递增程序计数器。在内存访问指令的情况下,来自操作数的数据被存储在 由ALU输出表示的内存位置,或者从内存位置读取数据并存储在寄存器 中。控制信号触发内存访问单元216b,以从/向物理内存读取(在加载的 情况下)或写入(在存储的情况下)。

图3是示出根据本发明实施方式的堆溢出检测系统300的框图。该系 统300跟踪所分配的堆内存块,并检测堆内存损坏(也被称为溢出错误或 堆内存违规)。更具体地,系统300对加载、存储和指针算术指令识别有 关内存访问的违规。系统300包括调试寄存器逻辑302、地址违规检测逻 辑304、地址范围文件306、跟踪缓冲区308、算术逻辑单元(ALU)310 和数据路径312。需要理解,系统300中可存在其他未示出的部件。还需 要理解,在系统300的可选实施方式中,可省略或修改一个或多个所列部 件。

寄存器逻辑302基于地址范围文件来处理堆内存的内存块的分配和 去除。对于内存分配操作,寄存器逻辑302获取针对内存块的基址、大小 和命令,并将这些存储在地址寄存器322、大小寄存器324和命令寄存器 326中。基址是堆内存中的地址位置。大小是内存块的字节数。命令是在 地址范围文件306中插入所分配的堆块的细节,或者从地址范围文件306 中去除先前插入的内存块或缓冲区的条目。寄存器逻辑向地址违规检测逻 辑304提供这些值。

地址违规检测逻辑304包括地址范围文件306,该地址范围文件306 包括关于所分配的堆内存块的条目。每个条目具有由所指定的大小确定的 从基址或起始地址至结束地址的地址范围。在一种实施方式中,这些条目 是对应于所分配的内存块的起始和结束地址的成对的内存地址。这些条目 可以列表、栈或其他合适的数据结构来组织。

基于从寄存器逻辑302接收到的插入命令,连同基址和大小来创建条 目。地址违规检测逻辑304设置范围起点作为基址,并基于该基址和相应 的内存块大小来计算范围终点。基于从寄存器逻辑302接收到的去除命令 来去除条目。

地址违规检测逻辑304还从ALU 310接收比较信号336和ALU输出 338。同时,地址违规检测逻辑304也从数据路径312接收操作数346。比 较信号336表示地址违规检测逻辑检查违规的堆内存访问。ALU输出是 内存访问的最终地址,且由ALU 310计算。操作数346包括原始基址或 由于指针/地址操作而修改了的基址,并被地址违规检测逻辑304使用,以 从地址范围文件306识别范围文件条目或对,并确定最终地址是否落在所 识别的范围内。若最终地址在所识别的条目的范围内,则没有违规。若最 终地址在所识别的条目的范围以外,则违规。违规信号342和所确认的(原 始的或修改的)违规基址344被发送至跟踪缓冲区308。

ALU 310接收操作码348、操作数346,并可从数据路径312接收一 个或多个附加操作数。操作码348指定了待执行的操作。操作数346和附 加操作数指定了指向内存位置的基址和偏移量。若操作码348指定了包括 内存访问(诸如加载、存储或指针运算)的操作,则ALU 310向地址违 规检测逻辑304发送比较信号336。比较信号336告知地址违规检测逻辑 304检查内存访问操作。地址范围文件306中有条目或没有条目决定了内 存访问是否是堆内存访问。ALU 310基于操作数346和附加操作数计算最 终地址,并向地址违规检测逻辑304提供最终地址作为输出338。

在堆内存访问违规的情况下,跟踪缓冲区308从地址违规检测逻辑 304接收违规信号342和所确认的违规基址344。跟踪缓冲区308还可从 数据路径312或诸如导致违规的程序计数器的其他地方接收或获取其他相 关信息350。程序计数器是包括程序计数器值的寄存器(未示出),程序计 数器值是刚被获取的指令的地址。对于管线架构,由于管线而对程序计数 器值进行了调整。若检测到违规,则可追查出程序计数器值。程序计数器 值一旦恢复,则在正执行的程序的符号查询表中进行搜索。符号表包括在 符号文件或映射文件中,且包括数据和程序过程的地址。因此,可使用程 序计数器值来指示违规中包括哪个过程。因此,可提供包括程序计数器值、 违规中包括的过程和所确认的违规堆地址的上述信息作为输出352。

数据路径312为数据提供在功能单元之间传输的路径。数据路径312 是具有分布式物理实现的逻辑概念。其包括由(直接从指令或从寄存器文 件提取的)操作数数据一直到ALU 310或内存访问单元所占用的路径。 其还包括将ALU输出、结果或从内存加载的数据写回至CPU寄存器文件 所占用的路径。

图4是示出根据本发明实施方式的编译系统400的框图。编译系统 400将程序代码从诸如“C”的高级语言转换为机器码。为了适当运行系 统300,编译过程中需要约束来帮助系统300区分出有关内存访问的指令 与可用的剩余指令,作为指令集的一部分。

编译系统400包括诸如用C编写的程序的高级用户程序402。系统 400还包括编译器404、策略约束408和约束机器指令406。高级程序不需 要特殊代码或修改以便用系统300工作。然而,在编译时,编译器404使 用策略约束408,以生成用堆溢出检测系统(诸如图3的系统300)可操 作的约束机器指令406。

在处理有关内存访问的计算(诸如内存地址的指针运算)时,策略约 束408要求编译器仅使用专用指令。例如,当操作内存地址时,该约束可 能禁止将“ADD”指令用于地址,且相反,要求诸如“ADD.A”的内存 专用指令。值得注意的是,“ADD”和“ADD.A”仅是汇编指令的实例。 约束408使ALU识别指令作为有关内存的指令以及建立比较信号变得简 单。

约束408通常将包括算术指令的指令集应用至CPU架构,该算术指 令具有所分配的其操作数的至少一个仅包括内存地址。这种架构的指令集 可另外包括算术指令,该算术指令的操作数不一定需要包括内存地址,但 可以包括内存地址。这种约束在被应用时,减小了ALU所需要包括的为 使ALU确定是否应当断言比较信号的硬件逻辑的数量。在没有这种约束 的情况下,ALU需要其他硬件来确定是否断言比较信号。这是因为,ALU 被迫将所有算术指令解释为使其操作数中的一个包括内存地址。需要理 解,本发明的可选实施方式可以利用其他硬件来处理更通用的算术指令, 且不需要策略约束408。

图5是进一步示出系统300的地址范围文件306的框图。如上所述, 地址范围文件306包括关于所分配的堆内存块的条目。每个条目都指定了 从起始地址到结束地址的内存地址范围。响应内存分配请求(如连同基址 和大小的插入命令)而添加条目。基于连同基址的去除命令来去除条目。

在操作期间以及响应比较信号,使用包括基址的操作数来选择范围文 件306中的条目。范围文件306包括被搜索以识别匹配条目的条目列表。 若基址位于该条目的地址范围内,则匹配或识别条目。在一种实例中,基 址匹配条目的起始地址。在另一实例中,基址匹配条目的地址范围内的地 址,但不是条目的起始地址。若没有匹配,则基址引用了非堆内存位置(诸 如栈或数据内存),且不执行检查。若有匹配,则使用ALU输出来确定所 计算的最终地址是否在所识别或匹配的条目的内存地址范围内。ALU输 出本质上是所计算的最终基址。

图6A-图6D示出了使用堆溢出检测系统的各种运行时的实例,并援 引图3的系统300作为根据本发明的合适的系统的一个实例。图6A是描 述使用根据本发明的堆溢出检测系统的运行时执行的一个实例的示意图。 在该实例中,检测溢出或内存访问违规。

开始在602处,用户程序请求缓冲区或堆内存块的分配。内存分配器 354分配堆内存块,并为所分配的堆内存块标识包括基址、内存大小和插 入命令的分配信息。基址、内存大小和插入命令随后由内存分配器354传 递至寄存器逻辑302的相应的地址寄存器322、大小寄存器324和命令寄 存器326。基址、大小和插入命令随后从寄存器逻辑302被发送至在范围 文件306中创建条目的地址违规检测逻辑304。因此,地址范围文件306 当前具有关于所分配的堆内存块的条目。

在604处,加载、存储或指针运算指令进入数据路径312。向ALU 310 提供操作数、操作码和一个或多个附加操作数,ALU 310确定最终基址, 并提供其作为ALU输出。ALU还识别该指令是加载、存储或指针运算指 令,并向地址违规检测逻辑发送比较信号。此外,如图6A中的操作数1 所示的操作数指定了基址,并被地址违规检测逻辑使用,来识别范围文件 306中的条目。在该实例中,基址与在602处创建的条目相匹配。

在606处,地址违规检测逻辑304将最终地址与所识别地址的范围相 比较来确定最终地址是否在所分配的该内存块的范围内。若最终地址在所 识别的条目的范围以外,则发生违规。向跟踪缓冲区308提供诸如调整后 的程序计数器值和违规基址的有关违规的信息用于其他动作。

图6B是描述使用根据本发明的堆溢出检测系统的运行时执行的一个 实例的示意图。在该实例中,从地址范围文件306中去除条目。

开始在612处,用户程序请求取消分配或释放缓冲区或堆内存块。内 存分配器354根据所指定的基址来取消该堆内存块的分配。另外,内存分 配器354向寄存器逻辑302的相应的地址寄存器322和命令寄存器326传 递基址和去除命令,寄存器逻辑302反过来又向地址违规检测逻辑传递接 收到的细节。地址违规检测逻辑304随后在地址范围文件306中识别一条 目,并去除该条目。

在614处,加载、存储或指针运算指令进入数据路径312。向ALU 310 提供操作数、操作码和附加操作数,ALU 310确定最终基址,并提供其作 为ALU输出。ALU还识别该指令是加载、存储或指针运算指令,并向地 址违规检测逻辑发送比较信号。此外,操作数指定了基址,并被地址违规 检测逻辑使用来识别范围文件306中的条目。在该实例中,未找到匹配条 目,且因此没有违规。在616处,没有违规,因此不用向跟踪缓冲区提供 什么。

图6C是描述使用根据本发明的堆溢出检测系统的运行时执行的另一 实例的示意图。在该实例中,系统确定了基址引用非堆内存位置,且因此, 没有堆内存的溢出或内存访问违规。

开始在622处,用户程序请求缓冲区或堆内存块。内存分配器标识基 址、内存大小,并生成插入命令。基址、内存大小和插入命令随后被传递 至寄存器逻辑302的相应的地址寄存器322、大小寄存器324和命令寄存 器326。基址、大小和插入命令随后从寄存器逻辑302被发送至在范围文 件306中创建条目的地址违规检测逻辑304。

在624处,加载、存储或指针运算指令进入数据路径312。向ALU 310 提供操作数、操作码和附加操作数,ALU 310确定最终基址,并提供其作 为ALU输出。ALU还识别该指令是加载、存储或指针运算指令,并向地 址违规检测逻辑发送比较信号。此外,操作数指定了基址,并被地址违规 检测逻辑304使用来识别范围文件306中的条目。这里,基址不是在622 处分配的堆内存块的基址。

在626处,地址违规检测逻辑304确定该基址不与地址范围文件306 中的条目对应。因此,该基址指向非堆内存位置。不向跟踪缓冲区308提 供信息。

图6D是描述使用根据本发明的堆溢出检测系统的运行时执行的另一 实例的示意图。在该实例中,系统识别作为引用堆内存的地址,并确定没 有发生溢出或内存访问违规。换句话说,发生了有效堆内存访问。

开始在632处,用户程序请求缓冲区或堆内存块。内存分配器单元标 识基址、内存大小,并生成插入命令。基址、内存大小和插入命令随后被 传递至寄存器逻辑302的相应的地址寄存器322、大小寄存器324和命令 寄存器326。随后,在范围文件306中创建条目的地址违规检测逻辑304 引用该基址、大小和插入命令。

在634处,加载、存储或指针运算指令进入数据路径312。向ALU 310 提供操作数、操作码和附加操作数,ALU 310确定最终基址,并提供其作 为ALU输出。ALU 310还识别该指令是加载、存储或指针运算指令,并 向地址违规检测逻辑发送比较信号。此外,操作数指定了基址,并被地址 违规检测逻辑304使用来识别范围文件306中的条目。

在636处,地址违规检测逻辑304确定该基址对应于地址范围文件 306中的条目。地址违规检测逻辑将ALU输出与从地址范围文件306中 识别的条目的范围相比较,并确定没有违规。由于没有违规,所以不向跟 踪缓冲区308提供信息。

图7是示出根据本发明实施方式的检测堆内存溢出的方法700的流程 图。所示方法700按顺序发生,然而,需要理解,方法700的块可以其他 合适的顺序来执行。此外,需要理解,可采用或不采用上文所述实施方式 来执行方法700。

该方法始于块702,其中,接收有关内存访问的指令。该指令包括操 作码和操作数,且可包括一个或多个附加操作数。操作数包括基址,且一 个或多个附加操作数可包括偏移量或其他信息。在一种实例中,有关内存 访问的指令被诸如图2C的架构210的处理器架构获取,并被解码和执行。

在块704处,根据有关内存访问的指令生成最终地址。该最终地址由 算术逻辑单元根据内存访问操作中存在的操作数和一个或多个附加操作 数而生成。在一种实例中,该一个或多个附加操作数包括从存储命令的基 址的偏移量。在另一实例中,该一个或多个操作数指定了指针位置的运算 尺度。

在块706处根据操作码生成比较信号。该操作码标识了有关内存访问 的操作,诸如加载、存储或指针运算。若操作码未指定有关内存访问的指 令,则方法700结束当前指令,且不生成比较信号。一般地,由于地址违 规检测逻辑在接收到比较信号之后开始执行其功能,所以在ALU输出之 后或与其一起生成比较信号。若未提供比较信号,则地址违规检测逻辑可 以只是忽略ALU输出。

在块708处,根据从内存访问指令获取的基址在地址范围文件中识别 一条目。通过检索地址范围文件中的条目列表来识别或匹配该条目。若基 址位于该条目的地址范围内,则识别或匹配条目。基址可以仅是操作数。 在一种实例中,基址对应于所分配的堆内存块的起始地址。在另一实例中, 基址或操作数对应于由之前执行的指针操作引起的修改后的起始地址。若 针对该基址在地址范围文件中未识别出条目,则可以假定该基址不对堆内 存块寻址,且未识别出堆内存访问违规。所识别的条目为所分配的堆内存 块或缓冲区指定了地址范围。在一种实例中,地址违规检测逻辑参照地址 范围文件来识别相应的条目。

在块710处,将最终地址与所识别的条目相比较,以确定是否已发生 堆内存访问的违规。若最终地址落在所识别条目的地址范围内,则未发生 堆内存的违规。然而,若最终地址落在所识别条目的地址范围以外,则发 生了违规。可向跟踪缓冲区等发送信息(包括但不限于基址和程序计数器 值)以进一步辅助调试操作。

基于内存分配器执行的内存分配,向地址范围文件添加堆内存条目。 根据架构分配的地址和所需的大小来创建条目。基于到内存分配器的内存 去除或取消分配请求,从地址范围文件中去除堆内存条目。这里,内存去 除请求指定了该条目的基址或起始地址,它标识该条目并随后将其去除。

尽管已参照一种或多种实施示出并描述了本发明,但在不背离所附权 利要求的思想和范围的情况下,可对所示实例进行替换和/或修改。

此外,尽管本文针对处理器架构和内存组织描述了本发明,但需要理 解,其他架构、内存组织等也可用于本发明的实施方式。

此外,尤其是对于由上述部件或结构(组件、装置、电路、系统等) 执行的各种功能,除非另有指明,否则即使不与执行本文所示本发明的示 例性实施的功能的所公开的结构在结构上等效,用于描述这些部件的术语 (包括对“方法”的引用)旨在对应于执行所述部件的指定功能的任何部 件或结构(例如,功能上等效)。另外,尽管已针对若干实施中的仅一个 公开了本发明的具体特征,但当对于任何给定的或具体的应用可能是期望 和有利的时,该特征可与其他实施的一个或多个其他特征结合。此外,关 于在详细描述或权利要求中使用的术语“包括”、“含有”、“具有”、“有”、 “带有”或其变形的范围,这些术语旨在以类似于术语“包含”的方式来 说明范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号