在ABI中似乎没有提到Aarch64的"红区",但是Aarch64的Microsoft makes reference to a 16-byte red zone,苹果声称在Writing ARM64 code for Apple platformsiOS discussion中有一个128字节的红区.在Google-groups: AArch64 debug build woes中类似地讨论了128字节的红色区域.然而,除了微软和苹果的链接,其他的只是"讨论",没有一个提供任何主要文档的参考.

我在developer.arm.com文档中找不到任何参考.在Linux上,Aarch64是否有一个有效的红色区域?它是否类似于x86_64?它的大小是多少?(它应该与x86_64红区一致--如果它存在的话)是否有一个主要的ABI文档在某个地方解决了Aarch64 for Linux上的红区?

如果存在的话,它对于临时使用来说肯定是很方便的,不需要调整sp,并且可以保证它不会被中断处理、一些系统调用等覆盖.这基本上就是我想要确定的.

推荐答案

据我所知,Linux AArch 64 ABI不包括红色区域. 例如,你可以see gcc和clang不会使用红色区域,即使对于简单的代码,红色区域是在x86-64上使用的.

此外,这是一个test program,至少在我的设备上(覆盆子PI 4B上的Archlinuxarm aarch64)显示,当处理信号时,紧挨着sp的区域被覆盖.

ARM目前的官方AAPC ABI是posted on Github.他们没有提供红区.事实上,它明确禁止代码访问SP以下的区域:

  • T的堆栈的活动区域是由半开间隔[T.SP,T.base]分隔的内存区.当T.SP等于T.base时,有源区为空.

  • T的堆栈的非活动区域是由半开放间隔[T.Limit,T.SP)表示的存储器区域.当T.SP等于T.Limit时,非活动区域为空.

[.]

  • 不允许任何线程访问(用于读取或写入)S的非活动区域.

据我所知,Linux完全遵循aAPCABI.在Linux kernel documentation中没有提到任何不同之处,除了一个允许将标记指针传递给系统调用的功能,这与我们无关.

微软和苹果使用了变种AArch64ABI,mostly遵循aAPC,但有一些有文档记录的差异,而且在每种情况下,它们都提供了某种类型的红区.

  • 正如您看到的(也是in more official docs),Microsoft的ABI提供了一个16字节的红色区域,但它是为调试器保留的,应用程序可能不会使用它.因此,它的所有意思是信号处理代码等不能覆盖该区域.

  • 对于苹果来说,你链接的页面恰恰是为了描述他们的ABI differs是如何来自aAPC的.事实上,苹果的ABI提供了一个128字节的红色区域,允许应用程序is使用.(尽管我似乎无法创建代码来说服苹果的clang编译器使用它.)

在我看来,与x86-64相比,AArch64对红色区域的需求较少.首先,AArch64的寄存器数量大约是AArch64的两倍,因此您首先不太可能需要将数据溢出到堆栈.其次,加载/存储指令中提供的前/后索引寻址模式通常可以让您在代码大小或周期中零额外成本地调整堆栈指针.如果你的函数需要堆栈上的暂存空间,你的第一条存储指令可以预先递减堆栈指针来分配空间,而你的最后一次访问可以后递增来释放它.(假设您静态地知道哪个存储是第一个,哪个加载是最后一个,以及需要多少空间-但这很可能适用于那些原本会受益于红色区域的简单函数.)

Linux相关问答推荐

std::chrono::time_zone 在不同操作系统上不可用

Powershell Core,MXLinuxv21,运行 linux /usr/bin/x 命令导致对象命令运行时找不到文件

使用 bash 命令将文件从子文件夹复制到另一个

从另一个文件中的大文件中查找行的最快方法

为什么 printf 仍然可以使用低于 XMM 寄存器中 FP args 数量的 RAX?

如何判断 Linux 机器是否支持 AVX/AVX2 指令?

并行制作:将 -j8 设置为默认选项

使用 RPATH 但不使用 RUNPATH?

有没有办法在整个项目代码中的某个日期之后找出更改的文件?

pthread_exit 与返回

为什么 mmap() 比顺序 IO 快?

为什么 JVM 报告的已提交内存比 linux 进程驻留集大小更多?

如何使用 Ansible 等待服务器重启?

如何在 Linux 上查找不包含文本的文本文件?

从线程内Forking 是否安全?

如何将路径名中的..转换为 bash 脚本中的绝对名称?

如何在 Linux 中删除早于特定日期的文件?

如何从 Linux 终端找到特定文件?

rename() 是原子的吗?

如何安装python开发者包?