系统调用和函数调用的区别
系统调用
操作系统服务的编程接口
通常由高级语言编写(C或C++)
程序访问通常通过高层次 的API接口(C标准库的库函数)而不是直接进行系统调用
每个系统调用对应一个系统调用编号
系统调用百科
https://baike.so.com/doc/5715175-5927901.html
系统调用
所谓系统调用就是用户在程序中调用操作系统所提供的一些子功能,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如存储分配、进行I/0传输以及管理文件等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。通常,一个操作系统提供的系统调用命令有几十乃至上百条之多。
这些系统调用按功能大致可分为如下几类:
设备管理。完成设备的请求或释放,以及设备启动等功能。
文件管理。完成文件的读、写、创建及删除等功能。
进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
进程通信。完成进程之间的消息传递或信号传递等功能。
内存管理。完成内存的分配、回收以及获取作业占用内存区大小及始址等功能。
显然,系统调用运行在系统的核心态。通过系统调用的方式来使用系统功能,可以保证系统的稳定性和安全性,防止用户随意更改或访问系统的数据或命令。系统调用命令是由操作系统提供的一个或多个子程序模块实现的。
这样,操作系统的运行环境可以理解为:用户通过操作系统运行上层程序(如系统提供的命令解释程序或用户自编程序),而这个上层程序的运行依赖于操作系统的底层管理程序提供服务支持,当需要管理程序服务时,系统则通过硬件中断机制进入核心态,运行管理程序;也可能是程序运行出现异常情况,被动地需要管理程序的服务,这时就通过异常处理来进入核心态。当管理程序运行结束时,用户程序需要继续运行,则通过相应的保存的程序现场退出中断处理程序或异常处理程序,返回断点处继续执行。
在操作系统这一层面上,我们关心的是系统核心态和用户态的软件实现和切换,对于硬件层面的具体理解,可以结合“计算机组成原理”课程中有关中断的内容进行学习。
下面列举一些由用户态转向核心态的例子:
用户程序要求操作系统的服务,即系统调用。
发生一次中断。
用户程序中产生了一个错误状态。
用户程序中企图执行一条特权指令。
从核心态转向用户态由一条指令实现,这条指令也是特权命令。一般是中断返回指令。
注意:由用户态进入核心态,不仅仅是状态需要切换。而且,所使用的堆栈也可能需要由用户堆栈切换为系统堆栈,但这个系统堆栈也是属于该进程的。
Linux系统调用指南
https:///m0_37329910/article/details/86427285