14.1.4 Red Zone
red zone 是一段 128 字节的区域,从 rsp 向低地址延伸。它放宽了“比 rsp 更低的地址没有数据”的限制;在 red zone 上存放数据是安全的,而且不会被系统调用或者中断所覆盖。这里我们说的是在不改变 rsp 的前提下用相对于 rsp 的地址的直接内存写的情况。如果进行函数调用,那还是有可能覆盖掉 red zone。
red zone 的存在是为了一种特殊的优化。如果一个函数在生命周期内不调用任何其它函数,那么就可以忽略掉其栈帧的创建 (rbp 的变化)。局部变量和参数可以使用 rsp 的相对地址进行访问,而不是 rbp。此外:
- 局部变量的总大小不应超过 128 字节。
- 函数是叶子函数(不调用其它任何函数)。
- 函数不修改 rsp 寄存器;否则就不可能用相对 rsp 的地址去访问内存了。
通过向前挪动 rsp,你依然可以获得可以分配数据的比 128 字节大的空闲空间。参见 16.1.3 节。