系统调用
系统调用是操作系统提供给应用程序(开发人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请求来获得操作系统的服务
程序接口由一组系统调用组成
系统调用的概念和作用
应用程序通过系统调用请求操作系统的服务。系统中各种共享资源都由操作系统统一掌管,因此用户程序想要执行与资源有关的操作(例如存储分配。I/O操作,文件管理等)都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作
如果没有系统调用存在,各个应用程序就可能会产生非法争夺共享资源的情况发生,例如多个应用同时对一个文件进行读写操作这显然是十分危险的
系统调用分类(依照功能分类)
- 设备管理:完成设备的请求/释放/启动等功能
- 文件管理:完成文件的读/写/创建/删除等功能
- 进程控制:完成进程的创建/撤销/阻塞/唤醒等功能
- 进程通信:完成进程之间的消息传递/信号传递等功能
- 内存管理:完成内存的分配/回收等功能
由于系统调用涉及到对系统资源的管理,对进程的控制,这些功能需要执行一些特权指令,所以系统调用的相关处理需要在核心态下进行
系统调用与库函数的区别
应用程序本身可以通过汇编语言直接进行系统调用,但是常见情况下更多是使用高级语言间接进行系统调用
高级编程语言向上层(应用程序)提供库函数,这些库函数中的一部分对系统调用进行了封装,隐藏了系统调用的细节,使上层进行系统调用更加方便
系统调用的背后过程
注意:
- 陷入指令是在用户态执行的,执行陷入指令后立即引发一个内中断,从而使CPU进入核心态
- 发出系统调用请求是在用户态进行的,但对系统调用的相关处理是在核心态下进行的
- 陷入指令是唯一一个只能在用户态下执行,而不能在核心态下执行的指令(因为陷入指令是让CPU从用户态进入核心态的指令)