x86-64上的红色区域究竟在哪里?

时间:2016-06-26 19:07:09

标签: assembly x86-64 abi red-zone

来自Wikipedia

  

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

来自the System V x86-64 ABI

  

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

  • 鉴于这两个引号,红色区域 高于堆叠的返回地址或低于堆叠的返回地址?

  • 由于此红色区域RSP相关,因此每个push向下移动,并且每个pop向上移动吗?

2 个答案:

答案 0 :(得分:15)

  

鉴于这两个引号,堆叠的返回地址上方或堆叠的返回地址下方的红色区域是什么?

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

  

由于这个红色区域相对于RSP,每次按下它是否向下移动并且每次弹出都会向上移动?

答案 1 :(得分:5)

关于 Red Zone 的维基百科文章是错误的,因此产生了歧义。

我在2017年4月修改了该文章以解决问题。截至该更新,Wikipedia article读取:

  

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

这使维基百科的文章更符合64位System V ABI定义。上面的含糊不清解决了问题:

  

由于这个红色区域相对于RSP,每次按下它是否向下移动并且每次弹出都会向上移动?

红区始终是 RSP 下方的128个字节。当 RSP 更改(通过 PUSH / POP / MOV 等)时,红区的位置也会改变。