系统调用和库函数及API的区别
系统调用
底层调用。
是操作系统为用户态运行的进程和硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口,即就是设置在应用程序和硬件设备之间的一个接口层。可以说是操作系统留给用户程序的一个接口。
整个linux系统
用户进程->系统调用接口->linux内核子系统->硬件。
linux内核包括了系统调用接口和内核子系统两部分。
从下到上:
物理硬件->OS内核->OS服务->应用程序。
这里的OS向下管理物理硬件,向上为操作系统服务和应用程序提供接口,这里的接口就是系统调用了。
文件
总是存储在介质上的,不管是读还是写,都是对硬件存储器的操做,必然引起系统调用。使用
库函数
可以大大减少系统调用的次数系统调用是一种
中断服务机制
,需要提出申请占用CPU或某些资源来对硬件访问与操做,如I/O操作,文件的读取更新等用户空间和内核空间,对文件操作利用
缓存区
库函数
常用到的函数编完放到一个文件里,供别人用
一般分为两类:一种是
C语言标准规定的库函数
,一类是编译器特定的库函数
。libc就是一个C标准库,里面函数都被标准化了。库函数调用是系统无关的,因此
移植性好。
主要由两方面提供:
操作系统提供的
;由第三方提供的。
系统提供
这些函数把系统调用进行封装或者组合,可以实现更多的功能对于第三方库
直接利用系统调用的可能性要小一些,系统提供的API接口
来是实现(API接口是开放的)。
系统调用和库函数之间的联系与区别
库函数,它把部分系统调用包装起来。
系统调用
是为了方便使用操作系统的接口
,而库函数
则是为了人们编程的方便。
库函数调用
的优点- 双缓冲技术;
- 移植性;
- 底层调用本身存在的一些缺陷;
- 让api也可以有了级别和专门的工作面向;
系统调用使用的是
INT,IRET
系统调用- 系统调用时,堆栈切换(保证系统安全)和特权级转换
函数调用使用的是
CALL,RET
常规调用- 没有堆栈切换
系统调用开销 > 函数调用
系统调用速度 > 函数调用
API和系统调用的区别
用户级API 和 系统级API
与硬件交互 程序员
调用的是API(api函数)
然后通过与系统调用
共同完成函数的功能。API 与程序员交互,系统调用不会交互
系统调用
根据API函数,通过一个软件中断机制
向内核提交请求(trap指令类似于一个系统中断,系统也会有一个特殊的中断处理函数(interrupt handler)来处理用户的请求),以获得内核服务的接口。一个API 可能需要几个系统调用共同完成函数功能 API –> 系统调用(1~N)
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
类似于
中断处理机制
,中断在某方面使计算机变得智能!系统回调函数
必须是由系统调用
,但是这个函数可以是用户编写
什么是驱动程序,驱动程序和OS内核是什么关系?
驱动程序
是一种可以使计算机
和设备
进行相互通信的特殊程序。相当于硬件接口
,操作系统
只有通过这个接口,才能控制
硬件的工作
驱动程序和OS内核的关系
操作系统的作用是管理各类资源(软件和硬件),并将硬件驱动程序的接口抽象,形成一套简单一直的接口给上层的应用程序应用。
驱动程序是嵌入到操作系统里面去的,所以操作系统是包括驱动程序的。
标准 C 库的函数调用
程序通常通过 高级 API 接口, 而不是通过系统调用直接访问
一个函数调用的实现 如(read函数的实现)
- 一个软中断,会通过
alltraps()
(汇编函数)得到中断的相关信息储存到数据结构 tf 数据结构 - 然后在
trap()
函数中 得到系统调用的 中断向量tf->trapno == T_SYSCALL
- 因为是
T_SYSCALL
随意转到 系统调用syscall()
更具eaxSYS_read
得到对应的函数的实现。 - 进入
sys_read
通过tf->sp
得到对应的函数参数 - 进入
sysfile_read
实现文件读取功能,操作驱动程序
- 利用
trapret()
里面有一个IRET
返回到用户态
- 一个软中断,会通过