API、ABI区别

http://blog.csdn.net/xinghun_4/article/details/7905298php

 

应用程序二进制接口(ABI-Application Binary Interface)定义了一组在PowerPC系统软件上编译应用程序所须要遵循的一套规则。主要包括基本数据类型,通用寄存器的使用,参数的传递规则,以及堆栈的使用等等。html

ABI涵盖了各类细节:如数据类型、大小和对齐;调用约定(控制着函数的参数如何传送以及如何接受返回值);系统调用的编码和一个应用如何向操做系统进行系统调用;以及在一个完整的操做系统ABI中,目标文件的二进制格式、程序库等等。一个完整的ABI,像Intel二进制兼容标准 (iBCS)[1] ,容许支持它的操做系统上的程序不经修改在其余支持此ABI的操做体统上运行。编程

其余的 ABI 标准化细节包括 C++ 名称修饰[2] ,和同一个平台上的编译器之间的调用约定[3],可是不包括跨平台的兼容性。api

ABI不一样于应用程序接口(API),API定义了源代码和库之间的接口,所以一样的代码能够在支持这个API的任何系统中编译,然而ABI容许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。 在Unix风格的操做系统中,存在不少运行在同一硬件平台上互相相关可是不兼容的操做系统(尤为是Intel 80386兼容系统)。有一些努力尝试标准化ABI,以减小销售商将程序移植到其余系统时所需的工做。然而,直到如今尚未很成功的例子,虽然Linux标准化工做组正在为Linux作这方面的努力。函数

API,顾名思义,是编程的接口, 换句话说也就是你编写“应用程序”时候调用的函数之类的东西。对于内核来讲,它的“应用程序”有两种:一种是在它之上的,用户空间的真正的应用程序,内核 给它们提供的是系统调用这种接口,好比 read(2),write(2);另外一种就是内核模块了,它们和内核处于同一层,内核给它们提供的是导出的内核函数,好比 kmalloc(),printk()。这些接口都是你能够在编写程序的时候直接看到的,能够直接拿来用的。编码

而 ABI 是另外一种形式的接口,二进制接口。除非你直接使用汇编语言,这种接口通常是不能直接拿来用的。好比,内核系统调用用哪些寄存器或者干脆用堆栈来传递参数,返回值又是经过哪一个寄存器传递回去,内核里面定义的某个结构体的某个字段偏移是多少等等,这些都是二进制层面上的接口。这些接口是直接给编译好的二 进制用的。换句话说,若是 ABI 保持稳定的话,你在以前版本上编译好的二进制应用程序、内核模块,彻底能够无须从新编译直接在新版本上运行。另外一种比较特殊的 ABI 是像 /proc,/sys 目录下面导出的文件,它们虽然不是直接的二进制形式,但也会影响编译出来的二进制,若是它里面使用到它们的话,所以这些“接口”也是一种 ABI。spa

你平时看到的什么 POSIX 标准啊,C99 标准啊,都是对 API 的规定。而规定 ABI 的标准就很少,并且也没那么强势,Linux 上面的 ABI 标准彷佛只有 Linux Foundation 提供的一些标准操作系统

好了,从上面我 们能够看出,其实保持一个稳定的 ABI 要比保持稳定的 API 要可贵多。好比,在内核中 int register_netdevice(struct net_device *dev) 这个内核函数原型基本上是不会变的,因此保持这个 API 稳定是很简单的,但它的 ABI 就未必了,就算是这个函数定义自己没变,即 API 没变,而 struct net_device 的定义变了,里面多了或者少了某一个字段,它的 ABI 就变了,你以前编译好的二进制模块就极可能会出错了,必须从新编译才行。.net

你可能会感到意外,上游的 Linux 内核其实不光不保持稳定的 ABI,它就连稳定的 API 都不会保持!并且还牛逼哄哄地写了一个文档,叫 stable_api_nonsense.txt。这么作的道理是,内核一直在向前推动,并且速度很快,内核开发者们并不想由于 API 的限制而阻碍前进的脚步!毕竟咱们不想成为下一个 Windows!:-)htm

因此,你的驱动在不一样版本的内核上不经修改直接运行那几乎是不太可能的,就算是你容许从新编译也未必就能不经修改编译成功。即便在同一个大版本的不一样发行版上也可能不行。

那你应该怎么办?最好的办法莫过于把你的驱动贡献到社区,汇入内核源代码树中,这样一旦内核的 API 有改动,改动这个 API 的人就有义务替 你修改你的驱动的代码,你只须要 review 一下(或者这个也会有人帮你),也省去你很多时间,何乐而不为呢?另外一种办法就是基于某个提供稳定 ABI 的内核,好比红帽的 RHEL (认为这是广告的人请使用 CentOS,谢谢!),红帽的企业版内核保证有稳定的 ABI,只要你没有跨大的版本,由于咱们的源代码里会检测 ABI 的变化,为此咱们实在付出了很多努力。

相关文章
相关标签/搜索