19

这是维基百科所说的:

在计算机软件中,应用程序二进制接口 (ABI) 描述了应用程序(或任何类型的)程序与操作系统或另一个应用程序之间的低级接口。

ABI 涵盖数据类型、大小和对齐方式等细节;调用约定,它控制函数的参数如何传递和返回值的检索;系统调用号以及应用程序应如何对操作系统进行系统调用;而在完整的操作系统ABI的情况下,目标文件、程序库等的二进制格式。一个完整的 ABI,例如英特尔二进制兼容性标准 (iBCS),允许来自一个支持该 ABI 的操作系统的程序无需修改即可在任何其他此类系统上运行,前提是存在必要的共享库并满足类似的先决条件。

我猜 ABI 是一种约定或标准,编译器/链接器使用此约定来生成目标代码。那正确吗?如果是这样,谁制定了这些约定(公司或某些组织)?没有 ABI 的时候是什么样的?是否有关于这些 ABI 的文档可供我们参考?

4

3 回答 3

13

在某种程度上,您对 ABI 的定义是正确的。典型的例子是syscallLinux(和其他 UNIX)中的接口。

它们是代码请求操作系统执行某些职责的标准方式。

因此,它们由编写操作系统的人决定,或者在syscalls以后添加的情况下,由添加它们的人决定(在操作系统允许的情况下)。例如,syscallx86 上的 Linux 界面声明您将syscall数字加载到eax中,其他参数放置在 中ebxecx依此类推,具体取决于syscall您正在制作的 ( eax)。

通常,执行接口工作的不是编译器或链接器,而是为您正在使用的语言提供的库。

回到 Linux,GNU C 库包含fopen(例如)最终调用相关代码syscall以执行较低级别任务的代码(系统调用编号 5,open)。syscalls可以在此 PDF 文件中找到列表。

于 2011-01-27T10:13:10.993 回答
4

规范是比约定更合适的术语,因为约定是广泛接受的实践的宽松术语,而规范是明确定义的。

你说的对。该规范由标准化机构制定。看看 Windows 支持的 POSIX 规范,编译器/构建工具链(例如 gcc)假定操作系统遵守它,甚至 Linux 内核也部分(几乎完全)遵守它。

在 ABI 之前?即使在今天,随着用于机顶盒和其他具有嵌入式系统的设备的新芯片出现,固件也是手工制作的。

该文档是数据表中的数字逻辑内容,用于通过汇编语言和高级语言编程的芯片,交叉编译器工具链文档给出了应该成为 ABI 一部分的假设。

于 2013-04-10T02:31:56.843 回答
2

好吧,ABI 的概念大概是为了支持您的程序在其他操作系统和机器架构上的二进制兼容性。因此,假设您在某个运行在 x86 架构上的操作系统发行版上编写了一个程序。现在,对于程序员来说,最重要的是,您在您的机器上编写的这个程序应该能够在运行在相同或不同架构上的任何其他机器上完全相同地运行,为了便于讨论,假设另一台机器正在运行在 i386 架构上,这就是 ABI 或应用程序二进制接口的概念出现的地方。由于每个机器架构都定义了自己的操作系统内核与外界对话的方式,即用户空间程序,因此每个架构都定义了不同的集合系统调用、机器寄存器、这些寄存器是如何使用的,内核如何处理软件中断等等。ABI 是为你处理这些事情的东西,比如编译、链接、字节排序等等。系统程序员很难为在不同架构上运行的相同操作系统定义统一的 ABI,这就是为什么每种机器架构都有自己的架构,您需要编译程序以确认这些机器具有的格式。

于 2015-04-22T19:09:29.230 回答