天天看点

Hexagon_V65_Programmers_Reference_Manual(11)8.软件栈

Hexagon_V65_Programmers_Reference_Manual(11)

  • 8.软件栈
    • 8.1 栈结构
    • 8.2 栈框架
    • 8.3 堆栈保护
      • 8.3.1堆栈边界检查
      • 8.3.2 堆栈边界检查

8.软件栈

Hexagon处理器包括支持呼叫的专用寄存器和指令

子程序执行堆栈。

堆栈结构遵循标准C约定

8.1 栈结构

堆栈定义为从高地址增长到低地址。堆栈指针寄存器SP指向当前位于堆栈顶部的数据元素。

Hexagon_V65_Programmers_Reference_Manual(11)8.软件栈

注意,Hexagon处理器支持三个专用堆栈指令:

allocframe、deallocframe和Deallocu_返回(第8.5节)。

对于堆栈指令,SP地址必须始终保持8字节对齐正常工作。

8.2 栈框架

堆栈用于存储堆栈帧,堆栈帧是存储状态的数据结构

关于程序中活动子程序的信息(即那些被调用但具有

尚未返回)。每个堆栈帧对应于程序中的一个活动子例程。

堆栈框架包含以下元素:

  • 子程序使用的局部变量和数据
  • 子程序调用的返回地址(从链接寄存器LR推送)
  • 在堆栈上分配的上一个堆栈帧的地址(从帧指针寄存器FP)

帧指针寄存器FP始终包含中保存的帧指针的地址当前堆栈帧。它通过允许调试器检查堆栈在内存中,可以轻松确定调用序列、函数参数等。

注意:对于叶函数,通常不需要保存FP和LR。在这种情况下,FP包含调用函数的帧指针,而不是当前函数。

8.3 堆栈保护

Hexagon V6x处理器支持以下功能,以保护软件堆栈:

  • 堆栈边界检查
  • 堆叠粉碎保护

8.3.1堆栈边界检查

堆栈边界检查可防止堆栈帧被分配超过下限软件堆栈的边界。

FRAMELIMIT是一个32位控制寄存器,它存储指定为软件堆栈保留的内存区域的下限。当allocframe指令分配一个新的堆栈帧,它将SP中的新堆栈指针值与FRAMELIMIT中的堆栈绑定值。如果SP小于FRAMELIMIT,则Hexagon 处理器引发异常0x27(第7.10节)。

注意:当处理器处于用户和来宾状态时,将执行堆栈边界检查模式,但不在监视器模式下。

8.3.2 堆栈边界检查

堆栈边界检查可防止堆栈帧被分配超过下限软件堆栈的边界。

FRAMELIMIT是一个32位控制寄存器,它存储指定为软件堆栈保留的内存区域的下限。当allocframe指令分配一个新的堆栈帧,它将SP中的新堆栈指针值与FRAMELIMIT中的堆栈绑定值。如果SP小于FRAMELIMIT,则Hexagon 处理器引发异常0x27(第7.10节)。

注意:当处理器处于用户和来宾状态时,将执行堆栈边界检查模式,但不在监视器模式下。

继续阅读