首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >x86-64上的红色区域到底在哪里?

x86-64上的红色区域到底在哪里?
EN

Stack Overflow用户
提问于 2016-06-27 03:07:09
回答 2查看 5.4K关注 0票数 32

来自Wikipedia

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

来自the System V x86-64 ABI

超出%rsp指向的位置的128字节区域被认为是保留的,信号或中断处理程序不应对其进行修改。因此,函数可以使用此区域存储跨函数调用不需要的临时数据。特别地,叶函数可以在其整个堆栈帧中使用该区域,而不是在开头和结尾中调整堆栈指针。这一区域被称为红色区域。

根据这两个引号,

  • 是堆叠返回地址上方的红色区域,还是堆叠返回地址下面的?此红色区域相对于RSP,是否随着每个push向下移动,是否随着每个push向上移动
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-27 03:18:06

根据这两个引号,红色区域位于堆栈返回地址的上方还是下方?

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

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

是。

票数 23
EN

Stack Overflow用户

发布于 2017-12-11 04:37:10

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

我在2017年4月修改了这篇文章来解决这个问题。在更新时,Wikipedia article是这样写的:

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

这使得维基百科的文章更符合64位System V ABI的定义。在解决了上面的歧义之后,关于这个问题:

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

红色区域始终是RSP下面的128个字节。随着RSP的改变(通过PUSH/POP/MOV等方式),Red Zone的位置也随之改变。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38042188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档