首页 文章

什么是ABI(应用程序二进制接口)?

提问于
浏览
18

这就是维基百科所说的:

在计算机软件中,应用程序二进制接口(ABI)描述应用程序(或任何类型)程序与操作系统或其他应用程序之间的低级接口 . ABI涵盖了数据类型,大小和对齐等细节;调用约定,它控制函数参数的传递方式并返回检索的值;系统调用号码以及应用程序应如何向操作系统发出系统调用;并且在完整的操作系统ABI的情况下,目标文件,程序库等的二进制格式 . 完整的ABI(例如英特尔二进制兼容性标准(iBCS))允许来自支持该ABI的一个操作系统的程序在不修改任何其他此类系统的情况下运行,前提是存在必要的共享库,并且满足类似的先决条件 .

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

3 回答

  • 4

    规范是比惯例更合适的术语,因为惯例是广泛接受的实践的松散术语,而规范是明确定义的 .

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

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

    文档是数据表中的数字逻辑内容,用于通过汇编语言编写的芯片,对于更高级别的语言,交叉编译器工具链文档提供了应该成为ABI一部分的假设 .

  • 12

    你对ABI的定义是正确的,直到某一点 . 典型的例子是Linux(和其他UNIX)中的 syscall 接口 .

    它们是代码请求操作系统执行某些任务的标准方法 .

    因此,它们是由编写OS的人决定的,或者在后来添加了 syscalls 的情况下由添加它们的人决定(在操作系统允许的情况下) . 例如,x86上的Linux syscall 接口声明您将 syscall 数加载到 eax 中,其他参数放在 ebxecx 等等,具体取决于您正在制作的 syscalleax ) .

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

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

  • 2

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

相关问题