这是维基百科所说的:
在计算机软件中,一个应用程序 二进制接口(ABI)描述了 一个低级别的接口 应用程序(或任何类型的)程序 和操作系统或其他 应用
ABI涵盖数据类型等详细信息, 大小和对齐;呼唤 惯例,控制如何 函数的参数传递和 检索返回值;系统 电话号码以及如何申请 应该进行系统调用 操作系统;在一个案例中 完整的操作系统ABI ,. 二进制格式的目标文件,程序 图书馆等。一个完整的ABI, 例如英特尔二进制兼容性 标准(iBCS)允许程序 从一个操作系统支持 ABI无需修改即可运行 在任何其他此类系统上提供 必要的共享库是 现在和类似的先决条件是 满足。
我猜ABI是一种约定或标准,编译器/链接器使用此约定来生成目标代码。是对的吗?如果是这样,谁制定了这些约定(公司或某个组织)?什么时候没有ABI?我们可以参考哪些关于这些ABI的文件?
答案 0 :(得分:12)
你对ABI的定义是正确的,直到某一点。典型的例子是Linux(和其他UNIX)中的syscall
接口。
它们是代码请求操作系统执行某些职责的标准方法。
因此,它们是由编写OS的人决定的,或者在稍后添加syscalls
的情况下由添加它们的人决定(在操作系统允许的情况下)。例如,x86上的Linux syscall
接口声明您将syscall
号加载到eax
,其他参数放在ebx
,ecx
等等,取决于您所做的syscall
(eax
)。
通常情况下,不是编译器或链接器进行接口工作,而是为您正在使用的语言提供的库。
返回Linux,GNU C库包含fopen
的代码(例如),最终调用相关的syscall
来执行较低级别的任务(系统调用号5,open
) 。可以在this PDF file中找到syscalls
的列表。
答案 1 :(得分:4)
规范是比惯例更合适的术语,因为惯例是广泛接受的惯例的松散术语,而规范是明确定义的。
你是对的。规范由标准化机构制定。看一下Windows支持的POSIX规范和编译器/构建工具链,例如gcc假设操作系统要遵守它,甚至Linux内核部分(几乎完全)遵守它。
在ABI之前?即使在今天,固件也是手工制作的,因为新的芯片出现在机顶盒和其他具有嵌入式系统的设备中。
文档是数据表中的数字逻辑内容,用于通过汇编语言编写的芯片,对于更高级别的语言,交叉编译器工具链文档提供了应该成为ABI一部分的假设。 / p>