系统调用的意义
- 为用户空间提供了一种硬件的抽象接口,可移植性
- 系统调用保证了系统的稳定和安全,作为硬件设备和应用程序之间的中间人,保护系统安全
- 操作系统的虚拟化和抽象的需要,方便开发,只需要和API打交道
Linux中,系统调用是用户空间访问内核的唯一手段:除异常和陷入外,它们是内核唯一的合法入口
系统调用图.png1. 系统调用
步骤
- 通知内核调用一个哪个系统调用
- 用户程序把系统调用的参数传递给内核
- 用户程序获取内核返回的系统调用返回值
系统调用号
每个系统调用有一个系统调用号,指明到底执行哪个系统调用,分配后不能有任何变更,删除后也不能回收利用调用号。
有一个错误号专门针对无效的系统调用
系统调用处理程序
用户程序通过引发一个异常来促使系统切换到内核态去执行异常处理程序,此时的异常处理程序实际上就是系统调用处理程序
- 需要将系统调用号传递给内核(通过寄存器)
- 传递参数也通过一组寄存器
2. 系统调用的实现
实现要力求简洁,稳定,仔细检查合法输入,和异常处理,系统调用是可重入的
3. 系统调用上下文
内核在执行系统调用的时候处于进程上下文,系统调用返回的时候,控制器仍在system_call()中,负责切换到用户控件,并让用户进程继续执行下去。
系统调用的两种方法
- C库函数
- Linux本身提供了一组宏,用于直接对系统调用进行访问
虽然可以建立新的系统调用,而且系统调用性能也不错,但是通常都会有更好的办法来代替新建一个系统调用的实现
因为改系统总是很麻烦的,还是尽量避免啦
网友评论