首页 / 专利库 / 电脑零配件 / 计算机系统 / 硬件 / 中央处理器 / 算术逻辑单元 / 用于实时检测缓冲区溢出致堆内存损坏的方法和设备

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

阅读:1042发布:2020-06-12

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

1.一种堆溢出检测系统,包括:
算术逻辑单元,其被配置为接收具有操作码和操作数的指令并生成最终地址,以及基于表示有关堆内存访问的指令的所述操作码生成比较信号
数据路径,其被配置为向所述算术逻辑单元提供所述操作码和所述操作数;以及地址违规检测逻辑单元,其从所述算术逻辑单元接收到所述比较信号之后,根据所述操作数和所述最终地址来确定堆内存访问是否违规;
其中,数据路径是具有分布式物理实现的逻辑概念。
2.根据权利要求1所述的系统,还包括跟踪缓冲区,其被配置为提供与所确认的违规有关的信息。
3.根据权利要求2所述的系统,其中,所述跟踪缓冲区还被配置为在违规的情况下从所述数据路径接收程序计数器值。
4.根据权利要求1所述的系统,其中,所述操作数指定了所分配的堆内存的基址。
5.根据权利要求1所述的系统,其中,所述指令还包括一个或多个附加操作数。
6.根据权利要求5所述的系统,其中,所述最终地址根据所述操作数和所述一个或多个附加操作数而生成。
7.根据权利要求1所述的系统,其中,所述地址违规检测逻辑单元包括地址范围文件,该文件具有关于所分配的堆内存块的条目。
8.根据权利要求7所述的系统,其中,所述地址范围文件中的各个条目具有从基址到结束地址的地址范围。
9.根据权利要求8所述的系统,其中,所述基址和所述结束地址对应于指定大小的所分配的内存块。
10.根据权利要求9所述的系统,其中,所述地址违规检测逻辑单元根据所述操作数从所述地址范围文件中识别条目,并将所述最终地址与所识别条目的范围相比较,以确定所述堆内存访问指令是否违规。
11.根据权利要求10所述的系统,其中,在接收到关于所分配内存块的插入命令以及基址和大小之后,所述地址违规检测逻辑单元在所述地址范围文件中插入一条目。
12.根据权利要求11所述的系统,还包括寄存器逻辑,所述寄存器逻辑包括用于存储所述插入命令、所述基址和所述大小的地址寄存器、大小寄存器和命令寄存器,并向所述地址违规检测逻辑单元提供所述插入命令、所述基址和所述大小。
13.一种堆溢出检测系统,包括:
编译器,其被配置为根据策略约束,将高级程序编译为一条或多条指令;
程序内存,其被配置为存储所述一条或多条指令;
处理器架构,其被配置为从所述程序内存获取所述一条或多条指令;
内存分配器,其被配置为基于内存分配请求,分配堆内存的内存块;
寄存器逻辑,其包括用于基于所述堆内存的内存块的内存分配指令来存储命令、基址和大小的地址寄存器、大小寄存器和命令寄存器;以及
地址违规检测逻辑单元,其根据操作数和最终地址来确定堆内存访问指令是否违规。
14.根据权利要求13所述的系统,其中,所述策略约束限定了可用于指针运算的指令类型。
15.根据权利要求13所述的系统,其中,所述地址违规检测逻辑单元基于所述堆内存的内存块的所述内存分配指令,利用来自所述寄存器逻辑的所述命令、所述基址和所述大小,在地址范围文件中插入一条目。
16.一种检测堆溢出的方法,该方法包括:
接收具有操作码和操作数的有关内存访问的指令;
根据所述内存访问指令生成最终地址;
根据所述操作码生成比较信号;
根据从所述有关内存访问的指令获取的基址在地址范围文件中识别一条目;以及将所识别的条目与所述最终地址相比较,以确定堆内存访问是否违规。
17.根据权利要求16所述的方法,还包括:接收内存分配指令,并向所述地址范围文件中插入条目。
18.根据权利要求16所述的方法,还包括:接收内存取消分配指令,并从所述地址范围文件中去除条目。
19.根据权利要求16所述的方法,还包括:向跟踪缓冲区提供所述基址和程序计数器值。

说明书全文

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

技术领域

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

背景技术

[0002] 内存在计算机系统电子装置中普遍使用。内存用于存储包括程序、记录等的信息。内存的完整性对于系统和/或与之相关的装置的工作而言是很重要的。
[0003] 当错误修改了预期或实际的内存内容时,会发生内存的损坏。内存可能通过多种机制而被损坏。一旦出现内存损坏,数据可能丢失、程序内容可能被修改、系统可能变得不可操作等。
[0004] 物理内存是在正常工作期间被写入和从其读取的基于硬件存储器。物理内存的损坏可能从各种源头(诸如有缺陷的内存、RF干扰等)发生。存在多种用于识别物理内存损坏的技术。一个实例是奇偶校验,其中,在写操作时设置奇偶位,并在读取期间校验该位。若该奇偶位与数据不匹配,则可能已经发生数据损坏。另外,调试逻辑可以在内存位置上配置观察点,以验证对该内存位置的适当的读/写访问。任何错误都将导致调试逻辑,并创建警告以允许采取适当的纠正措施。
[0005] 堆内存,也被称为动态内存,是在程序运行时期间分配的内存。在执行完程序之后,所分配的内存被归还至内存池。堆内存可能由于编程错误(诸如缓冲区溢出)而损坏。例如,超出所分配内存的边界而写入的数据可能损坏相邻内存。该损坏可能是偶然的,并导致数据丢失。然而,该损坏也可以是故意或恶意的,并导致病毒和安全性问题。不同于其位置刚在链接之后即被提前知晓的旨在用于程序数据的程序内存,堆内存位置是动态确定的,且直到运行时才知道。采用识别物理内存的损坏的技术不能用于堆内存,因为所使用的物理内存在运行时会改变。
[0006] 一种用于识别堆内存损坏的技术是采用传统的调试断点技术。然而,采用这些技术困难且耗时。另一技术是依靠堆内存的定期评估。然而,这可能未能识别损坏,或仅识别堆内存损坏的子集。此外,定期评估对头部段执行,并忽略数据段。因此,可能遗漏了数据段的损坏。即使通过已知方法(诸如CRC码比较)对头部段和数据进行定期评估,该评估也需要大量CPU带宽。因此,为了维持性能标准,需要更快且更昂贵的硬件。另外,该解决方案关系到材料清单,并增加了功耗。另一技术是监视函数调用,并识别落在许可内存位置以外的调用。然而,该技术不能检查溢出。

发明内容

[0007] 根据本发明的一种实施方式,提供了一种堆溢出检测系统,包括:算术逻辑单元,其被配置为接收具有操作码和操作数的指令并生成最终地址,以及基于表示有关堆内存访问的指令的操作码,生成比较信号;数据路径,其被配置为向算术逻辑单元提供操作码和操作数;以及地址违规检测逻辑,其从算术逻辑单元接收到比较信号之后,根据操作数和最终地址来确定堆内存访问是否违规。
[0008] 根据本发明的另一实施方式,提供了另一种堆溢出检测系统,包括:编译器,其被配置为根据策略约束,将高级程序编译为一条或多条指令;程序内存,其被配置为存储一条或多条指令;处理器架构,其被配置为从程序内存获取一条或多条指令;内存分配器,其被配置为基于内存分配请求,分配堆内存的内存;以及寄存器逻辑,其包括用于基于堆内存的内存块的内存分配指令来存储命令、基址和大小的地址寄存器、大小寄存器和命令寄存器。
[0009] 根据本发明的一种实施方式,提供了一种检测堆溢出的方法,该方法包括:接收具有操作码和操作数的有关内存访问的指令;根据有关内存访问的指令生成最终地址;根据操作码生成比较信号;根据从有关内存访问的指令获取的基址在地址范围文件中识别一条目;以及将所识别的条目与最终地址相比较,以确定堆内存访问是否违规。附图说明
[0010] 图1A描述了示出适当和不适当的堆内存访问的实例性程序代码。
[0011] 图1B描述了示出适当和不适当的堆内存访问的汇编语言代码
[0012] 图1C描述了示出适当和不适当的指针操作的实例性程序代码。
[0013] 图1D描述了示出不适当的指针操作的汇编语言代码。
[0014] 图2A是示出可实施本发明的实例性计算机系统的框图
[0015] 图2B是示出可用于本发明的典型的内存组织的框图。
[0016] 图2C是可用于本发明的实施方式的实例性CPU架构的框图。
[0017] 图2D是可用于本发明的实施方式的实例性执行单元的框图。
[0018] 图3是示出根据本发明实施方式的堆溢出检测系统的框图。
[0019] 图4是示出根据本发明实施方式的编译系统的框图。
[0020] 图5是进一步示出根据本发明实施方式的用于堆溢出检测系统的地址范围文件的框图。
[0021] 图6A是描述使用在其中检测堆内存访问违规的堆溢出检测系统的运行时执行的一个实例的示意图。
[0022] 图6B是描述使用在其中从地址范围文件去除条目的堆溢出检测系统的运行时执行的一个实例的示意图。
[0023] 图6C是描述使用在其中确定内存访问不是堆内存的堆溢出检测系统的运行时执行的一个实例的示意图。
[0024] 图6D是描述使用在其中发生适当堆内存访问和未检测到违规的堆溢出检测系统的运行时执行的一个实例的示意图。
[0025] 图7是示出根据本发明实施方式的检测堆内存溢出的方法的流程图

具体实施方式

[0026] 本文所公开的是用于在基于内存的系统中检测堆内存溢出的系统和方法。在一种实施方式中,堆溢出检测系统包括算术逻辑单元、数据路径和地址违规检测逻辑。算术逻辑单元被配置为接收具有操作码和操作数的指令并生成最终地址,以及基于表示堆内存访问指令的操作码,生成比较信号。数据路径被配置为向算术逻辑单元提供操作码和操作数。在从算术逻辑单元接收到比较信号时,地址违规检测逻辑根据操作数和最终地址来确定堆内存访问是否违规。有关堆内存访问的指令包括内存访问指令(诸如存储(STORE)命令)和指针算术指令(诸如用于建立地址的算术指令)。在可选实施方式中,该系统还包括跟踪缓冲区,其被配置为在违规的情况下接收指令或指令地址。在另一可选实施方式中,地址违规检测逻辑包括具有关于所分配的堆内存块的条目的地址范围文件。
[0027] 在另一实施方式中,公开了一种堆溢出检测系统。该系统包括编译器、程序内存、中央处理单元(CPU)架构和地址寄存器逻辑。编译器被配置为根据策略约束(policy constraint)将高级程序(诸如用“C”编写的程序)编译为一条或多条机器指令或代码。策略约束能限制或限定与指针算术操作相关的代码。程序内存被配置为存储一条或多条指令。CPU架构被配置为从程序内存获取一条或多条指令。在运行时执行之前,为堆内存保留物理内存的一部分。在运行时,对动态获取内存块的需求引发要调用的保留堆内存的内存块的内存分配例程。寄存器逻辑包括地址寄存器、大小寄存器和命令寄存器。地址寄存器存储内存块的基址。大小寄存器存储内存块的大小。命令寄存器存储插入或去除命令。插入命令对应于内存块的分配。去除命令对应于内存块的取消分配或去除。在可选实施方式中,该系统还包括地址违规检测逻辑,其确定堆内存访问是否违规。基于内存分配请求,地址违规检测逻辑向地址范围文件中插入一条目。
[0028] 在本发明的又一方法中,公开了一种检测堆内存溢出的方法。接收有关内存访问的指令。该指令包括操作码和操作数。根据操作码生成比较信号。基于表示有关内存访问或内存地址修改的指令(诸如指针算术指令)的操作码,生成比较信号。根据内存访问指令连同上述比较信号,生成最终地址。根据从内存访问指令获取的基址在地址范围文件中识别一条目。将所识别的条目与最终地址相比较,以确定堆内存访问是否违规。在可选实施方式中,调用有关内存访问或内存地址修改的指令,并在地址范围文件中插入对应于内存分配指令的条目。
[0029] 现将参照附图来描述本发明,其中,通篇使用类似的附图标记来表示类似的元件,且其中,所示结构和装置不一定按比例绘制。
[0030] 本发明的发明人认识到,用于识别堆损坏的传统解决方案本质上是反应性的,且可能损害性能配置。此外,可能在损坏发生后很久才检测到堆损坏或不一致。另外,违规指令可能很难识别,且需要大量调试。通常,从未找到导致内存损坏或溢出的根源。
[0031] 图1A-图1D包括便于理解本发明的程序代码的实例。图1A描述了示出适当堆内存访问和违规的实例性C程序代码。第1行从堆内存中动态分配20字节大小的缓冲区或内存块。值得注意的是,术语“内存块”和“缓冲区”可互换。为内存块分配基址。通过基址和偏移量对内存块中的位置寻址。这里,偏移量应当小于或等于20,以避免对其他内存块的损坏。第2行示出了适当的存储操作,其中,将一整数写入偏移量为15的缓冲区。存储操作的偏移量小于或等于为内存块分配的大小20,因此不会导致溢出条件。第3行示出了不适当的存储操作,其中,将一整数写入偏移量为42的缓冲区或内存块。该偏移量大于所分配的大小20,并导致对相邻内存块的损坏(如果它们已经被分配了的话)。
[0032] 图1B描述了用汇编语言编译后图1A的代码实例。第1行使变量Buffer的地址被存储在寄存器r0中。在该实例中,大小为20,且变量Buffer保存具有由内存分配例程分配的20字节的大小的内存块或缓冲区的基址。为访问属于该内存块的任何位置,需要从基址到所需位置的偏移量。该偏移量或者直接被配置为数值,或者利用寄存器传递到存储(STR)指令。在存储指令执行期间,向CPU的算术逻辑单元(ALU)提供基址以及偏移量作为输入,且ALU生成最终内存地址作为输出。
[0033] 第2行使变量Buffer的内容被存储在寄存器r1中。第3行使整数0x25被存储在寄存器r2中。第4行使整数0x25从存储在寄存器r1中的地址移动偏移量15。由于所指定的偏移量在分配给内存块的大小以内,所以这不会导致溢出条件或违规。第5行使整数0x35被存储在寄存器r2中。随后,第6行使整数0x35从存储在寄存器r1中的地址移动偏移量42,由于偏移量42大于所分配的大小/偏移量20,所以这会产生溢出条件或违规。第
6行导致数据被写入所分配的内存块以外,并可能损坏相邻或附近的内存(如果它们已经被分配了的话)。
[0034] 图1C描述了指针操作的“C”程序代码。第1行从堆内存动态分配了20字节大小的缓冲区。第2行使变量Buffer的地址增加偏移量35,由于变量Buffer现在指向了所分配的内存块以外的地址,所以这将导致将来的违规。
[0035] 图1D描述了来自图1C的代码的汇编语言等价版。第1行使变量Buffer的地址被存储在寄存器r0中。第2行使包括在寄存器r0中的地址内容被存储在寄存器r1中。有效地,堆块的地址当前在寄存器r1中可用。第3行使堆块的基址与偏移量值35相加,致使最终内存地址被存储在寄存器r1中。有效地,第3行设置了指向20字节范围以外的地址的指针,并可能导致将来的违规。使用“ADD.A”而不是“ADD”来将此标识为有关内存访问的指令。第4行使寄存器r1的内容被存储在寄存器r0中保存的地址。因此,更新后的堆块地址被存回变量Buffer。
[0036] 本发明的发明人认识到,在运行时期间,传统的调试和计算机系统缺少充分监视和检查堆内存访问操作(诸如加载操作、存储操作和指针算术内存操作)的溢出的能。此外,需要认识到,由算术逻辑单元(ALU)计算的最终内存地址可以与先前存储的针对给定的基址的地址范围相比较,以确定内存访问是否违反了基址的有效范围。
[0037] 图2A是可以实施本发明的实例性计算机系统的示意图。该系统由从内存206获取指令并执行该指令的CPU204来操作。CPU204还访问内存206,以获得指令执行所需的数据或者更新数据作为指令执行的结果。需要理解,提供实例性计算机系统是用于说明的目的,且本发明可在其他适当的计算机系统中实施。
[0038] 图2B是示出可用本发明实施的内存206的典型组织的示意图。内存206具有内存起点和内存终点。在内存的起点和终点之间,有在该组织中内存的四个典型用途:程序内存206a、数据内存206b、堆内存206c和栈内存206d。程序内存206a包括待执行的程序指令。数据内存206b包括在编译时以及程序可执行之前已知的数据元素。这些数据元素具有所分配的地址。堆内存206c包括仅在程序运行时才知道的数据元素的地址。堆内存206c还可被称为动态内存。栈内存206d用于在嵌套程序调用期间保留程序的上下文。其还用于存储未保存在CPU寄存器中的活动程序的局部变量。需要理解,根据本发明,可采用其他适当的采用了堆内存或动态内存的内存组织。
[0039] 图2C是可实施本发明的实施方式的通用CPU架构210的框图。架构210包括内存206,该内存206包括程序内存、数据内存和堆内存。该架构还包括获取单元212、解码和控制单元214以及执行单元216。
[0040] 有CPU架构(诸如架构210)执行的几个基本任务。该架构获取指令、解码指令并从寄存器获取操作数、执行指令、访问内存以及将结果写回寄存器。
[0041] 内存206包括一种或多种类型的内存,其包括堆或动态内存。内存206还可包括其他类型的内存,其包括但不限于数据内存、程序内存和堆内存。内存206可如图2B所示或者以包括堆内存的其他适当的内存配置来组织。
[0042] 这里,获取单元212从内存206获取指令。该指令是根据所存储的由程序计数器指定的内存地址而被获取的。程序计数器包括下一指令的内存地址。内存地址标识了内存206中放置下一指令的位置。一般地,当前获取的指令存储在指令寄存器(未示出)中。
[0043] 指令包括至少一个操作码和至少一个操作数。操作码指定了操作类型以及执行什么。一些实例包括加、减、存储、加载、跳转等。操作数标识了待操作或运算的数据,且可包括寻址模式。
[0044] 解码和控制单元214解释或解码指令,并从寄存器单元获取操作数,以及激活数据路径的相关部分。解码和控制单元214从当前指令获取操作码和操作数。
[0045] 执行单元216基于指令的操作码,对从解码单元214接收到的操作数执行操作。来自解码单元214的信息可以是传送至相关单元并执行指令所要求的动作(诸如从寄存器读取值、传递用于数学或逻辑函数的值、将结果写入寄存器等)的控制信号的形式。这些指令生成的结果可被存储在内存中,或者发送至输出装置。通常,在执行当前指令之后,更新或递增程序计数器。
[0046] 调试逻辑230包括诸如断点处理、观察点、暂停和跟踪功能的基础结构,以检查和修改CPU上下文以及跟踪执行序列。
[0047] 需要理解,提供架构210是用于说明的目的,且无论有或没有管线的其他适当的架构均可被用于本发明。
[0048] 图2D是可实施本发明的实施方式的通用执行单元216的框图。执行单元216是可被用于图2C和本发明的适当单元的一个实例。提供执行单元216作为一个实例,且需要理解,根据本发明,可以使用其他类似单元。执行单元216包括算术逻辑单元216a、内存访问单元216b和寄存器写回单元216c。值得注意的是,上述单元是逻辑功能单元,并可在一个或多个硬件单元中实施。
[0049] 算术逻辑单元216a对操作数执行算术和逻辑运算,并生成输出和比较信号。内存访问单元216b是用于访问内存206的硬件,并用于有关内存的指令,包括有关内存访问的指令(诸如加载和存储指令)。寄存器单元216c控制并执行寄存器写操作,即,存储到寄存器。
[0050] ALU输出可被写入用于有关非内存访问和非程序控制的指令的寄存器。对于有关程序控制的指令,可用诸如跳转指令的ALU输出来更新或递增程序计数器。在内存访问指令的情况下,来自操作数的数据被存储在由ALU输出表示的内存位置,或者从内存位置读取数据并存储在寄存器中。控制信号触发内存访问单元216b,以从/向物理内存读取(在加载的情况下)或写入(在存储的情况下)。
[0051] 图3是示出根据本发明实施方式的堆溢出检测系统300的框图。该系统300跟踪所分配的堆内存块,并检测堆内存损坏(也被称为溢出错误或堆内存违规)。更具体地,系统300对加载、存储和指针算术指令识别有关内存访问的违规。系统300包括调试寄存器逻辑
302、地址违规检测逻辑304、地址范围文件306、跟踪缓冲区308、算术逻辑单元(ALU)310和数据路径312。需要理解,系统300中可存在其他未示出的部件。还需要理解,在系统300的可选实施方式中,可省略或修改一个或多个所列部件。
[0052] 寄存器逻辑302基于地址范围文件来处理堆内存的内存块的分配和去除。对于内存分配操作,寄存器逻辑302获取针对内存块的基址、大小和命令,并将这些存储在地址寄存器322、大小寄存器324和命令寄存器326中。基址是堆内存中的地址位置。大小是内存块的字节数。命令是在地址范围文件306中插入所分配的堆块的细节,或者从地址范围文件306中去除先前插入的内存块或缓冲区的条目。寄存器逻辑向地址违规检测逻辑304提供这些值。
[0053] 地址违规检测逻辑304包括地址范围文件306,该地址范围文件306包括关于所分配的堆内存块的条目。每个条目具有由所指定的大小确定的从基址或起始地址至结束地址的地址范围。在一种实施方式中,这些条目是对应于所分配的内存块的起始和结束地址的成对的内存地址。这些条目可以列表、栈或其他合适的数据结构来组织。
[0054] 基于从寄存器逻辑302接收到的插入命令,连同基址和大小来创建条目。地址违规检测逻辑304设置范围起点作为基址,并基于该基址和相应的内存块大小来计算范围终点。基于从寄存器逻辑302接收到的去除命令来去除条目。
[0055] 地址违规检测逻辑304还从ALU 310接收比较信号336和ALU输出338。同时,地址违规检测逻辑304也从数据路径312接收操作数346。比较信号336表示地址违规检测逻辑检查违规的堆内存访问。ALU输出是内存访问的最终地址,且由ALU 310计算。操作数346包括原始基址或由于指针/地址操作而修改了的基址,并被地址违规检测逻辑304使用,以从地址范围文件306识别范围文件条目或对,并确定最终地址是否落在所识别的范围内。若最终地址在所识别的条目的范围内,则没有违规。若最终地址在所识别的条目的范围以外,则违规。违规信号342和所确认的(原始的或修改的)违规基址344被发送至跟踪缓冲区308。
[0056] ALU 310接收操作码348、操作数346,并可从数据路径312接收一个或多个附加操作数。操作码348指定了待执行的操作。操作数346和附加操作数指定了指向内存位置的基址和偏移量。若操作码348指定了包括内存访问(诸如加载、存储或指针运算)的操作,则ALU 310向地址违规检测逻辑304发送比较信号336。比较信号336告知地址违规检测逻辑304检查内存访问操作。地址范围文件306中有条目或没有条目决定了内存访问是否是堆内存访问。ALU 310基于操作数346和附加操作数计算最终地址,并向地址违规检测逻辑304提供最终地址作为输出338。
[0057] 在堆内存访问违规的情况下,跟踪缓冲区308从地址违规检测逻辑304接收违规信号342和所确认的违规基址344。跟踪缓冲区308还可从数据路径312或诸如导致违规的程序计数器的其他地方接收或获取其他相关信息350。程序计数器是包括程序计数器值的寄存器(未示出),程序计数器值是刚被获取的指令的地址。对于管线架构,由于管线而对程序计数器值进行了调整。若检测到违规,则可追查出程序计数器值。程序计数器值一旦恢复,则在正执行的程序的符号查询表中进行搜索。符号表包括在符号文件或映射文件中,且包括数据和程序过程的地址。因此,可使用程序计数器值来指示违规中包括哪个过程。因此,可提供包括程序计数器值、违规中包括的过程和所确认的违规堆地址的上述信息作为输出352。
[0058] 数据路径312为数据提供在功能单元之间传输的路径。数据路径312是具有分布式物理实现的逻辑概念。其包括由(直接从指令或从寄存器文件提取的)操作数数据一直到ALU 310或内存访问单元所占用的路径。其还包括将ALU输出、结果或从内存加载的数据写回至CPU寄存器文件所占用的路径。
[0059] 图4是示出根据本发明实施方式的编译系统400的框图。编译系统400将程序代码从诸如“C”的高级语言转换为机器码。为了适当运行系统300,编译过程中需要约束来帮助系统300区分出有关内存访问的指令与可用的剩余指令,作为指令集的一部分。
[0060] 编译系统400包括诸如用C编写的程序的高级用户程序402。系统400还包括编译器404、策略约束408和约束机器指令406。高级程序不需要特殊代码或修改以便用系统300工作。然而,在编译时,编译器404使用策略约束408,以生成用堆溢出检测系统(诸如图3的系统300)可操作的约束机器指令406。
[0061] 在处理有关内存访问的计算(诸如内存地址的指针运算)时,策略约束408要求编译器仅使用专用指令。例如,当操作内存地址时,该约束可能禁止将“ADD”指令用于地址,且相反,要求诸如“ADD.A”的内存专用指令。值得注意的是,“ADD”和“ADD.A”仅是汇编指令的实例。约束408使ALU识别指令作为有关内存的指令以及建立比较信号变得简单。
[0062] 约束408通常将包括算术指令的指令集应用至CPU架构,该算术指令具有所分配的其操作数的至少一个仅包括内存地址。这种架构的指令集可另外包括算术指令,该算术指令的操作数不一定需要包括内存地址,但可以包括内存地址。这种约束在被应用时,减小了ALU所需要包括的为使ALU确定是否应当断言比较信号的硬件逻辑的数量。在没有这种约束的情况下,ALU需要其他硬件来确定是否断言比较信号。这是因为,ALU被迫将所有算术指令解释为使其操作数中的一个包括内存地址。需要理解,本发明的可选实施方式可以利用其他硬件来处理更通用的算术指令,且不需要策略约束408。
[0063] 图5是进一步示出系统300的地址范围文件306的框图。如上所述,地址范围文件306包括关于所分配的堆内存块的条目。每个条目都指定了从起始地址到结束地址的内存地址范围。响应内存分配请求(如连同基址和大小的插入命令)而添加条目。基于连同基址的去除命令来去除条目。
[0064] 在操作期间以及响应比较信号,使用包括基址的操作数来选择范围文件306中的条目。范围文件306包括被搜索以识别匹配条目的条目列表。若基址位于该条目的地址范围内,则匹配或识别条目。在一种实例中,基址匹配条目的起始地址。在另一实例中,基址匹配条目的地址范围内的地址,但不是条目的起始地址。若没有匹配,则基址引用了非堆内存位置(诸如栈或数据内存),且不执行检查。若有匹配,则使用ALU输出来确定所计算的最终地址是否在所识别或匹配的条目的内存地址范围内。ALU输出本质上是所计算的最终基址。
[0065] 图6A-图6D示出了使用堆溢出检测系统的各种运行时的实例,并援引图3的系统300作为根据本发明的合适的系统的一个实例。图6A是描述使用根据本发明的堆溢出检测系统的运行时执行的一个实例的示意图。在该实例中,检测溢出或内存访问违规。
[0066] 开始在602处,用户程序请求缓冲区或堆内存块的分配。内存分配器354分配堆内存块,并为所分配的堆内存块标识包括基址、内存大小和插入命令的分配信息。基址、内存大小和插入命令随后由内存分配器354传递至寄存器逻辑302的相应的地址寄存器322、大小寄存器324和命令寄存器326。基址、大小和插入命令随后从寄存器逻辑302被发送至在范围文件306中创建条目的地址违规检测逻辑304。因此,地址范围文件306当前具有关于所分配的堆内存块的条目。
[0067] 在604处,加载、存储或指针运算指令进入数据路径312。向ALU 310提供操作数、操作码和一个或多个附加操作数,ALU 310确定最终基址,并提供其作为ALU输出。ALU还识别该指令是加载、存储或指针运算指令,并向地址违规检测逻辑发送比较信号。此外,如图6A中的操作数1所示的操作数指定了基址,并被地址违规检测逻辑使用,来识别范围文件306中的条目。在该实例中,基址与在602处创建的条目相匹配。
[0068] 在606处,地址违规检测逻辑304将最终地址与所识别地址的范围相比较来确定最终地址是否在所分配的该内存块的范围内。若最终地址在所识别的条目的范围以外,则发生违规。向跟踪缓冲区308提供诸如调整后的程序计数器值和违规基址的有关违规的信息用于其他动作。
[0069] 图6B是描述使用根据本发明的堆溢出检测系统的运行时执行的一个实例的示意图。在该实例中,从地址范围文件306中去除条目。
[0070] 开始在612处,用户程序请求取消分配或释放缓冲区或堆内存块。内存分配器354根据所指定的基址来取消该堆内存块的分配。另外,内存分配器354向寄存器逻辑302的相应的地址寄存器322和命令寄存器326传递基址和去除命令,寄存器逻辑302反过来又向地址违规检测逻辑传递接收到的细节。地址违规检测逻辑304随后在地址范围文件306中识别一条目,并去除该条目。
[0071] 在614处,加载、存储或指针运算指令进入数据路径312。向ALU 310提供操作数、操作码和附加操作数,ALU 310确定最终基址,并提供其作为ALU输出。ALU还识别该指令是加载、存储或指针运算指令,并向地址违规检测逻辑发送比较信号。此外,操作数指定了基址,并被地址违规检测逻辑使用来识别范围文件306中的条目。在该实例中,未找到匹配条目,且因此没有违规。在616处,没有违规,因此不用向跟踪缓冲区提供什么。
[0072] 图6C是描述使用根据本发明的堆溢出检测系统的运行时执行的另一实例的示意图。在该实例中,系统确定了基址引用非堆内存位置,且因此,没有堆内存的溢出或内存访问违规。
[0073] 开始在622处,用户程序请求缓冲区或堆内存块。内存分配器标识基址、内存大小,并生成插入命令。基址、内存大小和插入命令随后被传递至寄存器逻辑302的相应的地址寄存器322、大小寄存器324和命令寄存器326。基址、大小和插入命令随后从寄存器逻辑302被发送至在范围文件306中创建条目的地址违规检测逻辑304。
[0074] 在624处,加载、存储或指针运算指令进入数据路径312。向ALU 310提供操作数、操作码和附加操作数,ALU 310确定最终基址,并提供其作为ALU输出。ALU还识别该指令是加载、存储或指针运算指令,并向地址违规检测逻辑发送比较信号。此外,操作数指定了基址,并被地址违规检测逻辑304使用来识别范围文件306中的条目。这里,基址不是在622处分配的堆内存块的基址。
[0075] 在626处,地址违规检测逻辑304确定该基址不与地址范围文件306中的条目对应。因此,该基址指向非堆内存位置。不向跟踪缓冲区308提供信息。
[0076] 图6D是描述使用根据本发明的堆溢出检测系统的运行时执行的另一实例的示意图。在该实例中,系统识别作为引用堆内存的地址,并确定没有发生溢出或内存访问违规。换句话说,发生了有效堆内存访问。
[0077] 开始在632处,用户程序请求缓冲区或堆内存块。内存分配器单元标识基址、内存大小,并生成插入命令。基址、内存大小和插入命令随后被传递至寄存器逻辑302的相应的地址寄存器322、大小寄存器324和命令寄存器326。随后,在范围文件306中创建条目的地址违规检测逻辑304引用该基址、大小和插入命令。
[0078] 在634处,加载、存储或指针运算指令进入数据路径312。向ALU 310提供操作数、操作码和附加操作数,ALU 310确定最终基址,并提供其作为ALU输出。ALU 310还识别该指令是加载、存储或指针运算指令,并向地址违规检测逻辑发送比较信号。此外,操作数指定了基址,并被地址违规检测逻辑304使用来识别范围文件306中的条目。
[0079] 在636处,地址违规检测逻辑304确定该基址对应于地址范围文件306中的条目。地址违规检测逻辑将ALU输出与从地址范围文件306中识别的条目的范围相比较,并确定没有违规。由于没有违规,所以不向跟踪缓冲区308提供信息。
[0080] 图7是示出根据本发明实施方式的检测堆内存溢出的方法700的流程图。所示方法700按顺序发生,然而,需要理解,方法700的块可以其他合适的顺序来执行。此外,需要理解,可采用或不采用上文所述实施方式来执行方法700。
[0081] 该方法始于块702,其中,接收有关内存访问的指令。该指令包括操作码和操作数,且可包括一个或多个附加操作数。操作数包括基址,且一个或多个附加操作数可包括偏移量或其他信息。在一种实例中,有关内存访问的指令被诸如图2C的架构210的处理器架构获取,并被解码和执行。
[0082] 在块704处,根据有关内存访问的指令生成最终地址。该最终地址由算术逻辑单元根据内存访问操作中存在的操作数和一个或多个附加操作数而生成。在一种实例中,该一个或多个附加操作数包括从存储命令的基址的偏移量。在另一实例中,该一个或多个操作数指定了指针位置的运算尺度。
[0083] 在块706处根据操作码生成比较信号。该操作码标识了有关内存访问的操作,诸如加载、存储或指针运算。若操作码未指定有关内存访问的指令,则方法700结束当前指令,且不生成比较信号。一般地,由于地址违规检测逻辑在接收到比较信号之后开始执行其功能,所以在ALU输出之后或与其一起生成比较信号。若未提供比较信号,则地址违规检测逻辑可以只是忽略ALU输出。
[0084] 在块708处,根据从内存访问指令获取的基址在地址范围文件中识别一条目。通过检索地址范围文件中的条目列表来识别或匹配该条目。若基址位于该条目的地址范围内,则识别或匹配条目。基址可以仅是操作数。在一种实例中,基址对应于所分配的堆内存块的起始地址。在另一实例中,基址或操作数对应于由之前执行的指针操作引起的修改后的起始地址。若针对该基址在地址范围文件中未识别出条目,则可以假定该基址不对堆内存块寻址,且未识别出堆内存访问违规。所识别的条目为所分配的堆内存块或缓冲区指定了地址范围。在一种实例中,地址违规检测逻辑参照地址范围文件来识别相应的条目。
[0085] 在块710处,将最终地址与所识别的条目相比较,以确定是否已发生堆内存访问的违规。若最终地址落在所识别条目的地址范围内,则未发生堆内存的违规。然而,若最终地址落在所识别条目的地址范围以外,则发生了违规。可向跟踪缓冲区等发送信息(包括但不限于基址和程序计数器值)以进一步辅助调试操作。
[0086] 基于内存分配器执行的内存分配,向地址范围文件添加堆内存条目。根据架构分配的地址和所需的大小来创建条目。基于到内存分配器的内存去除或取消分配请求,从地址范围文件中去除堆内存条目。这里,内存去除请求指定了该条目的基址或起始地址,它标识该条目并随后将其去除。
[0087] 尽管已参照一种或多种实施示出并描述了本发明,但在不背离所附权利要求的思想和范围的情况下,可对所示实例进行替换和/或修改。
[0088] 此外,尽管本文针对处理器架构和内存组织描述了本发明,但需要理解,其他架构、内存组织等也可用于本发明的实施方式。
[0089] 此外,尤其是对于由上述部件或结构(组件、装置、电路、系统等)执行的各种功能,除非另有指明,否则即使不与执行本文所示本发明的示例性实施的功能的所公开的结构在结构上等效,用于描述这些部件的术语(包括对“方法”的引用)旨在对应于执行所述部件的指定功能的任何部件或结构(例如,功能上等效)。另外,尽管已针对若干实施中的仅一个公开了本发明的具体特征,但当对于任何给定的或具体的应用可能是期望和有利的时,该特征可与其他实施的一个或多个其他特征结合。此外,关于在详细描述或权利要求中使用的术语“包括”、“含有”、“具有”、“有”、“带有”或其变形的范围,这些术语旨在以类似于术语“包含”的方式来说明范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈