《Linux系统编程(第2版)》——1.2 API和ABI

news/2024/7/20 15:50:06 标签: 操作系统, 开发工具, 内存管理

本节书摘来自异步社区《Linux系统编程(第2版)》一书中的第1章,第1.2节,作者:【美】Robert Love著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 API和ABI

程序员都希望自己实现的程序能够一直运行在其声明支持的所有系统上。他们希望能在自己的Linux版本上运行的程序也能够运行于其他Linux版本,同时还可以运行在其他支持Linux体系结构的更新(或更老)的Linux版本上。

在系统层,有两组独立的影响可移植性的定义和描述。一是应用程序编程接口(Application Programming Interface,API),二是应用程序二进制接口(Application Binary Interface,ABI),它们都是用来定义和描述计算机软件的不同模块间的接口的。

1.2.1 API
API定义了软件模块之间在源代码层交互的接口。它提供一组标准的接口(通常以函数的方式)实现了如下抽象:一个软件模块(通常是较高层的代码)如何调用另一个软件模块(通常位于较低层)。举个例子,API可以通过一组绘制文本函数,对在屏幕上绘制文本的概念进行抽象。API仅仅是定义接口,真正提供API的软件模块称为API的实现。

通常,人们把API称为“约定”,这并不合理,至少从API这个术语角度来讲,它并非一个双向协议。API用户(通常是高级软件)并没有对API及其实现提供任何贡献。API用户可以使用API,也可以完全不用它:用或不用,仅此而已!API的职能只是保证如果两个软件模块都遵循API,那么它们是“源码兼容”(source compatible),也就是说,不管API如何实现,API用户都能够成功编译。

API的一个实际例子就是由C标准定义的接口,通过标准C库实现。该API定义了一组基础函数,比如内存管理和字符串处理函数。

在本书中,我们会经常提到各种API,比如第3章将要讨论的标准I/O库。1.3节给出了Linux系统编程中最重要的API。

1.2.2 ABI
API定义了源码接口,而ABI定义了两个软件模块在特定体系结构上的二进制接口。它定义了应用内部如何交互,应用如何与内核交互,以及如何和库交互。API保证了源码兼容,而ABI保证了“二进制兼容(binary compatibility)”,确保对于同一个ABI,目标代码可以在任何系统上正常工作,而不需要重新编译。

ABI主要关注调用约定、字节序、寄存器使用、系统调用、链接、库的行为以及二进制目标格式。例如,调用约定定义了函数如何调用,参数如何传递,分别保留和使用哪些寄存器,调用方如何获取返回值。

尽管曾经在不同操作系统上为特定的体系结构定义一套唯一的ABI,做了很多努力,但是收效甚微。相反地,操作系统(包括Linux)往往会各自定义自己独立的ABI,这些ABI和体系结构紧密关联,绝大部分ABI表示了机器级概念,比如特定的寄存器或汇编指令。因此,在Linux,每个计算机体系结构都定义了自己的ABI。实际上,我们往往通过机器体系结构名称来称呼这些ABI,如Alpha或x86-64。因此,ABI是操作系统(如Linux)和体系结构(如x86-64)共同提供的功能。

系统编程需要有ABI意识,但通常没有必要记住它。ABI并没有提供显式接口,而是通过工具链(toolchain),如编译器、链接器等来实现。尽管如此,了解ABI可以帮助你写出更优化的代码,而如果你的工作就是编写汇编代码或开发工具链(也属于系统编程范畴),了解ABI就是必需的。

ABI是由内核和工具链定义和实现的。


http://www.niftyadmin.cn/n/1576595.html

相关文章

Vue知识点总结(11)——组件通信-父传子(超级详细)

前两期我们简单了解了一下Vue中局部组件和全局组件的创建和使用。 组件创建之后,很重要的一个环节就是通信,一个项目中肯定是有非常多的组件的,它们肯定要能够互相联系,共同收集数据、处理数据、传递数据。 这期我们说一下组件通信…

《Node应用程序构建——使用MongoDB和Backbone》一2.2 Express

本节书摘来自异步社区《Node应用程序构建——使用MongoDB和Backbone》一书中的第2章,第2.2节,作者【美】Mike Wilson,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.2 Express Node应用程序构建——使用MongoDB和Backbone本书中应用…

Vue知识点总结(12)——组件通信-子传父(超级详细)

在上一期中&#xff0c;我们说了什么是组件通信&#xff0c;并且详细讲解了一下组件通信中的父传子。 既然存在父组件向子组件传值&#xff0c;那必然存在子组件向父组件传值。 这期我们就说一下组件通信中的子传父。 <div id"app"><App></App><…

面试题三:设计包括 min 函数的栈。

3.设计包括 min 函数的栈。 定义栈的数据结构&#xff0c;要求加入一个 min 函数。可以得到栈的最小元素。要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。 思路分析: a.要想一个在栈中找出栈的最小值,且时间复杂度为1,我们可能回忆到每次向栈插入push()一个值都对其进行…

Vue知识点总结(13)——组件通信-平行传值(超级详细)

hello&#xff0c;同学们&#xff0c;之前我们已经学习了组件通信中的父传子和子传父。 今天我们要学习的内容是组件通信中的平行传值。 平行传值是什么意思呢&#xff1f; 就比如你和哥哥、弟弟、姐姐、妹妹的关系&#xff0c;就是平辈的关系。 之前我们使用组件的时候&#x…

Vue知识点总结(14)——其它组件通信方式(provide/inject和$parent/$children)(超级详细)

这期是组件通信的最后一期&#xff0c;把剩余的组件通信方式再全部介绍一下。 分别是provide/inject 和 $parent/&#xff04;children。 我们用下面这个示例&#xff0c;把这两种通信方式全部展示一下。 <div id"app"><App></App> </div>…

你值得拥有 —— 25 个 Linux 性能监控工具

你值得拥有 —— 25 个 Linux 性能监控工具 一段时间以来&#xff0c;我们在网上向读者介绍了如何为Linux以及类Linux操作系统配置多种不同的性能监控工具。在这篇文章中我们将罗列一系列使用最频繁的性能监控工具&#xff0c;并对介绍到的每一个工具提供了相应的简介链接&…

Vue知识点总结(15)——匿名插槽(超级详细)

我们在前几期已经说过了组件的各种知识。 接下来我们就要学习插槽的内容了&#xff0c;插槽是Vue组件化开发的拓展内容。 官方文档种解释插槽的作用就是&#xff1a;在vue中实现的一套分发内容的API&#xff0c;将slot元素作为承载内容分发出口。 用大白话说就是&#xff1a;…