系统调用
什么是系统调用?
由操作系统提供的供所有系统调用的程序接口集合;用户程序通常只在用户态下运行,当用户程序想要调用只能在内核态运行的子程序时,所以操作系统需要提供访问这些内核态运行的程序的接口,这些接口的集合就叫做系统调用,简要的说,系统调用是内核向用户进程提供服务的唯一方法。
用户程序通过系统调用从用户态(user mode)切换到核心态(kernel mode ),从而可以访问相应的资源。这样做的好处是:
- 为用户空间提供了一种硬件的抽象接口,使编程更加容易。
- 有利于系统安全。
- 有利于每个进程度运行在虚拟系统中,接口统一有利于移植
系统调用的过程
首先介绍下什么是中断处理:
中断处理是从用户态进入到内核态的主要的方式,也可能是用户态程序执行的过程中调用了一个系统调用陷入了内核态当中,这个叫做trap,系统调用只是一种特殊的中断。
系统调用机制
- 中断/异常机制
支持系统调用服务的实现:选择一条陷入指令(访管指令)即可
- 选择一条特殊指令:陷入指令(亦称访管指令)
引发中断异常完成用户态到内核态的切换
- 系统调用号和参数:
每个系统调用都实现给定一个编号(功能号)
怎样传递参数?
-
由陷入指令自带参数:陷入指令的长度有限,且还要携带系统调用功能号,只能自带有限的参数
-
通过通用寄存器传递参数:这些寄存器是操作系统和用户程序都能访问的,但寄存器的个数会限制传递参数的数量
-
在内存中开辟专用堆栈区来传递参数
- 系统调用表:
存放系统调用服务例程入口地址
完整过程:
用户调用高级语言的库函数 ->转换为汇编语言,封装好的函数做好参数传递工作,调用中断处理程序int 0x80 ->CPU通过0x80号在IDT中找到对应的服务例程并调用 ->将参数保存在内核栈,根据系统调用号索引系统调用表,找到系统调用程序入口 ->执行完程序后再返回用户态