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