代码堆栈管理的制作方法

文档序号:9794007阅读:475来源:国知局
代码堆栈管理的制作方法
【技术领域】
[0001] 本发明通常涉及计算机系统,并且更具体地涉及执行计算机程序期间的代码堆栈 管理。
【背景技术】
[0002] 计算机系统典型地包括计算机程序和硬件(诸如半导体、晶体管、芯片、电路板、存 储设备和处理器)的组合。存储设备存储数据和由处理器执行的计算机程序。
[0003] 计算机程序通常分成彼此调用的片段。片段典型地称为方法、函数、模块、部分、 类、程序或者子例程。当第一方法(调用方)调用第二方法(被调用方)时,调用方的方法停止 执行以及被调用方的方法获得处理器的控制并且开始执行。当被调用方的方法停止执行 时,它将处理器的控制返回至调用方的方法,调用方的方法在调用被调用方的方法的调用 指令之后的下一个指令处重新开始执行。
[0004] 为了促进该调用和返回技术,计算机可以使用调用栈,也称为运行期栈、函数栈、 执行栈、调用栈或者简称栈。调用栈包括每个主动方法的条目(也称为帧)。条目存储关于执 行其相应方法的信息。信息可以包括方法的标识符、方法的返回地址(在被调用方的方法返 回之后接着执行的调用方的方法中的指令位置)、由方法读取或者写入的局部变量的值、传 递至方法的参数、用于算术运算或者逻辑运算的操作数的求值栈、指向方法当前实例的指 针、封装方法上下文和/或方法的特权或者授权级别中的任何一个、一些或者全部。
[0005] 调用栈使用后进先出(LIF0)原则,意思是添加(推入)至调用栈顶部的最后(或者 最近)条目是从调用栈顶部移除(弹出)的第一(或者下一个)条目。例如,响应于第一方法调 用第二方法,新条目被创建以保存第一方法的上下文以及容纳第二方法的局部变量并且被 推至调用栈顶部。如果第二方法调用第三方法,则保存第二方法上下文以及容纳第二方法 局部变量的新条目被推至调用栈上。一旦当前执行的方法结束,则其调用方的方法的条目 从栈顶部弹出并且用于恢复调用方的方法的运行环境。由于许多方法可以彼此调用并且调 用可以是嵌套或者甚至递归的,因此调用栈随着程序执行而增长和缩小。
[0006] 在计算机程序中,嵌套函数(还称为嵌套程序或者嵌套子例程)是在词法上封装在 另一个函数(称为当前函数)内的函数。在许多方法中,嵌套函数用于结构化编程。由于嵌 套,嵌套函数的范围在嵌套函数的当前函数内。这意味着嵌套函数可以访问当前函数中从 当前函数外部不可见的局部变量和其它局部函数以及局部常量和类型。尽管在实用程序中 通常仅使用少数级别,但是理论上嵌套可以到任何级别的深度。在一些环境中,嵌套函数的 代码动态地生成并且一直持续到从当前函数和其子例程退出。这种动态生成的代码的示例 是蹦床函数和信号处理程序。操作系统可以将该动态生成的代码分配在调用栈上。

【发明内容】

[0007] 实施例包括用于代码栈管理的方法、系统和计算机程序产品。一个方面包括配置 为执行软件应用的处理器。另一个方面包括代码栈存储器区域和数据栈存储器区域,代码 栈存储器区域与数据栈存储器区域分离。另一个方面包括将数据栈保持在数据栈存储器区 域中,数据栈包括多个栈帧,该多个栈帧包括与软件应用的执行相对应的一个或者多个数 据变量。另一个方面包括将代码栈保持在代码栈存储器区域中,代码栈包括多个代码栈条 目,该多个代码栈条目包括与软件应用的执行相对应的可执行计算机代码。
【附图说明】
[0008]在说明书结论处的权利要求中特别指出了被看作实施例的主题并且对其明确地 要求保护。通过与附图结合理解的下列详细说明,实施例的前述特性和其它特性以及优点 是显而易见的。
[0009]图1描绘了根据实施例的用于代码栈管理的计算机系统;
[0010]图2A-2C描绘了数据栈和代码栈的实施例;
[0011] 图3描绘了根据实施例包括使代码栈与数据栈同步的代码栈管理的过程流程;
[0012] 图4-5描绘了根据各种实施例的代码栈管理的过程流程;
[0013]图6描绘了数据区域和代码栈的实施例;以及
[0014] 图7图示了根据实施例的计算机程序产品。
【具体实施方式】
[0015] 提供了代码栈管理的实施例,在下面对示例性实施例详细地进行讨论。将动态生 成的代码分配到调用栈上可以使计算机系统容易受到安全性攻击(诸如栈溢出情况)。为了 提高安全性,在计算机存储器中保持包括数据栈和代码栈的两个单独的并且不同的栈。数 据栈可以位于可写入的不可执行存储器区域中,而代码栈可以位于可执行存储器区域中。 在一些实施例中,除了将新条目分配到代码栈上期间以外,可以使代码栈不可写入,并且还 可以在将新条目分配到代码栈上期间使代码栈不可执行。因此,通过不可执行数据栈和单 独代码栈防止对应用的安全性攻击。分离的代码栈和数据栈允许动态生成的代码在增强安 全性的同时为例如事件处理程序和词法嵌套提供蹦床函数。
[0016] 可以将蹦床函数分配在代码栈上。蹦床函数是在获得嵌套函数地址的运行时间创 建的一小段代码。蹦床函数中的指令必须做两件事情:将常数地址加载到静态链寄存器中, 并且跳转至嵌套函数的实地址。这可能需要两个指令:立即移动和跳转。两个地址可以存在 于蹦床函数中作为字长立即操作数。可能需要将每个地址以两个部分加载到寄存器中;每 个地址段形成单独的立即操作数。
[0017] 生成以初始化蹦床函数的代码必须将静态链值和函数地址存储到指令的立即操 作数中。静态链和函数入口地址可以存储在位于代码栈外部的单独数据区域中。数据区域 还可以可选地容纳代码栈管理信息,诸如用于对代码栈条目(诸如代码栈帧分配大小和关 联数据栈帧)进行分配和解除分配。在一些实施例中,蹦床函数在分配之后是不可变的,并 且配置为与指向通过写入单独数据区域存在的嵌套函数的指针结合使用。数据区域不容纳 可写代码,从而避免代码注入到可写的可执行蹦床函数中的风险。
[0018] 图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的可信组件(诸如内 核或者另一个系统组件,其可以包括,但不限于可信程序库、受管理的运行期环境或者管理 程序系统)专门写入的。
[0019] 在一些实施例中,可以通过用动态生成的蹦床函数预填充存储器页面以进行嵌套 函数的条目在代码栈103上的分配。在另一个实施例中,可以通过使代码栈存储器区域107 暂时可写将与蹦床函数相对应的一个或者多个条目分配到代码栈103上。在将与预填充的 蹦床函数相对应的代码栈条目分配在代码栈103上之后,将代码栈存储器区域107设定为可 执行的并且不可写的。在代码栈存储器区域107在将与蹦床函数相对应的条目分配在代码 栈103上期间不可执行的实施例中,可以提供恢复代码以供应用104中并行执行的任何其它 线程使用。代码栈103中与蹦床函数相对应的条目的数据(诸如静态链数据和函数地址数 据)可以存储在存储器105中的单独数据区域中(诸如数据区域113);这在下面关于表格1A-B和图6进行了更详细的讨论。
[0020] 在一些实施例中,立即将具有限制许可(诸如不能读取、不能写入和不能执行许可 的组合)的一个或者多个存储页面设置在存储器105中的代码栈存储器区域107前和/或后 以通过例如位于代码栈存储器区域107区域附近的缓冲区的溢出或者下溢防止任何意外的 引用、溢出或者下溢到达代码栈存储器区域107。还可以可选地将一个或者多个保护页面设 置在代码栈存储器区域107中的代码栈103上面和下面以用于进一步保护代码栈103。
[0021 ]每个代码栈条目可以具有数据栈102中的相应栈帧,并且与分配代码栈条目的栈 帧相对应。栈帧可以由处理器101自动地分配和解除分配,并且可以保持任何适当的变量。 代码栈存储器区域107可以相对远离数据栈存储器区域106地设置在计算机系统100的存储 器映射中以避免对代码栈存储器区域107的意外或者恶意写入。
[0022]在表格1A中示出了蹦床函数代码的示例。在一些实施例中,诸如表格1A所示的蹦 床函数代码可以插入在代码栈103中的多个条目中,以及代码栈103中的这些条目中的每一 个可以具有为代码栈103中的每个蹦床函数指定唯一相应函数地址和静态链的对应相应数 据区域(诸如数据区域113)。
[0023] 表格1A:示例蹦床函数代码
[0026] 参照表格1A的代码,在由标签"trampoline_initial"指示的位置处用适合于将容 纳所调用函数的返回值的链路寄存器读到寄存器r0中的指令"mflr rO"开始执行。指令 "bl.+4"适合于典型地在生成下一个指令的值时用作返回地址,并且将控制转移至如指示 当前地址加4个字节的记数法".+4"指示的下一个指令。指令"mflr rll"将该地址从链路寄 存器加载到寄存器rll中以稍后用作寻址引用。指令"mtlr rO"将先前加载到rO中的返回地 址恢复到链路寄存器lr中。指令"Id rl2,8192(rl 1)"使用寄存器rl 1
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1