ARM ABI和EABI的用途是什么?

ARM ABI和EABI的用途是什么?,arm,abi,eabi,Arm,Abi,Eabi,我看这个PDF()越多,就越不理解它的意思。另外,我还想对和发表一些评论。ABI(应用程序二进制接口)是一个标准,它定义了高级语言中低级概念与特定硬件/操作系统平台机器代码能力之间的映射。这包括: 如何使用C/C++/Fortran/数据类型在内存中布局(数据大小/对齐) 嵌套的函数调用如何工作(有关如何返回函数调用方的信息存储在何处以及如何存储,CPU寄存器和/或内存中函数参数的传递位置) 程序启动/初始化的工作原理(一个“可执行文件”有什么数据格式,如何从那里加载代码/数据,DLL如何工作

我看这个PDF()越多,就越不理解它的意思。另外,我还想对和发表一些评论。

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拥有这些REG时才可能,因此需要澄清现有的ABI)
如果没有某种标准化,由不同编译器创建的(机器)代码就不能使用相同类型的库(您如何知道库代码希望以何种方式传递函数参数或数据结构?)

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

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

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


无论如何,对“ABI”的一般stackoverflow搜索(包括“相关”侧栏下的链接)提供了很多研究这个问题的线索,我现在就结束我的回答。

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

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

第一个链接是与ARM ABI的过程调用相关的详细子部分。随着每个版本的ARM CPU对程序员模型的改进,这些主题非常重要,ABI也涵盖了这些主题

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


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

ABI基本上是功能/过程如何通过寄存器相互传递信息(编译形式),其中存储返回值(指定寄存器)。在x86或x86-x64中称为ABI()

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

这是一个家庭作业问题,如“什么是ABI及其用途-解释,在ARM[E]ABI示例中说明?”?这个问题的答案可能会成为一本书,因此,为了在stackoverflow帖子中对其进行总结,如果你能更精确一点,那会有所帮助。这是不正确的。简单地说,ABI描述了函数之间传递数据的方式,而不管是否涉及操作系统。EABI是ARM上可用的ABI之一,并且是版本y在操作系统的上下文中非常相关(参见示例)@user2524350 Debian示例只是加强了Debian作为ROM-BASIC示例的替代品的资格。如果您发现您的fav*nix发行版在简洁地构建上下文而不是编写整本书时比较容易混淆,请随意给出更准确的答案,而不是拖拉。E of EABI代表“嵌入”,而不是扩展