43

我看这个 PDF(ARM 架构的应用程序二进制接口:基本标准)越多,我就越不明白它的含义。另外,我想对Procedure Call Standard for the ARM ArchitectureELF for the ARM Architecture发表一些评论。

4

3 回答 3

84

ABI(应用程序二进制接口)是一种标准,它定义了高级语言中的低级概念与特定硬件/OS 平台的机器代码的能力之间的映射。这包括以下内容:

  • C/C++/Fortran/...数据类型在内存中的布局方式(数据大小/对齐方式)
  • 嵌套函数调用是如何工作的(关于如何返回函数调用者的信息存储在哪里以及如何存储,在 CPU 寄存器和/或内存中函数参数的传递位置)
  • 程序启动/初始化如何工作(“可执行文件”具有什么数据格式,如何从那里加载代码/数据,DLL如何工作......)

这些问题的答案是:

  • 特定于语言的(因此您有 C ABI、C++ ABI、Fortran ABI、Pascal ABI ......甚至 Java 字节码规范,虽然针对“虚拟”处理器而不是真实硬件,但也是 ABI),
  • 特定于操作系统(同一硬件上的 MS Windows 和 Linux 使用不同的 ABI),
  • 硬件/CPU 特定(ARM 和 x86 ABI 不同)。
  • 随着(长时间)的发展(现有的 ABI 经常被更新/修订,以便可以使用新的 CPU 功能,例如,指定应用程序如何使用 x86 SSE 寄存器当然只有一次可能CPU具有这些 regs,因此需要澄清现有的 ABI)。

如果没有某种这种标准化,由不同编译器创建的(机器)代码不能使用相同类型的库(你怎么知道库代码期望以哪种方式传递函数参数或数据结构?)。

每个平台(特定硬件、操作系统软件和以特定编程语言编写/使用特定编译器编译的代码的组合)都定义了一整套 ABI,以使事物具有互操作性。这方面的术语并不明确,有时人们只是谈论“ABI”,有时它被称为“平台补充”,或者提到编程语言并说例如“C++ ABI”。请记住,没有这样的事情。

您在问题中链接到的文档都是这方面的具体示例(语言/操作系统/硬件特定的 ABI)。

即使在特定平台上,也没有必要拥有一个且只有一个ABI(集),因为不同的此类约定可能具有不同的优势(因此提供更好的性能/更小的代码/更好的内存使用/... - 取决于程序)系统设计人员通常会尝试灵活/允许。
例如,在 32 位 Microsoft Windows 上,函数调用约定部分有大量 ABI(fastcall、stdcall、pascal、...)。

无论如何,对“ABI”的通用 stackoverflow 搜索(包括“相关”侧边栏下的链接)提供了很多研究这个问题的线索,所以我在这一点上关闭了我的答案。

于 2011-11-09T10:07:28.373 回答
21

当使用 ARM 上的 OS 内核端口时,应参考 ARM ABI。

EABI 是指处理器启动以加载没有中间内核的应用程序。(类似于DOS出现时曾经有ROM-BASIC),即固件本身是独立的应用程序,没有特定于板的监视器或任何东西。

第一个链接是与 ARM ABI 的过程调用相关的详细子部分。随着每个版本的 ARM CPU 的程序员模型的进步,这些主题很重要并且被 ABI 涵盖。

第二个链接是关于由名为 ELF 的编译器生成的目标文件的二进制格式规范,该编译器由 OS 供应商品牌 SCO 指定。也许 SCO 是 Santa Cruz 组织,它制作了自己的 Unix 和 Linux 风格,但是这个故事偏离了这个问题。如果您打算实现支持针对 ARM 的 ELF 的链接器,您应该对此感兴趣。

除非您直接关心 ARM 构建工具链的实现细节,否则 EABI 应该很少关注,除非您考虑到此类工具链的操作系统特定方面,否则 ARM ABI 也应该很少关注。

于 2013-04-10T09:15:11.363 回答
1

ABI 基本上是函数/过程如何通过寄存器(编译形式)相互传递信息,返回值存储在哪里(指定寄存器)。在 x86 或 x86-x64 中,它被称为 ABI(应用程序二进制接口)。

在 ARM 架构中,它被称为 EABI(扩展应用程序二进制接口)。2000 年之前的 ABI 被称为 OABI(旧的应用程序二进制接口),现在已经过时了。在 EABI 中,信息/参数以整数的形式传递。支持硬件浮点的 ARM 处理器使用浮点寄存器传递参数,称为 EABIHF(扩展应用程序二进制接口硬浮点)。

于 2020-03-08T05:57:39.673 回答