转载自:https://blog.csdn.net/xinghun_4/article/details/7905298

API(application programming interface):应用程序接口

ABI(application binary interface):应用程序二进制接口

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

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

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

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。

你平时看到的什么 POSIX 标准啊,C99 标准啊,都是对 API 的规定。而规定 ABI 的标准就不多,而且也没那么强势,Linux 上面的 ABI 标准似乎只有 Linux Foundation 提供的一些标准。

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

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

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

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

API、ABI究竟有什么区别?相关推荐

  1. SDK接口与API接口究竟有什么区别?

    上一篇文章为大家介绍了什么事 SDK,下面来说说 SDK 和 API 的区别. SDK 包含了使用 API 的必需资料,所以人们也常把仅使用 API 来编写 Windows 应用程序的开发方式叫做 & ...

  2. Java培训教程:”==“和 equals 方法究竟有什么区别?

    在学习java技术过程中,我们会接触到一些变量值的相关知识,本期小编为大家介绍的教程就是关于"=="和 equals 方法究竟有什么区别?来看看下面的详细介绍. Java培训教程: ...

  3. python里str什么意思_Python 3 字符串中的 STR 和 Bytes 究竟有什么区别?

    原标题:Python 3 字符串中的 STR 和 Bytes 究竟有什么区别? Python2的字符串有两种:str和Unicode,Python3的字符串也有两种:str和Bytes.Python2 ...

  4. 计算机电源MOD,电源全模组和非模组究竟有什么区别?

    电源全模组和非模组究竟有什么区别? 2020-09-08 17:51:37 14点赞 47收藏 13评论 "省啥不能省电源!",这是DIY玩家都明白的道理.电源相当于人体的心脏,决 ...

  5. 华为鸿蒙电视什么屏幕,荣耀智慧屏出世,鸿蒙真容貌!和智能电视究竟有什么区别?...

    原标题:荣耀智慧屏出世,鸿蒙真容貌!和智能电视究竟有什么区别? 8月10日下午,预热了近一个月的荣耀智慧屏终于正式发布了,作为华为荣耀的全新品类,它还是全球首款搭载华为鸿蒙操作系统的终端.正如此前荣耀 ...

  6. 一篇文章告诉你SLC、MLC、TLC和QLC究竟有啥区别?

    大家知道QLC颗粒是什么?有什么优势么? 说起来,存储单元是硬盘的核心元件,选择SSD实际上就是在选择存储颗粒.那SLC.MLC.TLC和QLC这几种存储颗粒究竟存在什么区别呢?Ci妹这就来告诉大家. ...

  7. 张赐荣 | 安装版软件和绿色版软件究竟有什么区别?

    安装版软件和绿色版软件究竟有什么区别? [作者:张赐荣] 众所周知,大部分软件都需要先安装才能使用,例如 QQ.360.迅雷等,要先从网上下载一个安装包,然后安装到电脑的 C 盘或者 D 盘等.大部分 ...

  8. H264和X264究竟有什么区别?

    先简单说一下,mkv和avi的格式只是封装容器,里面封装的是视频流+音频流.容器不会影响画面质量,影响质量的是容器里面封装的什么东西.所以你换换容器,而里面的东西不换的话,对清晰度字幕音频等是没有影响 ...

  9. 毫米波雷达与激光雷达两种类别的雷达技术究竟有什么区别?

    近年来,毫米波雷达被广泛应用在高级驾驶辅助系统(ADAS)中,再度成为了零部件供应商们的焦点战场.ADAS系统需要多种传感器配合工作,毫米波雷达由于其众多优势,成为ADAS不可或缺的核心传感器,也是自 ...

最新文章

  1. JStorm与Storm源码分析(五)--SpoutOutputCollector与代理模式
  2. 移动平台自动化测试:appium(一)
  3. postgresql 修改字段名称
  4. Java ByteBuffer –速成课程
  5. MySQL笔记——JDBC入门
  6. Mac OS下Tomcat native-APR的安装
  7. 如何使用python提高办公效率-提升Python程序运行效率的6个方法
  8. oracle12c新特点之可插拔数据库(Pluggable Database,PDB)
  9. oracle创建默认序列号,PLS-00103:为序列号oracle创建触发器(PLS-00103: Create trigger for sequence number oracle)...
  10. android webkit案例,移动互联网时代--Android上的一个例子
  11. Tuxedo中间件常用命令
  12. matlab工作区显示的是什么,matlab工作区介绍
  13. IOStream读写文件操作
  14. 全国地区对应身份证号码值关系----身份证号前6位
  15. 卸载mysql5.5.27(傻瓜式卸载)
  16. 互联网巨头的2B市场变革
  17. 10 个深恶痛绝的 Java 异常
  18. 常见的需求分析方法(产品篇)
  19. c语言用字符方式拚一个时钟,2012年3月份全国计算机等级考试二级c语言题库(机试) (1)...
  20. python实现图书管理系统(完善版)

热门文章

  1. 佳能 Canon *.CR3 檔案格式 外部資源
  2. zeppelin安装
  3. 前端打包工具UglifyJS使用入门
  4. 搭建微博Cookies池(一)
  5. Element-ui 使用el-tabs发生浏览器卡顿现象
  6. QQ在异地登录的原因及应付方法.
  7. word设置页眉页脚页码
  8. 护眼灯A级和AA级有什么区别
  9. 开启系统保护/创建系统还原点 - Win10
  10. java 数据透视表 组件_Java在Excel中创建透视表方法解析