Linux系统编程核心概念与标准详解
1. API与ABI的区别
在软件开发中,API(应用程序编程接口)和ABI(应用程序二进制接口)是两个重要的概念。
API常被称为“契约”,但严格来说,至少从法律意义上讲,这种说法并不准确,因为API并非双向协议。API用户(通常是高级软件)对API及其实现没有任何输入权,只能选择使用或不使用。API的作用是确保如果两个软件都遵循该API,它们的源代码是兼容的,即API用户能够针对API的实现成功编译代码。例如,C标准定义并由标准C库实现的接口就是API的一个实际例子,它定义了一系列基本且重要的函数,如内存管理和字符串操作例程。
而ABI定义了特定架构上两个或多个软件之间的二进制接口,它规定了应用程序自身、应用程序与内核以及应用程序与库之间的交互方式。与API确保源代码兼容性不同,ABI确保二进制兼容性,保证一段目标代码在具有相同ABI的任何系统上都能运行,无需重新编译。ABI涉及调用约定、字节序、寄存器使用、系统调用调用、链接、库行为和二进制对象格式等问题。例如,调用约定定义了函数的调用方式、参数的传递方式、哪些寄存器被保留以及哪些被修改,以及调用者如何获取返回值。
尽管人们曾多次尝试为给定架构在多个操作系统上定义单一的ABI(特别是在Unix系统上的i386架构),但这些努力并未取得太大成功。相反,包括Linux在内的操作系统倾向于根据自身需求定义自己的ABI。ABI与架构密切相关,大多数ABI都涉及特定于机器的概念,如特定的寄存器或汇编指令。因此,在Linux上,每种机器架构都有自己的ABI,我们通常根据机器名称来称呼特定的ABI,如Alpha或x86 - 64。系统程序员应该了解ABI,但通常不需要记住它。ABI
超级会员免费看
订阅专栏 解锁全文
11万+

被折叠的 条评论
为什么被折叠?



