当前课程知识点:Linux 内核分析与应用 > 第6章 系统调用 > 6.1 Linux中的各种API > Video
大家好 今天我们来讲第六章——系统调用
那么第一讲呢 我们先介绍一下Linux中的各种接口
那么这张图呢给出了Linux中各种接口
如果把内核比作一个工厂的话 那么Linux中
众多的接口就是通往这个工厂的高速公路
这条路要足够坚固 经得起各种破坏
要能跑得了卡车又能升降飞机
当然了 这条路要越宽越好 如图所示
Linux中有四种类型的接口 应用编程接口API和应用二进制接口ABI
内核内部的API和ABI 下面我们逐一的来看看这些接口
首先我们介绍一个标准叫LSB
为什么要介绍这个标准呢 图中在ABI提到LSB
那么是什么LSB 目前Linux 的发行版非常繁多
为了促进Linux 不同发行版间的兼容性 LSB开发了一系列标准
使各种软件可以很好地在兼容LSB 标准的系统上运行
从而可以帮助软件供应商更好的在Linux 系统上开发产品
或将已有的产品移植到Linux系统上
LSB 是Linux 标准化领域中事实上的标准
它的图标非常形象地阐述了自己的使命
对代表自由的企鹅制定标准
给定企鹅的体形和三维标准之后 软件开发者就可以设计并裁减出
各色花样的衣服 也就是应用程序
这样不管穿在哪只企鹅身上 都会非常的合适
首先我们看下Linux的API
那么Linux API是Linux内核与用户空间的API
也就是让用户空间的程序呢
能够通过这个接口访问系统资源和内核提供的服务
Linux API由两部分组成 第一部分呢是Linux内核的系统调用接口
第二呢是GNU C库
那么第二部分我们介绍Linux内核的系统调用接口
系统调用接口是内核中所有已实现和可用系统调用的集合 这是本章重点要介绍的
那么第三部分就是C的标准库
GNU C库是Linux内核系统调用接口的封装
下面进一步介绍
那么Linux内核系统调用接口和glibc库合在一起就构成了Linux API
下面我们对GNU C库做一个简要概述
从这张图我们可以看出 GNU C库是Linux内核系统调用接口的封装
它其中包括POSIX兼容应用函数调用和Linux 专用应用的函数调用
目前最新Linux内核5.0系统调用大约有380个系统调用
而GNU C库大约有2000个左右的函数
下面我们来看下Linux API和POSIX API
这张图我们看起来比较复杂 我们从最底下往上来介绍
最下面是研发人员所占的比重
这个图我们可以看出 Linux内核占比最高95% 其他占比就很少了
第二层是C库和OS的内核
那么不同的内核都有遵循POSIX的接口
但是就像Linux内核中cgroups udev这些就不属于POSIX的功能
这其中呢就包括cgroups udev等等
我们还看到 POSIX-API和Linux kernel-API
连接着Linux Kernel 并向上提供服务
并且就glibc而言 glibc把Linux系统调用
封装进相应API中提供给上层的
那么第三层呢是用户栈的底层
在这曾呢我们看到像systemd IPC QT都不是直接的应用程序
它们依靠胶水函数把上一层提供的API呢
整合成平台工具供用户来使用
那么最上层呢就是用户栈的高层
到这层呢也就到了应用软件层了
这一层可以直接调用Linux内核的API和POSIX API完成
也可以依托用户栈底层的这些平台工具来构建
在这里呢我们对POSIX做一个简单的介绍
POSIX表示可移植操作系统接口 缩写呢是POSIX
POSIX标准定义了操作系统应该为应用程序提供的接口标准
是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称
其正式称呼为IEEE 1003
那么最后我们来看一下Linux的ABI
ABI是什么呢 它是一系列约定的集合
可以说调用惯例就是ABI
因此呢ABI是和具体CPU架构和OS相关的
具体而言 ABI包含以下内容
第一一个特定的处理器指令集
第二函数调用惯例 第三系统调用方式
第四可执行文件的格式 比如说ELF PE等
那么 我们为什么要纠结于ABI这个概念呢 答案是为了兼容
只要OS遵守相同的ABI规范 那么不同的应用就可以实现向前兼容
再也不用担心版本升级后 旧版本的应用不能运行了
下面我们来看一下什么是内核的API
内核API主要是内核中标记为“EXPORT_SYMBOL”的函数
那么这组函数呢主要是为了内核模块的编写而提供的
这些函数呢它受到内核版本迭代的影响
比如说内核3.0版本的API
那么到了4.0上呢就可能无法使用
所以在驱动程序的编写中呢
我们就要根据不同的内核版本对API进行移植
那么再介绍下什么是抽象API 那么这张图看起来比较丰富
我们来介绍一下 在某些情况下内核的设计过于底层
开发者需要更高一层的抽象
于是出现了类似Mesa 3D的为图形驱动开发而生的API
那么关于Linux的各种接口在这里我们做了简单介绍
这方面的资料是非常丰富的 也需要大家课后深入的阅读
在这里我们看到的这些图主要来自于维基百科
关于系统调用的内容我们可以参考《深入理解Linux内核》第三版的第十章
最后呢我们着思考离开
前面我们给了API和ABI
那么大家思考一个问题
保持一个稳定的ABI和保持一个稳定的API相比呢谁更困难 为什么
这章就讲到这里了 谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video