Aarch64 在 Linux 上是否有红区,如果有的话 16 或 128 字节?

问题描述 投票:0回答:1

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
,它肯定会很方便地从头开始使用。这基本上就是我想要确定的。

arm64
1个回答
0
投票

据我所知,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 字节的红色区域,应用程序允许使用该区域。

在我看来,AArch64 比 x86-64 更少需要红色区域,因为加载/存储指令中可用的前/后索引寻址模式通常可以让您调整堆栈指针,以实现零额外成本代码大小或周期。如果您的函数需要堆栈上的临时空间,您的第一条存储指令可以预先递减堆栈指针以分配空间,而最后一次访问可以后递增以释放它。 (假设您静态地知道哪个存储是第一个,哪个负载是最后一个,以及需要多少空间 - 但这可能适用于那些将从红色区域中受益的简单函数。)

© www.soinside.com 2019 - 2024. All rights reserved.