关闭

系统调用概念

标签: 操作系统
434人阅读 评论(0) 收藏 举报
分类:

“操作系统”通常包含以下两种含义:

1、表示完整的软件包,包括用来管理计算机资源的核心层软件,以及附带的所有标准软件工具,诸如命令行解释器、图形用户界面、文件操作工具和文本编辑器等;

2、狭义上的操作系统是指管理和分配计算机资源(如CPU、RAM和设备)的核心层软件。

内核负责管理分配计算机资源,作为计算机和用户之间的沟通桥梁而存在。因此就有内核态和用户态的概念。执行硬件指令可以在两种状态间转换。与之对应,可以将虚拟内存分为内核空间和用户空间。在用户态运行时,CPU只能访问用户空间;在内核态运行时,CPU可以访问内核空间和用户空间。

系统调用是受控的内核入口,借助这一机制,进程可以请求内核以自己的名义去执行某些动作。以应用程序编程接口的形式(API),内核提供了一系列服务。这些服务包括创建新锦程、执行I/O、为进程间通信创建管道等。

需要注意:

1、系统调用将处理器从用户态切换到内核态,以便CPU访问受保护的内核空间;

2、系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识;

3、每个系统调用都提供一套参数,来规范用户空间与内核空间之间的信息传递;

从编程角度来看,系统调用很像C语言函数调用。下面是一个系统调用事件的发生顺序:

1、应用程序通过调用C语言的外壳函数(wrapper)发起系统调用;

2、对系统调用中断处理例程来说,外壳函数必须保证所有的系统调用参数可用。参数是通过堆栈传递到外壳函数的,但内核希望这些参数置入特定的寄存器。因此,外壳函数将上述参数复制到寄存器;

3、由于所有的系统调用进入内核的方式相同,内核需要设法区分每个系统调用。因此外壳函数会将系统调用编号复制到一个特殊的CPU寄存器中;

4、外壳函数执行一条中断机器指令(int 0x80),引发处理器从用户态切换到内核态,并执行系统中断0x80的中断矢量所指向的代码;

5、为响应0x80中断,内核会调用system_call()例程,来处理中断,具体如下:
(1)在内核栈中保存寄存器值;

(2)审核系统调用编号的有效性;

(3)以系统调用编号对存放所有调用服务例程的列表(内核变量sys_call_table)进行索引,发现并调用相应的系统调用服务例程。若系统调用服务例程带有参数,那么将首先检查参数的有效性。随后该服务例程会执行必要的任务,这可能会涉及对特定参数中指定地址处的值进行修改,以及在用户内存和内核内存间传递数据。最后该服务例程会将结果状态返回给system_call()例程;

(4)从内核态回复寄存器的值,并将系统调用返回值置于堆栈中;

(5)返回外壳函数,同时将处理器切换到用户态;

6、若系统调用服务例程的返回值表明调用出错,外壳函数会使用该值来设置全局变量errno。然后外壳函数会返回调用函数,并返回一个整数型值,以表明系统调用是否成功。

下图以系统调用execve()为例,展示了上述事件的发生序列:


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:108370次
    • 积分:1960
    • 等级:
    • 排名:第19933名
    • 原创:76篇
    • 转载:8篇
    • 译文:1篇
    • 评论:21条
    博客专栏