专栏首页人人都是极客Linux中形形色色的接口API和ABI

Linux中形形色色的接口API和ABI

前言

如果将内核比作一座工厂,那么Linux中众多的接口就是通往这个巨大工厂的高速公路。这条路要足够坚固,禁得起各种破坏(Robust)。要能跑得了运货的卡车,还要能升降飞机。(Compatible)。当然了这条路要越宽越好(Performant)。如下图所标,Linux中有四种类型的接口。位于内核和用户之间的API(应用程序接口)和ABI(应用二进制接口)。内核内部的API和ABI。下面我们逐条的来看看这些接口。

1.Linux API

内核-用户接口有内核系统调用和GNU C Library (glibc)的包装例程(wrap subroutines)构成。Linux API开发的目标是给POSIX标准提供一个相对兼容的,程序健壮性强的,高性能的实现,同时又实现一些Linux特有的标准。

1.1 Linux内核的系统调用接口

系统调用接口包含了内核中所有已经实现的和可使用的系统调用。

1.2 C标准库

标准库是对系统调用的封装,用于给用户提供一个简单易用的用户态接口。其中最为熟知的就是GNU C Library(glibc),还有为嵌入式和移动设备使用的uClibc。

1.3 对POSIX的补充

还有一些接口是Linux特有的,比如:

Cgroup子系统,该子系统包含cgroup系统调用和libcgroup。

Futex,epoll,dnotify,inotify,Fanotify等系统调用。

2. Linux ABI

ABI是一系列约定的集合,例如GNU/Linux,FreeBSD约定函数调用的头六个整型参数放在寄存器RDI, RSI, RDX, RCX, R8和R9上;同时XMM0到XMM7用来放置浮点变元。对于系统调用,R10用来替代RCX。其他额外的参数推入栈,返回值保存在RAX中。[1] 可以说调用惯例(calling convention)就是ABI。因此,ABI是和具体CPU架构和OS相关的。

具体而言,ABI包含以下内容:[3]

1. 一个特定的处理器指令集

2. 函数调用惯例

3. 系统调用方式

4. 可执行文件的格式(ELF,PE)

那么,究竟我们为什么要纠结于ABI这个概念呢?答案是为了兼容,只要OS遵守相同的ABI规范,那么不同的应用就可以实现向前兼容,再也不用担心版本升级后,旧版本的应用不能运行了。

3. In-kernel API

内核API主要是内核中标记为 “EXPORT_SYMBOL”的函数。这些函数主要是为了内核模块的编写而提供的。收到内核版本迭代的影响,内核API并不稳定。2.x版本内核的模块可能在3.x版本上就无法使用。

4. In-Kernel ABI

内核的abi和linux abi的定义类似,再次不再赘述。

5. Abstraction ABI

在某些情况下,内核过于底层,开发者需要更高一层的抽象。于是出现了类似Mesa 3D的为图形驱动开发而生的API。

参考

[1]

https://en.wikipedia.org/wiki/Linux_kernel_interfaces

所有图的来源

[2]

https://abi-laboratory.pro/index.php?view=abi-view

[3] https://en.wikipedia.org/wiki/Application_binary_interface

abi的wiki

[4] https://zh.wikipedia.org/wiki/X86%E8%B0%83%E7%94%A8%E7%BA%A6%E5%AE%9A

x86调用惯例的中文wiki

[5]

http://laoar.net/blogs/316/

讨论什么是ABI

[6] https://elixir.bootlin.com/linux/latest/source/kernel/sched/wait.c

内核API

[7]

https://stackoverflow.com/questions/2171177/what-is-an-application-binary-interface-abi

讨论什么是ABI

本文分享自微信公众号 - 人人都是极客(rrgeek),作者:黄东升

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 无人驾驶技术课——感知(2)

    在感知部分的课程中,我们将首先介绍计算机视觉的基本应用领域;再进一步了解机器学习、神经网络和卷积神经网络的基础知识;随后我们将讨论感知模块在无人车中的具体任务;...

    刘盼
  • 4分钟理解Linux为什么不是一个硬实时的操作系统

    下面的一段小视频用最短时间解释了Linux为什么不能硬实时,哪几类区间里面不能抢占:

    刘盼
  • 动手定制一个开发板案例

    前面通过学习总线、设备、驱动模型知识后,知道了设备和驱动之间都是通过总线进行绑定而匹配的;然后通过设备树的深入探究,知道了设备树的出现大大增加了驱动的通用性;接...

    刘盼
  • 黄东升: Linux中形形色色的接口API和ABI

    如果将内核比作一座工厂,那么Linux中众多的接口就是通往这个巨大工厂的高速公路。这条路要足够坚固,禁得起各种破坏(Robust)。要能跑得了运货的卡车,还要能...

    Linux阅码场
  • finecms如何调用自定义内容

      我们建站的时间经常会有一些固定的元素,比如电话、地址等,这种相对比较简单的东西可以让编辑人员直接在后台就可以定义,那么finecms有没有这个功能呢?怎么定...

    ytkah
  • 主流深度学习框架对比:必定有一款适合你!

    现在机器学习逐渐成为行业热门,经过二十几年的发展,机器学习目前也有了十分广泛的应用,如:数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、D...

    GPUS Lady
  • 提高GPU训练利用率的Tricks

    首先,如果你现在已经很熟悉tf.data+estimator了,可以把文章x掉了╮( ̄▽ ̄””)╭

    石晓文
  • 基于RLLAB的强化学习 REINFORCE 算法解析

    用户1107453
  • 评测 | 谷歌 TPU 二代来了,英伟达 Tesla V100 尚能战否?

    AI 研习社按:谷歌去年年中推出的 TPUv1 一度让英伟达感受到威胁将近,而现在的谷歌 TPU 二代 TPUv2 则着着实实得将这份威胁变成了现实,去年的评测...

    AI研习社
  • SHERlocked93 的 2018 年终总结

    年底了,开始变得浮躁,看书看不下去了,代码也不太想写,刚好简短回顾一下 2018 年的得失收获。

    SHERlocked93

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动