系统调用来龙去脉

一、什么是系统调用

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。

“系统调用”是操作系统提供给应用程序使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。

系统调用按功能分类有设备管理、文件管理、进程控制、进程通信、内存管理。

二、为什么要有系统调用

为了防止用户进程争抢使用共享资源,需要操作系统来统一管理。那么用户进程则不能轻易就能使用共享资源,其必须通过系统调用来获取。

因此cpu会有两种状态,用户态和核心态。

当cpu处于用户态时,cpu只能执行非特权指令,它不能直接访问计算机的软硬件资源,仅限于访问用户的地址空间,目的是防止用户程序对系统造成破坏。

 当cpu处于核心态时,cpu可以执行除访管指令之外的所有指令,包括非特权指令和特权指令。特权指令是指不允许用户直接使用的指令。

访管指令是一条可以在用户态下执行的指令。在用户程序中,因要求操作系统提供服务而有意识地使用访管指令,从而产生一个中断事件,会将操作系统转换为核心态。

该中断是“自愿”中断,因此访管指令又称陷入指令,或者说trap指令。访管中断由访管指令产生,因此该中断称为访管中断。程序员使用访管指令向操作系统请求服务。


操作系统内核会对共享资源进行统一的管理,并向上提供“系统调用”,用户进程想要使用共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。

三、系统调用的过程

应用程序运行在用户态,其中调用了一个库函数,而库函数内部封装了系统调用的复杂细节。如下:

1.前期处理相关指令

2.传参指令,将系统调用需要的参数放到指定地点。

3.陷入指令/trap指令/访管指令

4.执行处理系统调用的内核程序,运行完返回原来的程序。

5.后续处理相关指令

要注意的是:
陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态发出系统调用请求是在用户态状态下。

而对系统调用的相应处理在核心态下进行。

也即是说上面只有第四步是在核心态状态下,其他都是用户态。
 

你可能感兴趣的:(操作系统)