什么是系统调用? 有什么用作用?
我们想想怎么是系统调用呢?
系统调用
是操作系统提供给应用程序(程序员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务。
我们一起来看下图:
我们在操作系统中,可以使用控制台
输入命令,不通过应用程序可以直接和操作系统交互,这个叫做:命令接口。
而在应用程序中,我们程序员可以通过程序接口
,来调用操作系统,让操作系统帮助我们完成所需的事情。
那为什么需要系统调用呢?
之前有说到,操作系统它是管理硬件和软件的一些资源,如果不通过系统调用,那么多个程序并发执行是不是就容易出问题。
应用程序通过系统调用请求操作系统的服务,系统中的各个共享资源都由操作系统统一管理,因此在用户程序中,凡事与资源有关的操作(如存储分配、I/O操作,文件管理等),都必须通过系统调用的方式,向操作系统提出服务请求,由操作系统代为完成。 这样可以保证系统的稳定性和安全性
,防止用户进行非法操作。
那操作系统提供了哪些系统调用的功能呢? 如下图:
这里暂时先不需要详细去了解,大概了解一下就行了。
系统调用与库函数的区别
那系统调用,和我们平时在开发过程中调用的库函数有什么区别吗? 我们来看一下图就清楚了
首先我们知道,在操作系统中是和硬件打交道的,操作系统为了方便其他编程语言,把与硬件的交互都进行了封装,隐藏了很多一些细节。 库函数也是同样的道理,编程语言为了方便程序员理解、使用,把调用系统函数也进行了封装,再一次隐藏一些不必要的细节。这样对于我们这些编程人员来讲,提高了便捷性,也降低了学习成本。
系统调用背后的过程
我们再来详细看一下系统调用背后的过程是什么。
举个例子,我们调用库函数 write(abc)
写操作,首先库函数是需要编译成汇编语言指令,如下图:
如上图,一个 write
库函数,对应了很多条汇编指令,包括前期、后期想处理的命令,比较核心的是:movl指令
,这个指令的作用就是将 “abc” 作为系统调用参数放入到某个通用的寄存储器中,然后调用 int x 指令
。
int x
这里的 x 参数,是指明了系统调用号,此处的int不是 integer 的意思,而是 interrupt 的缩写。
这个 x 可以有以下值:
这里如果 x 是等于 4,那么就表示写入。
这里需要注意几个点:
1、陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,从而 CPU 进入核心态。
2、发出系统调用请求是在用户态,而对系统调用的相应处理是在核心态下进行的。
3、陷入指令是唯一一个只能在用户态执行,而不可在核心态执行的指令。