ABI 中似乎没有提及 Aarch64 的“红色区域”,但是 Microsoft 提到了 Aarch64 的 16 字节红色区域,Apple 在 Writing ARM64 中声称有 128 字节红色区域Apple 平台的代码 和 iOS 讨论。 Google-groups: AArch64 debug build woes 中也同样讨论了 128 字节的红色区域。然而,除了 Microsoft 和 Apple 链接之外,其他链接都只是“讨论”,没有提供任何主要文档的参考。
我在developer.arm.com文档中找不到任何参考。 Linux 上是否有适用于 Aarch64 的有效红区?它是否与 x86_64 类似?它的尺寸是多少? (这将是有意义的,它将与 x86_64 红色区域一致 - 如果存在的话)是否有一个主要的 ABI 文档可以解决 Aarch64 for Linux 上的红色区域?
如果存在,并且可以保证它不会被中断处理、某些系统调用等覆盖,那么无需调整
sp
,它肯定会很方便地从头开始使用。这基本上就是我想要确定的。
据我所知,Linux AArch64 ABI 不包含红色区域。例如,您可以看到,即使对于简单的代码,gcc 和 clang 也不会使用红色区域,这样做很明显,并且在 x86-64 上使用红色区域。
ARM 当前的官方 AAPCS ABI 发布在 Github 上。他们不提供红色区域。事实上,它专门禁止代码访问 SP 以下的区域:
T 堆栈的活动区域是由半开区间 [T.SP, T.base) 界定的内存区域。当 T.SP 等于 T.base 时,活动区域为空。
T 堆栈的非活动区域是由半开区间 [T.limit, T.SP) 表示的内存区域。当 T.SP 等于 T.limit 时,非活动区域为空。
[...]
- 不允许任何线程访问(读或写)S 的非活动区域。
据我所知,Linux 完全遵循 AAPCS ABI。 Linux 内核文档中没有提到任何差异,除了一个允许将标记指针传递给系统调用的功能,这与我们无关。
Microsoft 和 Apple 使用变体 AArch64 ABI,它们大部分遵循 AAPCS,但有一些已记录的差异,并且在每种情况下,它们确实提供某种红色区域。
正如您所见(以及在更多官方文档中),Microsoft 的 ABI 提供了 16 字节的红色区域,但它是为调试器保留的,应用程序可能不会使用它。因此,这意味着信号处理代码等不得覆盖该区域。
对于 Apple,您链接的页面的存在正是为了描述他们的 ABI 与 AAPCS 的不同之处。事实上,Apple 的 ABI 提供了一个 128 字节的红色区域,应用程序允许使用该区域。