CN105556466A - 代码堆栈管理 - Google Patents
代码堆栈管理 Download PDFInfo
- Publication number
- CN105556466A CN105556466A CN201480051802.3A CN201480051802A CN105556466A CN 105556466 A CN105556466 A CN 105556466A CN 201480051802 A CN201480051802 A CN 201480051802A CN 105556466 A CN105556466 A CN 105556466A
- Authority
- CN
- China
- Prior art keywords
- stack
- code
- code stack
- function
- entry
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30134—Register stacks; shift registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
- G06F9/4484—Executing subprograms
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
实施例涉及代码栈管理。一个方面包括配置为执行软件应用的处理器。另一个方面包括代码栈存储器区域和数据栈存储器区域,代码栈存储器区域与数据栈存储器区域分离。另一个方面包括将数据栈保持在数据栈存储器区域中,数据栈包括多个栈帧,该多个栈帧包括与软件应用的执行相对应的一个或者多个数据变量。另一个方面包括将代码栈保持在代码栈存储器区域中,代码栈包括多个代码栈条目,该多个代码栈条目包括与软件应用的执行相对应的可执行计算机代码。
Description
技术领域
本发明通常涉及计算机系统,并且更具体地涉及执行计算机程序期间的代码堆栈管理。
背景技术
计算机系统典型地包括计算机程序和硬件(诸如半导体、晶体管、芯片、电路板、存储设备和处理器)的组合。存储设备存储数据和由处理器执行的计算机程序。
计算机程序通常分成彼此调用的片段。片段典型地称为方法、函数、模块、部分、类、程序或者子例程。当第一方法(调用方)调用第二方法(被调用方)时,调用方的方法停止执行以及被调用方的方法获得处理器的控制并且开始执行。当被调用方的方法停止执行时,它将处理器的控制返回至调用方的方法,调用方的方法在调用被调用方的方法的调用指令之后的下一个指令处重新开始执行。
为了促进该调用和返回技术,计算机可以使用调用栈,也称为运行期栈、函数栈、执行栈、调用栈或者简称栈。调用栈包括每个主动方法的条目(也称为帧)。条目存储关于执行其相应方法的信息。信息可以包括方法的标识符、方法的返回地址(在被调用方的方法返回之后接着执行的调用方的方法中的指令位置)、由方法读取或者写入的局部变量的值、传递至方法的参数、用于算术运算或者逻辑运算的操作数的求值栈、指向方法当前实例的指针、封装方法上下文和/或方法的特权或者授权级别中的任何一个、一些或者全部。
调用栈使用后进先出(LIFO)原则,意思是添加(推入)至调用栈顶部的最后(或者最近)条目是从调用栈顶部移除(弹出)的第一(或者下一个)条目。例如,响应于第一方法调用第二方法,新条目被创建以保存第一方法的上下文以及容纳第二方法的局部变量并且被推至调用栈顶部。如果第二方法调用第三方法,则保存第二方法上下文以及容纳第二方法局部变量的新条目被推至调用栈上。一旦当前执行的方法结束,则其调用方的方法的条目从栈顶部弹出并且用于恢复调用方的方法的运行环境。由于许多方法可以彼此调用并且调用可以是嵌套或者甚至递归的,因此调用栈随着程序执行而增长和缩小。
在计算机程序中,嵌套函数(还称为嵌套程序或者嵌套子例程)是在词法上封装在另一个函数(称为当前函数)内的函数。在许多方法中,嵌套函数用于结构化编程。由于嵌套,嵌套函数的范围在嵌套函数的当前函数内。这意味着嵌套函数可以访问当前函数中从当前函数外部不可见的局部变量和其它局部函数以及局部常量和类型。尽管在实用程序中通常仅使用少数级别,但是理论上嵌套可以到任何级别的深度。在一些环境中,嵌套函数的代码动态地生成并且一直持续到从当前函数和其子例程退出。这种动态生成的代码的示例是蹦床函数和信号处理程序。操作系统可以将该动态生成的代码分配在调用栈上。
发明内容
实施例包括用于代码栈管理的方法、系统和计算机程序产品。一个方面包括配置为执行软件应用的处理器。另一个方面包括代码栈存储器区域和数据栈存储器区域,代码栈存储器区域与数据栈存储器区域分离。另一个方面包括将数据栈保持在数据栈存储器区域中,数据栈包括多个栈帧,该多个栈帧包括与软件应用的执行相对应的一个或者多个数据变量。另一个方面包括将代码栈保持在代码栈存储器区域中,代码栈包括多个代码栈条目,该多个代码栈条目包括与软件应用的执行相对应的可执行计算机代码。
附图说明
在说明书结论处的权利要求中特别指出了被看作实施例的主题并且对其明确地要求保护。通过与附图结合理解的下列详细说明,实施例的前述特性和其它特性以及优点是显而易见的。
图1描绘了根据实施例的用于代码栈管理的计算机系统;
图2A-2C描绘了数据栈和代码栈的实施例;
图3描绘了根据实施例包括使代码栈与数据栈同步的代码栈管理的过程流程;
图4-5描绘了根据各种实施例的代码栈管理的过程流程;
图6描绘了数据区域和代码栈的实施例;以及
图7图示了根据实施例的计算机程序产品。
具体实施方式
提供了代码栈管理的实施例,在下面对示例性实施例详细地进行讨论。将动态生成的代码分配到调用栈上可以使计算机系统容易受到安全性攻击(诸如栈溢出情况)。为了提高安全性,在计算机存储器中保持包括数据栈和代码栈的两个单独的并且不同的栈。数据栈可以位于可写入的不可执行存储器区域中,而代码栈可以位于可执行存储器区域中。在一些实施例中,除了将新条目分配到代码栈上期间以外,可以使代码栈不可写入,并且还可以在将新条目分配到代码栈上期间使代码栈不可执行。因此,通过不可执行数据栈和单独代码栈防止对应用的安全性攻击。分离的代码栈和数据栈允许动态生成的代码在增强安全性的同时为例如事件处理程序和词法嵌套提供蹦床函数。
可以将蹦床函数分配在代码栈上。蹦床函数是在获得嵌套函数地址的运行时间创建的一小段代码。蹦床函数中的指令必须做两件事情:将常数地址加载到静态链寄存器中,并且跳转至嵌套函数的实地址。这可能需要两个指令:立即移动和跳转。两个地址可以存在于蹦床函数中作为字长立即操作数。可能需要将每个地址以两个部分加载到寄存器中;每个地址段形成单独的立即操作数。
生成以初始化蹦床函数的代码必须将静态链值和函数地址存储到指令的立即操作数中。静态链和函数入口地址可以存储在位于代码栈外部的单独数据区域中。数据区域还可以可选地容纳代码栈管理信息,诸如用于对代码栈条目(诸如代码栈帧分配大小和关联数据栈帧)进行分配和解除分配。在一些实施例中,蹦床函数在分配之后是不可变的,并且配置为与指向通过写入单独数据区域存在的嵌套函数的指针结合使用。数据区域不容纳可写代码,从而避免代码注入到可写的可执行蹦床函数中的风险。
图1图示了用于代码栈管理的计算机系统100的实施例。计算机系统100包括执行软件应用104的处理器101,软件应用104包括存储在计算机系统100的存储器105中的可执行计算机代码。在执行应用104期间,处理器101管理数据栈102和代码栈103。数据栈102位于存储器105中的数据栈存储器区域106内,该数据栈存储器区域106包括可写的不可执行存储器区域。代码栈103位于存储器105中的代码栈存储器区域107内。代码栈存储器区域107包括可执行存储器区域。数据栈存储器区域106与代码栈存储器区域107分离并且不同,并且不与代码栈存储器区域107重叠。在一些实施例中,除了将条目分配到代码栈103上期间以外,代码栈存储器区域107可以是不可写的。在另外的实施例中,在将条目分配到代码栈103上期间,可以在将条目分配到代码栈103上期间使代码栈存储器区域107暂时不可执行。在一些实施例中,代码栈存储器区域107可以是可由计算机系统100的可信组件(诸如内核或者另一个系统组件,其可以包括,但不限于可信程序库、受管理的运行期环境或者管理程序系统)专门写入的。
在一些实施例中,可以通过用动态生成的蹦床函数预填充存储器页面以进行嵌套函数的条目在代码栈103上的分配。在另一个实施例中,可以通过使代码栈存储器区域107暂时可写将与蹦床函数相对应的一个或者多个条目分配到代码栈103上。在将与预填充的蹦床函数相对应的代码栈条目分配在代码栈103上之后,将代码栈存储器区域107设定为可执行的并且不可写的。在代码栈存储器区域107在将与蹦床函数相对应的条目分配在代码栈103上期间不可执行的实施例中,可以提供恢复代码以供应用104中并行执行的任何其它线程使用。代码栈103中与蹦床函数相对应的条目的数据(诸如静态链数据和函数地址数据)可以存储在存储器105中的单独数据区域中(诸如数据区域113);这在下面关于表格1A-B和图6进行了更详细的讨论。
在一些实施例中,立即将具有限制许可(诸如不能读取、不能写入和不能执行许可的组合)的一个或者多个存储页面设置在存储器105中的代码栈存储器区域107前和/或后以通过例如位于代码栈存储器区域107区域附近的缓冲区的溢出或者下溢防止任何意外的引用、溢出或者下溢到达代码栈存储器区域107。还可以可选地将一个或者多个保护页面设置在代码栈存储器区域107中的代码栈103上面和下面以用于进一步保护代码栈103。
每个代码栈条目可以具有数据栈102中的相应栈帧,并且与分配代码栈条目的栈帧相对应。栈帧可以由处理器101自动地分配和解除分配,并且可以保持任何适当的变量。代码栈存储器区域107可以相对远离数据栈存储器区域106地设置在计算机系统100的存储器映射中以避免对代码栈存储器区域107的意外或者恶意写入。
在表格1A中示出了蹦床函数代码的示例。在一些实施例中,诸如表格1A所示的蹦床函数代码可以插入在代码栈103中的多个条目中,以及代码栈103中的这些条目中的每一个可以具有为代码栈103中的每个蹦床函数指定唯一相应函数地址和静态链的对应相应数据区域(诸如数据区域113)。
表格1A:示例蹦床函数代码
参照表格1A的代码,在由标签“trampoline_initial”指示的位置处用适合于将容纳所调用函数的返回值的链路寄存器读到寄存器r0中的指令“mflrr0”开始执行。指令“bl.+4”适合于典型地在生成下一个指令的值时用作返回地址,并且将控制转移至如指示当前地址加4个字节的记数法“.+4”指示的下一个指令。指令“mflrr11”将该地址从链路寄存器加载到寄存器r11中以稍后用作寻址引用。指令“mtlrr0”将先前加载到r0中的返回地址恢复到链路寄存器lr中。指令“ldr12,8192(r11)”使用寄存器r11作为寻址基址并且增加偏移8192以计算位于偏移2*4KB(即,来自该蹦床函数的执行代码的两个页面)处的关联数据区域的地址以把将用作函数地址的地址加载至要传递控制的指令。指令“ldr11,8200(r11)”加载来自关联至寄存器r11的数据区域的值,该值用作静态链值。指令“mtctrr12”将容纳与嵌套函数相对应的程序性代码的函数的起始地址加载到ctr(计数寄存器)中并且指令“bctr”分支到ctr中的值,即,将控制传递至已编译函数。
在一些实施例中,在代码栈103中使用非齐次代码,以及每个代码栈条目具有单独并且不同的大小。在其它实施例中,代码栈条目各自包括齐次蹦床函数,使得可以通过建立每个蹦床函数的关联数据区域113以及消除跟踪蹦床函数大小的必要以对蹦床函数进行配置。在一些实施例中,如果需要许多不同代码序列,则可以将各自与不同代码序列相对应的多个齐次代码栈保持在存储器105中。在代码栈103包括齐次代码栈的实施例中,当新蹦床函数的条目分配到代码栈103上时,由于蹦床函数已经存在于已经初始化以保持固定代码序列的代码栈存储器区域107中,则不需要对所分配代码栈条目进行写入。先前存在的蹦床函数引用与代码栈条目相关联的存储器105的单独数据区段中的数据区域113。因此,当创建指向嵌套函数的新函数指针时,代码栈条目的分配包括初始化与数据区域113中的蹦床函数相关联的数据(诸如函数地址和静态链)。这在下面关于图6进行了更详细的讨论。
在一些实施例中,预填充的蹦床函数的代码栈103与位于存储器105中每个蹦床函数的固定偏移处的数据区(诸如数据区域113)相关联。在一些实施例中,偏移对所有蹦床函数都一样;在表格1A中图示了这种实施例,其中与代码栈103中的代码栈条目相关联的每个数据区域113在来自由bl.+4指令加载的地址的8192个字节处开始,该bl.+4指令加载指令地址、当前指令地址和下一个指令地址中的一个的值。在一些实施例中,与代码栈条目相关联的数据区域113保存初始化嵌套函数在通过指向引用代码栈中存储的蹦床函数的嵌套函数的函数指针调用时的执行环境需要的信息。在一些实施例中,通过加载嵌套函数指针环境创建函数指针,诸如,例如指向容纳指向该嵌套函数静态作用域的动态实例的嵌套函数的指针的环境的静态链,该静态作用域存储在与由bl.+4加载的值偏移8200处(与两个4KB页面加8个字节相对应)。另外,嵌套函数与其为之创建环境的函数的入口地址相关联,使得入口点位于距由bl.+4加载的值8192处(与两个4KB页面相对应),即,在静态链之前双字处。
在一些实施例中,通过对距容纳蹦床函数代码的代码栈条目限定(静态)偏移距离处的固定大小数据区域进行分配以使蹦床函数代码与容纳附加配置逻辑的数据区域113相关联。然而,当代码栈的大小超过偏移时,由于进一步扩展将要求数据区域113与先前分配的代码栈条目重叠,因此达到进一步扩展的极限。在一些实施例中,可以根据需要改变该距离并且当偏移改变时移动代码栈条目和数据区域中的至少一个,如表格1A所示,进一步更新蹦床函数的所有偏移,该蹦床函数与偏移8192和8200相对应。在一些实施例中,可以移动数据区域113,并且由于移动代码需要对指向存储在代码栈条目中的代码的所有指针进行更新,因此不移动代码栈条目。
在其它实施例中,不通过固定偏移而是通过逻辑关联在代码栈条目与数据区域之间形成对应。例如,起始于地址cb-i*cs(其中cb是代码栈基地址,即,空代码栈的代码栈指针的初始值,i是已经被分配的第i个栈帧以及cs是代码栈的固定代码的预定义代码大小)的第i个代码栈条目可以与数据地址db-i*ds(其中db是数据库地址,即,与第一代码栈条目相关联的第一数据区域113的起点、终点或者其它对应地址,i是已经被分配的第i个数据区域113,以及ds是数据区域113的预定义大小)处的第i个关联数据区域相关联。当ds相对较小时,可以在必须移动代码栈的代码栈条目或者数据区域113之前分配(db-cb)/ds栈帧。在下面的表格1B中,示出了使用函数对应计算偏移的蹦床函数代码的示例,其中为每个条目计算每个偏移以使得偏移=i*(ds+cs)+(ds-cs)+调节量。
表格1B:示例蹦床函数代码
在另一个实施例中,为了避免由于代码栈条目与数据区域冲突而移动数据区域,代码栈沿一个方向增长,以及数据区域沿另一个方向增长,例如,代码栈条目被分配在递减地址(cb-i*cs)处以及关联数据区域113分配在递增地址(db+i*ds)处。在一些实施例中,db=cb。在一些实施例中,还在与每个代码栈条目相关联的数据区域113中设置另外的环境信息(诸如调试和展开信息)以使能调试和异常处理。
图2A-C图示了数据栈和代码栈的实施例200A-C。图2A和2B示出了与图1的数据栈102相对应的数据栈201,以及与图1的代码栈103相对应的代码栈203。数据栈201包括多个栈帧202A-N。栈帧202A-N的每个栈帧保存与应用104的函数相对应的一个或者多个变量。数据栈201中的栈帧202A-N由处理器101自动地管理;即,响应于由应用104执行的代码,如应用104所需要的对代码栈203中的栈帧202A-N进行自动分配和解除分配。代码栈203包括多个代码栈条目204A-N,容纳例如蹦床函数代码或者可以以LIFO方式管理的其它动态生成的代码。在一些实施例中,代码栈203中的每个代码栈条目容纳指向数据栈201中的关联栈帧的指针(例如,存储在与代码栈条目相对应并且指示创建代码栈条目的函数的栈帧的数据区域113中);如图2A所示,代码栈条目204B包括指向引用栈帧202B的关联栈帧的指针207A,以及代码栈条目204D包括指向引用栈帧202D的关联栈帧的指针207B。数据栈指针206引用数据栈201中的最近条目(例如,栈帧202N)并且用于管理数据栈201。CSP205引用代码栈203中的最近条目(例如,代码栈条目204N)并且用于管理代码栈203。图2B示出了包括代码栈条目204N的代码栈203的实施例200B,该代码栈条目204N具有不指向数据栈201中有效栈帧202N的指向关联栈帧的指针207C。在下面关于图3对图2B进行更详细的讨论。仅为了图示目的示出了图2A-B;数据栈201和代码栈203可以各自包括任何适当数量的条目。此外,尽管在图2A-B中数据栈201和代码栈203示出为向下增长,但是数据栈201和代码栈203可以各自在存储器105中沿任何适当方向增长。
图2C示出了与栈帧202A-N和代码栈条目204A-N相关联的信息的实施例。与栈帧202A-N的栈帧相对应的栈帧210包括多个示例数据变量VAR1-VAR3。这些变量可以包括任何类型的任何适当变量,并且在栈帧210中可以有任何适当数量的变量。如图2C所示,代码栈条目204A-N的每个代码栈条目可以包括具有关联代码栈头212的代码栈条目211。在一些实施例中,代码栈头212包括代码栈屏障(CSB)213。代码栈头212还包括指向关联栈帧(诸如与代码栈条目211相关联的栈帧210)的指针215。在各种实施例中,代码栈头212可以位于如图2C所示代码栈203中的代码栈头的相应代码栈条目211内,或者,在其它实施例中,可以是位于代码栈203外部(例如,在数据区域113中)的单独数据结构。在一些实施例中,CSB213可以保持在单独寄存器中或者作为栈帧210中的变量。代码栈条目211还包括代码区段216。代码区段216包括可执行计算机代码;在一些实施例中,代码区段216包括与指向嵌套函数的函数指针相对应的蹦床函数代码。在一些实施例中,蹦床函数代码可以通过将静态链加载到寄存器中以及随后将控制传递至位于代码栈203外部的函数以初始化静态嵌套函数的环境。
可以由处理器101对数据栈201中的栈帧202A-N进行自动管理(即,分配和解除分配)。在一些实施例中,如下所述可以关于用于图3中图示的代码栈同步的方法300进行代码栈203中的代码栈条目204A-N的管理。在将新代码栈条目分配在代码栈203上之前,可以执行方法300以从代码栈203移除任何无效条目。首先,在图3的块301中,对于最近代码栈条目(例如,图2B的代码栈条目204N),检索指向关联栈帧的指针(例如,如图2B所示,指向被解除分配的或者无效的栈帧的指针207C)。代码栈203中的最近代码栈条目是由CSP205指向的代码栈条目。接着,在块302中,判断所检索的指向关联栈帧的指针是否指向数据栈201中的有效栈帧。这可以通过将指向块301中检索的关联栈帧的指针与数据栈指针206进行比较来判断。在数据栈201和代码栈203向下增长的实施例中,如果指向关联栈帧的指针具有的值小于数据栈指针206的值,则在块302中确定指向关联栈帧的指针不指向数据栈201中的有效条目。例如,如图2B所示,由于指向关联栈帧的指针207C指向位于数据栈指针206下面(即,小于数据栈指针206)的存储器区域,因此指向与代码栈条目204N相关联的栈帧的指针207C不指向数据栈201中的有效条目。如果在块302中确定指向关联栈帧的指针不指向数据栈201中的有效栈帧,则流程从块302进行至块303,其中代码栈中的最近条目从代码栈203解除分配。这可以通过将CSP205在代码栈203中向上移动一个条目来完成。例如,在块303中,如图2B所示,将CSP205向上移动以指向代码栈条目204M,并且代码栈条目204N被解除分配。流程从块303随后返回至块301,并且重复方法300直到在块302中确定指向与代码栈203中最近代码栈条目相关联的关联栈帧的指针指向数据栈201中的有效栈帧,此时流程从块302进行至块304。在块304中,将新代码栈条目分配在代码栈203上。最后,在块305中,将CSP205设定为指向在块304中分配的新代码栈条目,并且方法300结束。
下面关于表格2示出了分配新代码栈条目的示例,以及下面关于表格3示出了从指向数据栈中无效条目的代码栈条目的代码栈解除分配的示例(如上面关于图3讨论的)。
表格2:分配示例
表格3:解除分配示例
尽管表格2-3所示代码使用与分配在存储器区域中并且与单独索引csp_frame_index结合处理的每个帧指针相关联的不同跟踪结构csp_frame[MAX],其中第一索引与第一分配代码栈条目相对应,以及第二索引与第二分配代码栈条目相对应,以此类推,但是其它组织形式可以与各种实施例中代码栈管理的实施例结合使用。在一些实施例中,代码栈条目大小是固定的并且不与帧信息结合存储。在一些实施例中,当单独数据区域113存在时,代码栈条目信息存储为关联至代码栈条目的数据区域113的一部分或者与数据区域113结合存储。在一些实施例中,代码栈条目信息存储为代码栈条目的一部分或者与代码栈条目结合存储(无论单独数据113是否存在)。
在另外的实施例中,可以通过根据方法400-500中的任一个对代码栈条目进行分配和解除分配以进行代码栈管理,在下面关于图4-5对方法400-500进行讨论。在图4-5的方法400-500中,当分配代码栈条目的函数退出时,可以从代码栈103/203明确地移除代码栈条目。在代码栈保持与指向嵌套函数的函数指针相对应的蹦床函数代码的一些实施例中,蹦床函数代码可以通过将静态链加载到寄存器中以及随后将控制传递至位于代码栈203外部的函数以初始化静态嵌套函数的环境。当为嵌套函数创建函数指针的当前函数退出创建时,蹦床函数代码被解除分配。
图4-5的如下讨论假定代码栈103/203和数据栈101/201在存储器105中向下增长;然而,这仅针对例示性目的。在一些实施例中,代码栈103/203和数据栈101/201可以向上增长;在这种实施例中,可以做出适当调节,诸如,例如,用大于(>)比较替代小于(<)比较,或者用加(+)运算替代减(-)运算。在又另外的实施例中,代码栈103/203可以向上增长,以及数据栈101/201可以向下增长;或者代码栈103/203可以向下增长,以及数据栈101/201可以向上增长。
在方法400-500期间,在一些实施例中,代码栈存储器区域107仅在当前在代码栈103/203中对代码栈条目进行分配或者解除分配时是可写的。在另外的实施例中,代码栈存储器区域107仅可由计算机系统100的安全可信系统组件(例如,内核、可信程序库、受管理的运行期环境或者管理程序)写入。在一些实施例中,可以通过对使代码栈存储器区域107与动态生成的蹦床函数相对应的存储页面进行预填充以将代码分配到代码栈103/203上。在另一个实施例中,在单独不可执行的可写区域中生成与动态生成的蹦床函数相对应的代码并且可信组件随后可以将代码栈条目分配在与这些蹦床函数相对应的代码栈103/203上;代码栈条目可以包括蹦床函数代码。
图4图示了用于代码栈管理的方法400的实施例。与保持CSP205的计算机系统100的实施例结合执行方法400,该CSP205指向代码栈203中最近增加的条目(例如,代码栈条目204N)和分配大小214。首先,在块401中,执行当前函数,该当前函数可以创建代码栈条目以用于与嵌套函数的函数指针结合使用,以及保存CSP205的当前值。CSP205的当前值可以保存在任何适当的存储器位置中。在一些实施例中,通过将当前函数的CSP存储在数据栈上以进行保存。在另一个实施例中,通过由例如编译器或者编程器将当前函数代码中的校正值编码在指令存储器中进行保存。随后,在块402中,将用于与指向嵌套函数的函数指针结合使用的代码栈条目分配在代码栈203上。对于代码栈203向下增长的实施例,这通过将CSP205设定为等于CSP205的当前值减去为新代码栈条目分配的存储器大小(即,CSP<=CSP-分配的存储器大小)进行。在一些实施例中,分配的存储器大小与预填充代码段(诸如表格1A所示的示例代码段)的大小相对应。在一些实施例中,将与指向嵌套函数的指针结合使用的蹦床函数的代码写入到代码栈103/203上的新代码栈条目中。代码栈存储器区域107在分配新代码栈条目期间是可写的;在另外的实施例中,代码栈存储器区域107在任何其它时间都不可写。在另外的实施例中,代码栈存储器区域107还可以在分配新代码栈条目期间设定为不可执行。在一些实施例中,插入到代码栈条目中的代码可以包括动态生成的蹦床函数。在包括预填充蹦床函数的实施例中,代码栈存储器区域107先前已经被初始化以容纳分配至新代码栈条目的代码,并且因此已经容纳代码栈条目中的必要代码。在包括预填充蹦床函数的另外实施例中,还为代码栈条目将关联数据区域113分配在存储器105中。在将新代码栈条目分配到代码栈103/203上之后,将代码栈存储器区域107设定为可执行,以及在一些实施例中设定为不可写。
在将代码栈条目分配在代码栈上以与指向嵌套函数的函数指针结合使用之后,指向嵌套函数的函数指针可用于由当前函数在执行当前函数以及所有其相应子例程期间使用。在一些实施例中,当前函数可以多次执行块402,用于创建指向一个或者多个嵌套函数的多个指针。在其它实施例中,当前函数可以基于在运行时间计算的条件以执行块402。例如,在一些实施例中,将块402中创建的蹦床函数的地址分配至函数指针。函数指针随后可以用于例如从创建函数指针的当前函数调用的子例程中,允许嵌套函数对当前函数的状态进行引用。
接着,在块403中,当前函数退出。将属于当前函数的嵌套函数的所有代码栈条目从代码栈103/203移除。这通过将CSP205设定为等于块401中保存的CSP值(例如,将CSP205向上移动到在块402中创建的任何代码栈条目上方)来进行。在一些实施例中,从CSP205在块401所保存的存储器位置恢复CSP205。在一些实施例中,该存储器位置位于数据栈上。在其它实施例中,通过计算旧的CSP(例如,通过从CSP205的当前值(在代码栈向下增长的实施例中)加上,或者(在代码栈向上增长的实施例中)减去在执行块402的一个或者多个实例期间由当前函数分配的累积分配大小214)来恢复CSP205。在一些实施例中,调节因数有形地体现在指令序列中。
在一些实施例中,代替如关于块403描述的函数退出,在块404中执行从当前函数的替代退出。可以通过结构化异常处理或者setjump()/longjump()同时退出一个或者多个函数。在一些实施例中,如果已经分配至少一个代码栈条目的当前函数退出,作为longjump(长跳)或者异常处理情况跨越这种多个级别的控制转移的一部分,则CSP205设定为指向被跳转或者异常处理情况当作目标的代码栈条目。在一个实施例中,如下面在表格4中所示,扩展jmp_buf以包括恢复CSP的值。
表格4:示例longjump/异常处理代码
在包括结构化异常处理程序的块404的另外实施例中,在展开数据栈期间扩展展开信息以恢复CSP205,其中栈帧从数据栈连续地移除。在一些实施例中,在栈展开期间,基于指示展开表格中保存的CSP值的存在并且容纳指示CSP位置(例如,在数据栈帧中的位置中)的信息的指示器恢复CSP。在各种实施例中,CSP保存在通用寄存器、地址寄存器、专用寄存器或者存储器位置中。
图5图示了用于代码栈管理的方法500的另一个实施例。与保持CSP205和CSB213的计算机系统100的实施例结合执行方法500。首先,在块501中,执行当前函数。接着,在块502中,当前函数存储等于当前CSP205的CSB。随后,在块503中,将包括与指向嵌套函数的函数指针结合使用的蹦床函数的代码栈条目分配在代码栈203上(例如,在由当前函数调用的子例程中)。对于代码栈203向下增长的实施例,这通过将CSP205设定为等于CSP205的当前值减去为新代码栈条目分配的存储器大小(即,CSP<=CSP-分配的存储器大小)进行。在一些实施例中,分配的存储器大小与预分配代码段(诸如表格1A所示的示例代码段)的大小相对应。将与指向嵌套函数的函数指针相对应的蹦床函数的代码写入到代码栈103/203底部处的新代码栈条目中。代码栈存储器区域107在分配新代码栈条目期间是可写的;在另外的实施例中,代码栈存储器区域107在任何其它时间都不可写。在另外的实施例中,代码栈存储器区域107还可以在分配新代码栈条目期间设定为不可执行。在一些实施例中,插入到代码栈条目中的代码可以包括动态生成的蹦床函数。在包括预填充蹦床函数的实施例中,先前已经将代码栈条目的代码写入代码栈存储器区域107。在包括预填充蹦床函数的另外实施例中,还为代码栈条目将关联数据区域113分配在存储器105中。在将新代码栈条目分配到代码栈103/203上之后,代码栈存储器区域107是可执行的,以及在一些实施例中是不可写的。
在将代码栈条目分配在与指向嵌套函数的函数指针结合使用的蹦床函数的代码栈上之后,可以使用指向嵌套函数的函数指针。在一些实施例中,对于多个嵌套函数,当前函数可以多次执行块503。在其它实施例中,当前函数可以基于在运行时间计算的条件以执行块402。例如,在一些实施例中,将块503中创建的蹦床函数的地址分配至函数指针。函数指针随后可以用于例如从创建函数指针的函数调用的另外的子例程中,允许嵌套函数对周围函数的状态进行引用。
在块504中,将保存的当前函数的CSB明确地恢复到CSP中,从而将由块503的一个或者多个实例分配的代码栈条目解除分配(例如,在当前函数的子例程中)。在一些实施例中,在块504之后,块503可以由当前函数重复一次或者多次。最后,在块505中,当前函数退出,而不对任何代码栈条目解除分配。作为替代,通过明确地执行块504而不是在块505中由当前函数对代码栈条目进行解除分配。在一些实施例中,当前函数在块504中不对它自己的条目解除分配,而是作为替代,当前函数的调用函数在调用当前函数之前执行块502,以及当当前函数505返回而没有对代码栈条目解除分配时调用函数执行块504。在执行当前函数期间,执行块502以记录CSB,以及执行块504以将所有代码栈条目丢弃在CSB之外;可以根据当前函数的需要执行块502和504。在各种实施例中,CSB可以存储在各种位置中,诸如数据栈、通用寄存器或者专用寄存器。
图6图示了包括与代码栈结合使用的数据区域(诸如图1的数据区域113)的系统600的实施例。系统600包括数据区域601和代码栈602。代码栈602包括多个代码栈条目;代码栈602上的代码栈条目中的一个包括蹦床函数代码603。蹦床函数代码603引用数据区域601中的相应数据区域604。如结合表格1A和1B的示例蹦床函数代码所示,数据区域604可以保存静态链值和函数入口地址。另外,数据区域604可以保存其它信息,诸如,关于图2C的代码栈头212示出的任何信息,例如,分配大小214和/或指向与分配包括蹦床函数代码603的代码栈条目的函数相对应的关联数据栈帧的指针215。如图6所示的数据区域601可以向上增长,以及如图6所示的代码栈602可以向下增长;然而,这仅针对例示性目的示出。
如本领域普通技术人员应当理解的,实施例的方面可以实现为系统、方法或者计算机程序产品。相应地,实施例的方面可以采取完全硬件实施例、完全软件实施例(包括固件、常驻软件、微代码等等)或者结合软件和硬件方面的实施例的形式,它们全部在此通常可以被称为例如“电路”、“模块”或者“系统”。此外,实施例的方面可以采用体现在一个或者多个计算机可读存储设备中的计算机程序产品的形式,该一个或者多个计算机可读存储设备具有体现在其上的计算机可读程序代码。
可以以软件、固件、硬件或者它们的某个组合实现实施例的性能中的一个或者多个。此外,可以模拟性能中的一个或者多个。
参照图7,实施例的一个或者多个方面可以包括在具有例如计算机可读存储介质701的制造品(例如,一个或者多个计算机程序产品700)中。介质已经体现在其中(例如,计算机可读程序代码(指令)702)以提供和促进实施例的性能。可以包括制造品作为计算机系统的一部分或者单独的产品。
实施例可以是用于使处理器电路能够执行本发明的元件,计算机程序产品包括计算机可读存储介质,该计算机可读存储介质可由处理电路读取并且存储用于由处理电路执行的指令以用于执行方法。一个或者多个计算机可读存储介质是具有记录在其上的用于使处理器电路执行方法的指令的有形、非暂时存储介质。由于一旦指令记录在介质上,记录的指令随后可以由处理器电路在独立于记录时间的时间处读取一次或者多次,因此“计算机可读存储介质”至少是非暂时的。非暂时“计算机可读存储介质”包括仅在供电时保持所记录信息的设备(易失性设备)和不取决于供电而保持所记录信息的设备(非易失性设备)。“非暂时存储介质”的示例非穷举列表包括,但不限于,例如:半导体存储设备,包括例如存储器阵列(诸如RAM)或者存储器电路(诸如具有记录在其上的指令的锁存器);机械编码的设备,诸如具有记录在其上的指令的凹槽中的穿孔卡或者凸起结构;光学可读设备,诸如具有记录在其上的指令的CD或者DVD;以及磁编码设备,诸如具有记录在其上的指令的磁带或者磁盘。
计算机可读存储介质的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式压缩盘只读存储器(CD-ROM)。程序代码可以通过网络,例如因特网、局域网、广域网和/或无线网从外部计算机或外部存储设备分发到各个计算/处理设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口卡从网络接收程序,并转发该程序,以供存储在各个计算/处理设备中的计算机可读存储设备中。
用于执行实施例各方面的操作的计算机程序指令可以是,例如汇编代码、机器代码、微代码或者以一种或多种编程语言的任意组合编写的源或目标代码,所述编程语言包括面向对象的编程语言-诸如Java,Smalltalk、C++等,以及常规的过程式编程语言-诸如“C”语言或类似的编程语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络-包括局域网(LAN)或广域网(WAN)-连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
以下参照根据实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了实施例的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。
这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机程序指令存储在计算机可读存储介质中,这些指令使得计算机、其他可编程数据处理装置或其他以特定方式工作的设备。
也可以把计算机程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作框,以产生计算机实现的过程,从而使得在计算机或其它可编程数据处理装置上执行的指令提供(用于)实现流程图和/或框图中的一个或多个方框中规定的功能/动作的过程。
附图中的流程图和框图显示了根据多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。需要注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统或者专用硬件与计算机指令的组合来实现。
此处使用的术语仅仅是为了描述具体实施例的目的并且不旨在限制实施例。如此处使用的,除非上下文以其它方式清楚地指示,单数形式“一”、“一个”和“该”也旨在包括复数形式。还应当理解,术语“包括”和/或“包含”在本说明书中使用时,规定了所述特性、整体、块、操作、元件和/或组件的存在,但是不排除存在或者附加有一个或者多个其它特性、整体、块、操作、元件、组件和/或其组合。
下面的权利要求中所有方法或者块加功能元件的对应结构、材料、动作和等效物旨在包括用于如具体要求保护的执行与其它要求保护的元件结合的功能的任何结构、材料或者动作。尽管为了图示和描述已经提供了对实施例的描述,但是并不旨在穷举性的或者限于所公开形式的实施例。在不背离实施例范围和精神的情况下,许多修改和变型将对本领域普通技术人员显而易见。为了最好地解释原则和实际应用以及使其它本领域普通技术人员能够理解具有如适合于预计的特定用途的各种变型的实施例,对实施例进行选择和描述。
可以以一种或多种编程语言的任意组合来编写用于实施实施例方面的操作的计算机程序代码,该编程语言包括面向对象编程语言(诸如Java、Smalltalk、C++等)以及常规的过程式编程语言-诸如“C”编程语言或类似的编程语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为独立的软件包执行、部分在用户计算机上以及部分在远程计算机上执行或者完全在远程计算机或服务器上执行。在后者情形中,远程计算机可以通过任何类型的网络(包括局域网(LAN)或广域网(WAN))连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
上面参照根据实施例的方法、装置(系统)和计算机程序产品的流程图图示和/或框图对实施例的方面进行了描述。应当理解,流程图图示和/或框图的每个块以及流程图图示和/或框图中块的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器以产生一种机器,使得通过计算机或其它可编程数据处理装置的处理器执行的指令产生用于实现一个或多个流程图和/或框图块中规定的功能/动作的装置。
这些计算机程序指令还可以存储在计算机可读介质中,该计算机可读介质可以引导计算机、其它可编程处理设备或者其它设备以特定方式运行,使得计算机可读介质中存储的指令产生包括实现一个或者多个流程图和/或框图块中指定的功能/动作的指令的制造品。
计算机程序指令还可以加载到计算机、其它可编程数据处理设备或者其它设备上以使得在计算机、其它可编程装置或者其它设备上执行一系列操作块以产生计算机实现的过程,使得在计算机或者其它可编程装置上执行的指令提供用于实现一个或者多个流程图和/或框图块中指定的功能/动作的过程。
附图中的流程图和框图图示了根据各种实施例的系统、方法和计算机程序产品的可能实现的体系结构、功能和操作。在这点上,流程图或者框图中的每个块可以表示代码的部分、模块、或者段,其包括用于实现一个或者多个指定逻辑功能的一个或者多个可执行指令。还应当注意,在一些替代实现中,块中所述功能可以不按附图中所述顺序出现。例如,实际上,根据所包括的功能,可以基本上并行地执行连续示出的两个块,或者有时可以以相反顺序执行块。还应当注意,框图和/或流程图图示的每个块以及框图和/或流程图图示中块的组合可以由执行指定的功能或者动作的基于专用硬件的系统或者专用硬件和计算机指令的组合实现。
Claims (20)
1.一种用于代码栈管理的计算机系统,所述系统包括:
处理器,配置为执行软件应用;以及
存储器,包括代码栈存储器区域和数据栈存储器区域,所述代码栈存储器区域与所述数据栈存储器区域分离;
所述系统配置为执行方法,所述方法包括:
将数据栈保持在所述数据栈存储器区域中,所述数据栈包括多个栈帧,所述多个栈帧包括与所述软件应用的执行相对应的一个或者多个数据变量;以及
将代码栈保持在所述代码栈存储器区域中,所述代码栈包括多个代码栈条目,所述多个代码栈条目包括与所述软件应用的执行相对应的可执行计算机代码。
2.根据权利要求1所述的系统,所述数据栈存储器区域是可写的并且不可执行的,并且所述代码栈存储器区域是可执行的。
3.根据权利要求1所述的系统,所述方法还包括:
在将新代码栈条目分配到所述代码栈上之前,将所述代码栈存储器区域设定为可写并且不可执行;以及
在将所述新代码栈条目分配到所述代码栈上之后,将所述代码栈存储器区域设定为可执行并且不可写。
4.根据权利要求1所述的系统,所述方法还包括:
确定指向所述代码栈中的最近代码栈条目的关联栈帧的指针的值,其中最近分配代码栈条目由所述代码栈的代码栈指针CSP引用;
确定指向所述关联栈帧的所述指针是否引用所述数据栈中的有效栈帧;
基于确定指向所述关联栈帧的所述指针不引用所述数据栈中的有效栈帧,将所述最近代码栈条目从所述代码栈解除分配;以及
基于确定指向所述关联栈帧的所述指针引用所述数据栈中的有效栈帧,将新代码栈条目分配在所述代码栈上,并且设定所述CSP以引用所述新代码栈条目。
5.根据权利要求1所述的系统,所述方法还包括:
输入所述软件应用的函数;
基于输入所述函数,将所述代码栈的CSP的当前值存储在所述数据栈上的所述函数的存储器位置中;
将一个或者多个条目分配在与蹦床函数相对应的所述代码栈上,所述蹦床函数与指向所述函数的一个或者多个嵌套函数的指针结合使用,其中最近分配的代码栈条目由所述CSP引用;以及
在所述函数退出之前,通过加载来自所述存储器位置的所存储的CSP值恢复所述CSP。
6.根据权利要求1所述的系统,所述方法还包括:
输入所述软件应用的函数;
将一个或者多个条目分配在与所述函数的一个或者多个嵌套函数相对应的所述代码栈上,其中最近分配的代码栈条目由所述CSP引用;以及
在所述函数退出之前,通过从所述CSP移除为所述一个或者多个代码栈条目分配的总存储器大小以恢复所述CSP。
7.根据权利要求1所述的系统,代码栈条目包括:
与动态生成的蹦床函数相对应的代码,所述蹦床函数与指向所述软件应用的嵌套函数的指针结合使用;以及
指向与所述代码栈条目相关联的栈帧的指针,所述指针引用所述数据栈中的关联栈帧。
8.根据权利要求1所述的系统,所述方法还包括:
存储所述代码栈的CSP的值作为当前函数的代码栈屏障CSB;
为与指向嵌套函数的指针结合使用的蹦床函数分配新代码栈条目;以及
设定所述代码栈的CSP以引用所述新代码栈条目;以及
在所述当前函数退出之前设定所述CSP等于所述CSB以将所述新代码栈条目从所述代码栈解除分配。
9.一种用于实现代码栈管理的计算机程序产品,所述计算机程序产品包括:
有形存储介质,可由处理电路读取并且存储由所述处理电路执行的指令以用于执行方法,所述方法包括:
由计算机的处理器执行软件应用;
将数据栈保持在所述计算机的存储器的数据栈存储器区域中,所述数据栈包括多个栈帧,所述多个栈帧包括与所述软件应用的执行相对应的一个或者多个数据变量;以及
将代码栈保持在所述计算机的所述存储器的代码栈存储器区域中,所述代码栈包括多个代码栈条目,所述多个代码栈条目包括与所述软件应用的执行相对应的可执行计算机代码,所述代码栈存储器区域与所述数据栈存储器区域分离。
10.根据权利要求9所述的计算机程序产品,所述数据栈存储器区域是可写的并且不可执行的,并且所述代码栈存储器区域是可执行的。
11.根据权利要求9所述的计算机程序产品,所述方法还包括:
在将新代码栈条目分配到所述代码栈上之前,将所述代码栈存储器区域设定为可写并且不可执行;以及
在将所述新代码栈条目分配到所述代码栈上之后,将所述代码栈存储器区域设定为可执行并且不可写。
12.根据权利要求9所述的计算机程序产品,所述方法还包括:
确定指向所述代码栈中的最近代码栈条目的关联栈帧的指针的值,其中最近分配代码栈条目由所述代码栈的代码栈指针CSP引用;
确定指向所述关联栈帧的所述指针是否引用所述数据栈中的有效栈帧;
基于确定指向所述关联栈帧的所述指针不引用所述数据栈中的有效栈帧,将所述最近代码栈条目从所述代码栈解除分配;以及
基于确定指向所述关联栈帧的所述指针引用所述数据栈中的有效栈帧,将新代码栈条目分配在所述代码栈上,并且设定所述CSP以引用所述新代码栈条目。
13.根据权利要求9所述的计算机程序产品,所述方法还包括:
输入所述软件应用的函数;
基于输入所述函数,将所述代码栈的CSP的当前值存储在所述数据栈上的所述函数的存储器位置中;以及
将一个或者多个条目分配在与蹦床函数相对应的所述代码栈上,所述蹦床函数与指向所述函数的一个或者多个嵌套函数的指针结合使用,其中最近分配的代码栈条目由所述CSP引用;
在所述函数退出之前,通过加载来自所述存储器位置的所存储的CSP值恢复所述CSP。
14.根据权利要求9所述的计算机程序产品,所述方法还包括:
输入所述软件应用的函数;
将一个或者多个代码栈条目分配在与所述函数的一个或者多个嵌套函数相对应的所述代码栈上,其中最近分配的代码栈条目由所述CSP引用;以及
在所述函数退出之前,通过从所述CSP减去为所述一个或者多个代码栈条目分配的总存储器大小以恢复所述CSP。
15.根据权利要求9所述的计算机程序产品,代码栈条目包括:
与动态生成的蹦床函数相对应的代码,所述蹦床函数与指向所述软件应用的嵌套函数的指针结合使用;以及
指向与所述代码栈条目相关联的栈帧的指针,所述指针引用所述数据栈中的所述关联栈帧。
16.一种用于代码栈管理的计算机实现方法,所述方法包括:
由计算机的处理器执行软件应用;
将数据栈保持在所述计算机的存储器的数据栈存储器区域中,所述数据栈包括多个栈帧,所述多个栈帧包括与所述软件应用的执行相对应的一个或者多个数据变量;以及
将代码栈保持在所述计算机的所述存储器中的代码栈存储器区域中,所述代码栈包括多个代码栈条目,所述多个代码栈条目包括与所述软件应用的执行相对应的可执行计算机代码,所述代码栈存储器区域与所述数据栈存储器区域分离。
17.根据权利要求16所述的方法,所述数据栈存储器区域是可写的并且不可执行的,以及所述代码栈存储器区域是可执行的。
18.根据权利要求16所述的方法,还包括:
在将新代码栈条目分配到所述代码栈上之前,将所述代码栈存储器区域设定为可写并且不可执行;以及
在将所述新代码栈条目分配到所述代码栈上之后,将所述代码栈存储器区域设定为可执行并且不可写。
19.根据权利要求16所述的方法,还包括:
确定指向所述代码栈中的最近代码栈条目的关联栈帧的指针的值,其中最近分配代码栈条目由所述代码栈的代码栈指针CSP引用;
确定指向所述关联栈帧的所述指针是否引用所述数据栈中的有效栈帧;
基于确定指向所述关联栈帧的所述指针不引用所述数据栈中的有效栈帧,将所述最近代码栈条目从所述代码栈解除分配;以及
基于确定指向所述关联栈帧的所述指针引用所述数据栈中的有效栈帧,将新代码栈条目分配在所述代码栈上,以及设定所述CSP以引用所述新代码栈条目。
20.根据权利要求16所述的方法,代码栈条目包括:
与动态生成的蹦床函数相对应的代码,所述蹦床函数与指向所述软件应用的嵌套函数的指针结合使用;以及
指向与所述代码栈条目相关联的栈帧的指针,所述指针引用所述数据栈中的关联栈帧。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/067,053 | 2013-10-30 | ||
US14/067,053 US9189214B2 (en) | 2013-10-30 | 2013-10-30 | Code stack management |
PCT/CN2014/087688 WO2015062386A1 (en) | 2013-10-30 | 2014-09-28 | Code stack management |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105556466A true CN105556466A (zh) | 2016-05-04 |
CN105556466B CN105556466B (zh) | 2020-10-23 |
Family
ID=52996974
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201480051802.3A Active CN105556466B (zh) | 2013-10-30 | 2014-09-28 | 代码堆栈管理方法 |
Country Status (4)
Country | Link |
---|---|
US (2) | US9189214B2 (zh) |
JP (1) | JP6474398B2 (zh) |
CN (1) | CN105556466B (zh) |
WO (1) | WO2015062386A1 (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109154908A (zh) * | 2016-05-13 | 2019-01-04 | 微软技术许可有限责任公司 | 具有精确垃圾收集报告的动态大小的局部 |
CN109313602A (zh) * | 2016-05-09 | 2019-02-05 | 甲骨文国际公司 | 紧急关系中栈段强度的相关性 |
CN111095249A (zh) * | 2017-09-29 | 2020-05-01 | 高通股份有限公司 | 使用经认证指针来进行经动态生成的代码处理沙盒化 |
CN111316249A (zh) * | 2017-09-04 | 2020-06-19 | 弗索拉公司 | 改进的数据处理方法 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN112948000A (zh) * | 2021-03-17 | 2021-06-11 | 星汉智能科技股份有限公司 | 栈空间统计方法、装置及介质 |
CN113168325A (zh) * | 2019-03-14 | 2021-07-23 | 西部数据技术公司 | 可执行存储器单元 |
CN113168399A (zh) * | 2019-03-14 | 2021-07-23 | 西部数据技术公司 | 可执行存储器单元 |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9870324B2 (en) * | 2015-04-09 | 2018-01-16 | Vmware, Inc. | Isolating guest code and data using multiple nested page tables |
US10372513B2 (en) * | 2015-04-30 | 2019-08-06 | Entit Software Llc | Classification of application events using call stacks |
KR101716865B1 (ko) * | 2016-04-29 | 2017-03-15 | 고려대학교 산학협력단 | 주 메모리의 에러 셀 회피를 위한 스택 및 힙 메모리 관리 장치 및 그 방법 |
US10884899B2 (en) * | 2018-10-01 | 2021-01-05 | International Business Machines Corporation | Optimized trampoline design for fast software tracing |
US11442739B2 (en) * | 2019-09-16 | 2022-09-13 | International Business Machines Carporation | Exception handling |
US10831884B1 (en) | 2019-09-16 | 2020-11-10 | International Business Machines Corporation | Nested function pointer calls |
CN113656038B (zh) * | 2021-07-29 | 2023-08-01 | 北京百度网讯科技有限公司 | 编辑处理方法及装置 |
CN116521576B (zh) * | 2023-05-11 | 2024-03-08 | 上海合见工业软件集团有限公司 | Eda软件数据处理系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1636187A (zh) * | 2001-12-24 | 2005-07-06 | 施蓝姆伯格技术管理有限公司 | 数据处理系统中处理交易的方法和装置 |
US20050166036A1 (en) * | 2001-06-01 | 2005-07-28 | Microchip Technology Inc. | Microcontroller instruction set |
CN102937934A (zh) * | 2011-11-23 | 2013-02-20 | 微软公司 | 通过动态的语言引擎捕捉遥测数据 |
US20130185792A1 (en) * | 2012-01-16 | 2013-07-18 | Qualcomm Incorporated | Dynamic execution prevention to inhibit return-oriented programming |
Family Cites Families (30)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5220669A (en) * | 1988-02-10 | 1993-06-15 | International Business Machines Corporation | Linkage mechanism for program isolation |
FR2678402A1 (fr) * | 1991-06-28 | 1992-12-31 | Philips Electronique Lab | Dispositif de traitement d'informations. |
US5958039A (en) | 1997-10-28 | 1999-09-28 | Microchip Technology Incorporated | Master-slave latches and post increment/decrement operations |
US6081665A (en) * | 1997-12-19 | 2000-06-27 | Newmonics Inc. | Method for efficient soft real-time execution of portable byte code computer programs |
US6546546B1 (en) * | 1999-05-19 | 2003-04-08 | International Business Machines Corporation | Integrating operating systems and run-time systems |
US6345353B2 (en) * | 1999-07-20 | 2002-02-05 | Microchip Technology Incorporated | Stack pointer with post increment/decrement allowing selection from parallel read/write address outputs |
US6560774B1 (en) * | 1999-09-01 | 2003-05-06 | Microsoft Corporation | Verifier to check intermediate language |
US6578094B1 (en) | 2000-03-02 | 2003-06-10 | International Business Machines Corporation | Method for preventing buffer overflow attacks |
JP2003167737A (ja) * | 2001-11-30 | 2003-06-13 | Nec Corp | スタック使用方法 |
US7752459B2 (en) | 2001-12-06 | 2010-07-06 | Novell, Inc. | Pointguard: method and system for protecting programs against pointer corruption attacks |
US7594111B2 (en) | 2002-12-19 | 2009-09-22 | Massachusetts Institute Of Technology | Secure execution of a computer program |
US7228563B2 (en) | 2003-02-06 | 2007-06-05 | Symantec Corporation | Shell code blocking system and method |
US20040250105A1 (en) | 2003-04-22 | 2004-12-09 | Ingo Molnar | Method and apparatus for creating an execution shield |
US7784057B2 (en) * | 2003-08-27 | 2010-08-24 | Intel Corporation | Single-stack model for high performance parallelism |
US7404182B1 (en) * | 2003-10-03 | 2008-07-22 | Sun Microsystems, Inc. | Deferring and combining write barriers for a garbage-collected heap |
US7631292B2 (en) * | 2003-11-05 | 2009-12-08 | Microsoft Corporation | Code individualism and execution protection |
KR100586500B1 (ko) * | 2004-03-18 | 2006-06-07 | 학교법인고려중앙학원 | 버퍼 오버플로우 공격들을 감지하고 복구하는 방법 및 그장치 |
US7971255B1 (en) | 2004-07-15 | 2011-06-28 | The Trustees Of Columbia University In The City Of New York | Detecting and preventing malcode execution |
GB2417579A (en) * | 2004-08-26 | 2006-03-01 | Hewlett Packard Development Co | Method for dynamically inserting code into a process by enabling taken branch traps to intercept a branch during the execution of the process |
US7870541B1 (en) * | 2004-11-01 | 2011-01-11 | Wind River Systems, Inc. | Context tracing for software with a frame pointer and a stack pointer and with a stack pointer but without a frame pointer |
US7467272B2 (en) * | 2004-12-16 | 2008-12-16 | International Business Machines Corporation | Write protection of subroutine return addresses |
US7856538B2 (en) * | 2005-12-12 | 2010-12-21 | Systex, Inc. | Methods, systems and computer readable medium for detecting memory overflow conditions |
US8104021B2 (en) * | 2006-06-09 | 2012-01-24 | Microsoft Corporation | Verifiable integrity guarantees for machine code programs |
US8185952B2 (en) | 2007-01-03 | 2012-05-22 | Texas Instruments Incorporated | Static and dynamic firewalls |
US8458677B2 (en) * | 2009-08-20 | 2013-06-04 | International Business Machines Corporation | Generating code adapted for interlinking legacy scalar code and extended vector code |
US8522222B2 (en) * | 2010-06-21 | 2013-08-27 | Microsoft Corporation | Tracing just-in-time compilation with pointers to local variables |
US8984478B2 (en) * | 2011-10-03 | 2015-03-17 | Cisco Technology, Inc. | Reorganization of virtualized computer programs |
US9256552B2 (en) * | 2011-11-21 | 2016-02-09 | Cisco Technology, Inc. | Selective access to executable memory |
US8959577B2 (en) * | 2012-04-13 | 2015-02-17 | Cisco Technology, Inc. | Automatic curation and modification of virtualized computer programs |
US9098704B2 (en) * | 2013-10-09 | 2015-08-04 | Kaspersky Lab, Zao | Method for function capture and maintaining parameter stack |
-
2013
- 2013-10-30 US US14/067,053 patent/US9189214B2/en not_active Expired - Fee Related
-
2014
- 2014-09-28 JP JP2016526359A patent/JP6474398B2/ja active Active
- 2014-09-28 CN CN201480051802.3A patent/CN105556466B/zh active Active
- 2014-09-28 WO PCT/CN2014/087688 patent/WO2015062386A1/en active Application Filing
- 2014-09-30 US US14/501,548 patent/US9430236B2/en active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050166036A1 (en) * | 2001-06-01 | 2005-07-28 | Microchip Technology Inc. | Microcontroller instruction set |
CN1636187A (zh) * | 2001-12-24 | 2005-07-06 | 施蓝姆伯格技术管理有限公司 | 数据处理系统中处理交易的方法和装置 |
CN102937934A (zh) * | 2011-11-23 | 2013-02-20 | 微软公司 | 通过动态的语言引擎捕捉遥测数据 |
US20130185792A1 (en) * | 2012-01-16 | 2013-07-18 | Qualcomm Incorporated | Dynamic execution prevention to inhibit return-oriented programming |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109313602B (zh) * | 2016-05-09 | 2022-05-24 | 甲骨文国际公司 | 处理紧急关系中栈段强度的相关性的系统、方法和介质 |
CN109313602A (zh) * | 2016-05-09 | 2019-02-05 | 甲骨文国际公司 | 紧急关系中栈段强度的相关性 |
US11327797B2 (en) | 2016-05-09 | 2022-05-10 | Oracle International Corporation | Memory usage determination techniques |
CN109154908A (zh) * | 2016-05-13 | 2019-01-04 | 微软技术许可有限责任公司 | 具有精确垃圾收集报告的动态大小的局部 |
CN109154908B (zh) * | 2016-05-13 | 2023-08-29 | 微软技术许可有限责任公司 | 具有精确垃圾收集报告的动态大小的局部 |
CN111316249A (zh) * | 2017-09-04 | 2020-06-19 | 弗索拉公司 | 改进的数据处理方法 |
CN111316249B (zh) * | 2017-09-04 | 2023-09-29 | 弗索拉公司 | 改进的数据处理方法 |
CN111095249A (zh) * | 2017-09-29 | 2020-05-01 | 高通股份有限公司 | 使用经认证指针来进行经动态生成的代码处理沙盒化 |
CN111095249B (zh) * | 2017-09-29 | 2023-04-28 | 高通股份有限公司 | 使用经认证指针来进行经动态生成的代码处理沙盒化 |
CN111367588A (zh) * | 2018-12-25 | 2020-07-03 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN111367588B (zh) * | 2018-12-25 | 2023-05-16 | 杭州海康威视数字技术股份有限公司 | 一种获取堆栈使用量的方法及装置 |
CN113168399A (zh) * | 2019-03-14 | 2021-07-23 | 西部数据技术公司 | 可执行存储器单元 |
CN113168325A (zh) * | 2019-03-14 | 2021-07-23 | 西部数据技术公司 | 可执行存储器单元 |
CN113168399B (zh) * | 2019-03-14 | 2023-09-19 | 西部数据技术公司 | 可执行存储器单元 |
CN112948000B (zh) * | 2021-03-17 | 2023-03-03 | 星汉智能科技股份有限公司 | 栈空间统计方法、装置及介质 |
CN112948000A (zh) * | 2021-03-17 | 2021-06-11 | 星汉智能科技股份有限公司 | 栈空间统计方法、装置及介质 |
Also Published As
Publication number | Publication date |
---|---|
US9189214B2 (en) | 2015-11-17 |
WO2015062386A1 (en) | 2015-05-07 |
US20150121354A1 (en) | 2015-04-30 |
JP6474398B2 (ja) | 2019-02-27 |
US9430236B2 (en) | 2016-08-30 |
JP2016541047A (ja) | 2016-12-28 |
US20150121339A1 (en) | 2015-04-30 |
CN105556466B (zh) | 2020-10-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105556466A (zh) | 代码堆栈管理 | |
US6578094B1 (en) | Method for preventing buffer overflow attacks | |
CN103946855A (zh) | 用于检测面向返回编程攻击的方法、装置和系统 | |
CN104054061A (zh) | 用以禁止返回定向编程的动态执行阻止 | |
CN113785275B (zh) | Flash数据掉电保护方法及设备 | |
CN105224864A (zh) | 一种抵御代码重用攻击的工作进程随机化方法及系统 | |
CN108897492B (zh) | 一种数据写入方法和装置 | |
CN107003864A (zh) | 恢复片上系统设备 | |
US10528729B2 (en) | Methods and systems for defending against cyber-attacks | |
WO2013160724A1 (en) | Data processing system and method for operating a data processing system | |
CN104520868B (zh) | 用于检测调用堆栈篡改的系统 | |
US10983923B2 (en) | Dynamic memory protection | |
CN105095697A (zh) | 面向返回的编程作为混淆技术 | |
KR20210059212A (ko) | 바이너리 난수 주입을 통한 메모리 공유 기반 부채널 공격 방어 방법 | |
Younan et al. | A methodology for designing countermeasures against current and future code injection attacks | |
CN106959906A (zh) | 信息处理方法、信息处理装置及电子设备 | |
KR101249739B1 (ko) | 달빅 가상머신이 탑재된 단말기에서 자바 클래스 로딩 방법, 그리고 이를 수행하는 프로그램을 기록한 컴퓨터로 판독가능한 기록매체 | |
US9417856B2 (en) | Efficient interpreter profiling to obtain accurate call-path information | |
US11188460B2 (en) | Arena-based memory management | |
CN103593606A (zh) | 上下文信息管理方法及系统 | |
CN106096407A (zh) | 一种代码复用攻击的防御方法 | |
Brookes et al. | The KPLT: The Kernel as a shared object | |
EP1717665B1 (en) | Transaction stack for electronic devices including non volatile memory with limited amount of writing cycles | |
US20100169557A1 (en) | Using non-volatile storage to track status changes in objects | |
CN112199159A (zh) | 对操作数栈和变量表的读写方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |