在计算中,红色区域是函数堆栈帧中不被该函数保留的返回地址之外的固定大小的区域。被调用者函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销。该内存区域不会被中断/异常/信号处理程序修改。System V使用的x86-64ABI规定了一个128字节的红色区域,该区域在返回地址之后直接开始,并包括函数的参数。OpenRISC工具链假设有一个128字节的红色区域。
超出%rsp指向的位置的128字节区域被认为是保留的,信号或中断处理程序不应对其进行修改。因此,函数可以使用此区域存储跨函数调用不需要的临时数据。特别地,叶函数可以在其整个堆栈帧中使用该区域,而不是在开头和结尾中调整堆栈指针。这一区域被称为红色区域。
根据这两个引号,
RSP
,是否随着每个push
向下移动,是否随着每个push
向上移动发布于 2016-06-27 03:18:06
根据这两个引号,红色区域位于堆栈返回地址的上方还是下方?
红色区域是rsp
下面的128个字节,即rsp - 128
到rsp - 1
。
由于这个红色区域是相对于RSP的,它是否随着每次推动而向下移动,是否随着每次弹出而向上移动?
是。
发布于 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的位置也随之改变。
https://stackoverflow.com/questions/38042188
复制相似问题