操作系统接口之系统调用

系统调用是用户程序与操作系统交互的重要手段,涉及进程控制、文件操作、设备管理和通信等多个方面。调用时,系统由用户态转为系统态,通过软中断机制执行相应的系统服务子程序。参数传递可通过指令自带、通用寄存器或内存堆栈。在Windows中,Win32API作为系统调用的接口,提供了丰富的服务。系统调用使得用户程序能够安全地请求操作系统服务,而不会破坏系统稳定性。
摘要由CSDN通过智能技术生成

系统调用简介

系统调用,是用户在程序中调用操作系统所提供的一些子功能
这是特殊的过程调用,由特殊的机器指令实现
这个指令还将系统转入管态
系统调用程序是一个低级过程,只能由汇编语言直接访问
系统调用是操作系统提供给编程人员的唯一接口
利用系统调用,动态请求和释放系统资源
完成与硬件相关的工作以及控制程序的执行等
每个操作系统都提供几百种系统调用,包括:外存文件与目录的读写,各种I/O设备的使用,在程序中启动另一个程序,查询和统计系统资源使用情况等等
实际上系统调用语句本身是硬件提供的(机器指令),但其所调用的功能是操作系统提供的
每种机器的机器指令集中都有一条系统调用指令(访管指令)

系统调用的例子-1

汇编程序例子:打印5个字符
方法1:调用DOS功能
MOVE A, PARA1
MOVE B, PARA2
INT 21H

系统调用的例子-2

方法2:用OUT语句直接打印
L1:MOVE A,I
IN ADDR1,B
OR B,BS
JNC L1
OUT ADDR2,A
RET
I/O设备的硬件接口,一般由四种寄存器(地址,数据,状态,控制)或其子集组成,任一程序中若要使用I/O设备来输出数据或接受输入,必须通过对这四种寄存器读写的I/O机器指令进行

系统调用的例子-3

汇编程序例子2:读写硬盘文件内容
MOVE DX,OFFSETBUFF
MOVE CX,BYTE
MOVE BX,HANDLE
MOVE AH,3FH
INT 21H

系统调用的例子-4

磁盘读写的例子:更复杂
原因:
A、磁盘的控制和状态接口寄存器比打印机的复杂的多,而且还有地址接口寄存器
B、通常一个外存存储介质上可以存放多个文件,随着文件的建立、删除和拷贝在不停地变化,每个文件的长度随着其内容的变化而不停地变化

系统调用的例子-5

高级语言例子:打印5个字符
char buff[4]=“abcde”;
for(i=4;i>=0;i–)
print(buff[i]);
高级语言例子:
读硬盘文件f1的第10到20个字节
seek(fd,10,0);
read(fd,buff,11);
在这里插入图片描述
在这里插入图片描述

凡是与硬件相关、与应用无关的工作,都通过操作系统程序来完成
在这里插入图片描述

系统调用与一般过程调用的区别

系统调用方式(INT)与程序中一般的调用方式的相同点:
在这里插入图片描述

运行在不同的系统状态
一般过程调用,其调用程序和被调用程序都运行在相同状态:核心态或用户态
系统调用:调用程序在用户态,被调用程序在系统态
状态的转换
一般的过程调用不涉及系统状态的转换,可直接由调用过程转向被调用过程
运行系统调用时,调用和被调用过程在不同系统状态,不允许由调用过程直接转向被调用过程
通过软中断机制先由用户态转换为核心态
在OS核心分析后,转向相应的系统调用处理子程序
返回问题
一般过程调用在被调用过程执行完后,回调用过程
抢占式调度的系统中,被调用过程执行完后,系统将对所有要求运行的进程进行优先级分析。如果调用进程仍有最高优先级,则返回到调用进程执行
否则,引起重新调度,让优先级最高的进程优先执行。此时,系统把调用进程放入就绪队列
嵌套调用
系统调用也允许嵌套调用,即在一被调用过程执行期间,可再利用系统调用命令调用另一系统调用
一般每个系统对嵌套调用的深度有限制
同一程序中不包含被调用代码
转向的地址是活的:地址不写在程序中,不同的调用地址不同
返回地址是活的:不同的调用返回的地址不同
是安全接口:可随意进入被调用方
系统调用是动态调用,程序中不包含被调用代码,好处:
(1)用户程序长度缩短
(2)当OS升级时,调用方不必改变
系统调用方式的调用地址和返回地址都是不固定的,系统调用指令中不包含调用地址,只包含功能号,是按功能号(在可执行目标程序中)调用的。在操作系统内部,由系统调用处理程序通过系统调用分支表(OS的一个数据结构)将功能号转换为相应的指令地址
在这里插入图片描述

系统调用返回指令中不包括返回地址,通过栈保存和弹出返回地址
系统调用返回地址不固定,因为用户程序在不同的地方调用OS

安全接口

INT指令和IRET指令的执行过程中,要处理程序状态字PSW,INT指令中要保存用户程序的老PSW,并根据中断向量表设置新PSW;IRET指令中要在返回用户程序前恢复用户程序的老PSW
其目的:目态、管态的管理
系统态与用户态的转换,是由系统在INT指令与IRET指令内部自动完成的,而没有用一条单独的专门指令。这样可以有效地防止在系统态下执行用户程序
INT指令的执行过程:
→将PC与PSW入栈→根据该指令的参数将内存中断向量表的相应位置的内容读入执行操作系统内部代码
IRET指令的执行过程:
→以栈顶内容置PSW和PC→
CALL调用方式是静态调用,被调用代码与调用代码在同一程序之内
有两种可能性:
被调用代码是专门为该软件编制,即基于模块划分或仅限于本软件范围内的公用或重复使用(没有问题)
被调用代码来自公用软件(函数库)
CALL调用方式,其调用地址是固定的,包含在调用语句中;返回地址是不固定的,在程序执行过程中通过栈的实现来保存和弹出返回地址
CALL指令的内部实现过程:
→返回地址压栈(即该CALL指令所在的地址) →将该CALL指令中所含的地址(即被调用代码所在地址)送入PC
RET指令的内部实现过程:
→从栈顶弹出返回地址送入程序计数器PC
其它如jump,jnc,LOOP指令也如此
而使用INT的程序段则简单许多。程序员不再需要与接口寄存器打交道,只需一个简单的调用即可

系统调用的分类

将系统的功能分为两部分:
系统自身所需要的
作为服务提供给用户的
OS的系统调用:
进程控制类系统调用
文件操作类系统调用
进程通信类系统调用
设备管理类系统调用
信息维护类系统调用

“广义指令”和“虚处理机”

系统调用命令扩充机器指令,增强系统的功能,方便用户使用, 称为“广义指令”
“广义指令”和机器指令的不同:
机器指令是由硬件线路直接实现的
“广义指令”由OS提供的多个子程序,软件实现的
“虚处理机”:
从用户角度来看,“广义指令”,扩大了机器指令系统,增强了处理机功能
提供了一台功能更强,使用更方便的处理机,实现了处理机性能上的扩充
为了区别于真实的物理处理机,称它为“虚处理机”

系统调用的处理过程

为了保证OS不被用户程序破坏
不允许用户程序访问OS的系统程序和数据
那么,怎样得到系统服务的呢?
需要有一个类似于硬件中断处理的处理机构
当用户使用操作系统调用时,产生一条相应的指令
处理机在执行到该指令时发生相应的中断,并发出有关的信号给该处理机构
该处理机构在收到了处理机发来的信号后,启动相关的处理程序去完成该系统调用所要求的功能
在系统中为控制系统调用服务的机构称为陷入(TRAP)或异常处理机构
相对应,把由于系统调用引起处理机中断的指令称为陷入或异常指令(或称访管指令)
在操作系统中,每个系统调用都对应一个事先给定的功能号,例如0、1、2、3等
在陷入指令中必须包括对应系统调用的功能号
而且,在有些陷入指令中,还带有传给陷入处理机构和内部处理程序的有关参数
必须为实现系统调用功能的子程序编造入口地址表
每个入口地址与相应的系统程序名对应
陷入处理程序把陷入指令包含功能号与入口地址表有关项对应, 系统调用功能号驱动有关子程序执行
在系统调用处理结束之后,用户程序需利用系统调用返回结果继续执行

保护现场:

在进入系统调用处理之前,陷入处理机构还需保存处理机现场
在系统调用处理结束之后,要恢复处理机现场,现场被保护在特定的内存区或寄存器中
在这里插入图片描述

参数传递过程问题

怎样实现用户程序和系统程序间的参数传递?
常用的实现方法:
由陷入指令自带参数:陷入指令的长度有限的,且还要携带系统调用功能号,只能自带有限的参数
通过有关通用寄存器来传递参数:这些寄存器应是系统程序和用户程序都能访问,由于寄存器长度较短,从法传递较多的参数
大多在内存中开辟专用堆栈区来传递参数

Win32 应用程序接口

在Windows中,定义了一系列程序(应用程序接口Win32 API) ,提供OS服务
这个接口(部分)支持Win95 以后的Windows版本Win32 API调用的种类非常多,以千计算
在Windows中不可能分辨出哪些是系统调用(被内核执行),哪些是用户空间的库调用
事实上,一个Windows版本中的系统调用也许在另一个Windows版本中会在用户空间执行
由于图形子系统在内核中运行(在某些Windows版本中),它们也是系统调用,否则是库调用
欢迎大家加我微信交流讨论(请备注csdn上添加)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程子的小段

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值