ARM ABI和EABI的目的是什么?

时间:2011-11-09 03:59:54

标签: arm abi eabi

我越看PDF,我就越不明白这意味着什么。另外,我想对其他人12发表一些意见。

3 个答案:

答案 0 :(得分:65)

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

  • 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 拥有这些注册表时才可以使用,因此需要澄清现有的ABI。)

如果没有某种标准化,不同编译器创建的(机器)代码就无法使用相同类型的库(您如何知道库代码需要以哪种方式传递函数参数或数据结构?)。

每个平台(特定硬件,操作系统软件和用特定编程语言编写的代码/用特定编译器编译的组合)定义了一整套ABI 来制作事情可互操作。这个领域的术语不清楚,有时人们只是谈论“ABI”,有时候它被称为“平台补充”,或者人们提到编程语言并且说例如“C ++ ABI”。请记住,没有一件事。

您在问题中链接的文档都是此类的特定示例(语言/操作系统/硬件特定的ABI)。

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

无论如何,通用stackoverflow搜索“ABI”(包括“相关”侧栏下的链接)给了很多线索来研究这个问题,我现在关闭了我的答案。

答案 1 :(得分:21)

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

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

第一个链接是与ARM ABI的过程调用相关的详细子部分。随着程序员的模型在每个版本的ARM CPU中不断发展,这些主题非常重要,并由ABI涵盖。

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

除非您直接关注ARM构建工具链的实现细节,否则EABI应该没什么问题,除非您考虑到此类工具链的操作系统特定方面,因此ARM ABI也应该没什么问题。< / p>

答案 2 :(得分:1)

ABI基本上是函数/过程如何通过寄存器(编译形式)相互传递信息的地方,其中存储了返回值(指定寄存器)。在x86或x86-x64中,它称为ABI(Application binary interface)。

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