中断和异常,系统调用

中断和异常

中断的错误

CPU上会运行两种程序,一种是操作系统内核程序,一种是应用程序

在合适的情况下,操作系统内核会把CPU的使用权主动让给应用程序(第二章进程管理相关内容)

“中断”是让操作系统内核夺回CPU使用权的唯一途径

“中断”会使CPU由用户态变为内核态,使操作系统重新夺回对CPU的控制权

  • 如果没有“中断”机制,那么一旦应用程序上CPU运行, CPU就会一直运行这个应用程序

内核态→用户态:执行一条特权指令--修改PSW的标志位为“用户态”,这个动作意味着操作系统将主动让出CPU使用权

用户态→内核态:由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺回CPU的使用权

内中断,外中断

image-20240316224327420

内中断:与当前执行的指令有关,中断信号来源于CPU内部

外中断:与当前执行的指令无关,中断信号来源于CPU外部

内中断

image-20240316224422025

尝试在用户态下执行特权指令,或者除法时发现除数为0,

若当前执行的指令是非法的,则会引发一个中断信号!

例子 3:有时候应用程序想请求操作系统内核的服务,此时会执行一条特殊的指令——陷入指令,该指令会引发一个内部中断信号

执行“陷入指令”,意味着应用程序主动地将CPU控制权还给操作系统内核。“系统调用”就是通过陷入指令完成的

外中断

与当前执行的指令无关中断信号的来自SPU外部

例子 1: 时钟中断——由时钟部件发来的中断信号

时钟部件每隔一个时间片(如50ms)会给CPU发送一个时钟中断信号

每过规定时间,状态从内核态和用户态不断切换

每一条指令结束时,CPU都会例行检查是否有外中断信号!!!

中断的分类

image-20240316225010564

内中断又称异常。例外。

外中断此时称作中断!

大多数的教材、试卷中, “中断”特指狭义的中断,即外中断。而内中断一般称为“异常”

陷阱、陷入

由陷入指令引发,是应用程序故意引发的

故障

由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让它继续执行下去。如:缺页故障。

终止

由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0、非法使用特权指令

中断机制的基本原理

不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。

image-20240316225310665

显然,中断处理程序一定是内核程序,需要运行在“内核态”

系统调用

image-20240316225450376

什么是系统调用,有何作用?

操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。

“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务

image-20240316225526192

和库函数的区别

image-20240316225601052

image-20240316225612115

不是所有库函数都要涉及系统调用,

不涉及系统调用的库函数:如的“取绝对值”的函数涉及系统调用的库函数:如“创建一个新文件”的函数

系统调用的必须性

image-20240316225716675

解决方法:由操作系统内核对共享资源进行统一的管理,并向上提供“系统调用” ,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。

什么功能需要系统调用?

image-20240316225754131

应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,

因此凡是与共享资源有关的操作(如存储分配、1/0操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。

这样可以保证系统的稳定性和安全性,防止用户进行非法操作。

系统调用的过程

会用寄存器。

应用程序先利用用户态执行指令,并且安排寄存器。

需要用到系统调用时:执行陷入指令,切换到内核态

然后执行系统调用入口程序!检查寄存器里面的参数,决定要调用怎样的系统程序。

这个过程可以递归,就是说我刚调用的系统程序可以看我在寄存器内安排的其他参数继续调用别的系统程序

最后切换会用户态,继续执行

传递系统调用参数→执行陷入指令(用户态) →执行相应的内请求核程序处理系统调用(核心态) →返回应用程序

image-20240316230315414

注意:

1.陷入指令是在用户态执行的,执行陷入指令之后立即引发一个内中断,使CPU进入核心态

2,发出系统调用请求是在用户态,而对系统调用的相应处理在核心态下进行

image-20240316230352110

posted @   晓梦ペ  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示