33

来自维基百科

在计算中,红色区域是函数堆栈帧中的一个固定大小的区域,超出了该函数不保留的返回地址。被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销。这个内存区域不能被中断/异常/信号处理程序修改。System V 使用的 x86-64 ABI 要求有一个 128 字节的红色区域,它直接在返回地址之后开始,包括函数的参数。OpenRISC 工具链假设有一个 128 字节的红色区域。

System V x86-64 ABI

%rsp 指向的位置之外的 128 字节区域被认为是保留的,不应被信号或中断处理程序修改。因此,函数可以将此区域用于函数调用之间不需要的临时数据。特别是,叶函数可以将这个区域用于它们的整个堆栈帧,而不是在序言和尾声中调整堆栈指针。这个区域被称为红色区域。

  • 给定这两个引号,红色区域是堆叠返回地址 上方还是堆叠返回地址下方

  • 由于这个红色区域是相对于 的RSP,它是否随每个 向下移动,是否随每个push向上移动pop

4

2 回答 2

25

给定这两个引号,红色区域是堆叠返回地址上方还是堆叠返回地址下方?

红色区域是正下方的 128 个字节rsp,即rsp - 128to rsp - 1

由于这个红色区域是相对于 RSP 的,它是否会随着每次推送而向下移动,是否随着每次弹出而向上移动?

是的。

于 2016-06-26T19:18:06.427 回答
9

维基百科关于红色区域的文章是错误的,因此造成了歧义。

我在 2017 年 4 月修改了这篇文章以解决这个问题。截至该更新,维基百科文章如下:

在计算中,红色区域是函数堆栈帧中超出当前堆栈指针的固定大小区域,该函数不保留该区域。被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销。这个内存区域不能被中断/异常/信号处理程序修改。System V 使用的 x86-64 ABI 要求有一个 128 字节的红色区域,该区域直接从堆栈指针的当前值开始。OpenRISC 工具链假设有一个 128 字节的红色区域

这使 Wikipedia 文章更符合 64 位 System V ABI 定义。解决了上述歧义后,关于以下问题:

由于这个红色区域是相对于 RSP 的,它是否会随着每次推送而向下移动,是否随着每次弹出而向上移动?

红色区域始终是RSP正下方的 128 个字节。随着RSP的变化(通过PUSH/POP/MOV等),红色区域的位置也会发生变化。

于 2017-12-10T20:37:09.960 回答