ABI和API的区别

API:应用程序接口(英语:Application Programming Interface,缩写:API;又称为应用程序编程接口

ABI:应用程序机器二元码接口(英语:Application Binary Interface,缩写为ABI

API,顾名思义,又称为应用程序编程接口,也就是说这个是在编程的时候所用到的概念,是源代码级别的东西。是一种或几种编程语言互相调用,互相连接的纽带。它定义了一个函数的参数类型,参数个数,函数返回值等。在编写源代码时都是可以直接看到的,可以直接拿来用的。

read(2),write(2),kmalloc(),printk() 等都是可以在源代码中可以调用的API。

ABI:一个 ABI 定义了机器码(二进制)如何访问数据结构与运算程序。ABI 定义特定体系结构上两个或多个软件之间的低级二进制接口。它定义了应用程序如何与自身交互,应用程序如何与内核交互,以及应用程序如何与库交互。

ABI涵盖了各种细节:

  • 数据类型的大小、布局和对齐。
  • 调用约定(控制着函数的参数如何传送以及如何接受返回值)例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先 push 到栈上还是最后;内核里面定义的某个结构体的某个字段偏移是多少等等。

由此看来,如果 ABI 保持稳定的话,你在之前版本上编译好的二进制应用程序、内核模块,完全可以无须重新编译直接在新版本上运行。

比如,在内核中 int register_netdevice(struct net_device *dev) 这个内核函数原型基本上是不会变的,所以保持这个 API 稳定是很简单的,但它的 ABI 就未必了,就算是这个函数定义本身没变,即 API 没变,而 struct net_device 的定义变了,里面多了或者少了某一个字段,它的 ABI 就变了,你之前编译好的二进制模块就很可能会出错了,必须重新编译才行。

参考链接:

https://zh.wikipedia.org/wiki/应用程序接口

https://zh.wikipedia.org/wiki/应用二进制接口

https://blog.csdn.net/xinghun_4/article/details/7905298

https://cloud.tencent.com/developer/ask/73515

本文章首发于个人博客 LLLibra146’s blog
本文作者:LLLibra146
版权声明:本博客所有文章除特别声明外,均采用 © BY-NC-ND 许可协议。非商用转载请注明出处!严禁商业转载!
本文链接https://blog.d77.xyz/archives/394407d8.html