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

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

本节书摘来自异步社区《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是由内核和工具链定义和实现的。

相关文章
|
3月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
137 13
|
7月前
|
存储 Linux API
Linux源码阅读笔记08-进程调度API系统调用案例分析
Linux源码阅读笔记08-进程调度API系统调用案例分析
|
7月前
|
Linux API
Linux源码阅读笔记07-进程管理4大常用API函数
Linux源码阅读笔记07-进程管理4大常用API函数
|
7月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
92 0
|
7月前
|
应用服务中间件 Linux API
Linux 利用 Cloudflare API 配置 acme.sh 自动续签 SSL (Apache、Nginx适用)
安装acme.sh工具,命令为`curl https://get.acme.sh | sh -s email=你的邮箱`。接着配置Cloudflare API,创建并记录API令牌及Zone ID。最后通过`acme.sh --issue -d 你的域名 --dns dns_cf`签发SSL证书,对于Nginx可使用`acme.sh --install-cert`命令安装证书,并设置自动重载Nginx服务。
|
8月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
416 2
|
9月前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
171 1
|
10月前
|
Linux API
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
Linux系统编程之文件编程常用API回顾和文件编程一般步骤
|
10月前
|
存储 Unix Linux
【Linux系统编程】基础指令(三)
【Linux系统编程】基础指令(三)
|
10月前
|
Linux
【Linux系统编程】基础指令(二)(下)
【Linux系统编程】基础指令(二)