首页 > 其他分享 >中断和异常,系统调用

中断和异常,系统调用

时间:2024-03-31 18:15:14浏览次数:25  
标签:调用 操作系统 中断 应用程序 内核 异常 CPU

中断和异常

中断的错误

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

标签:调用,操作系统,中断,应用程序,内核,异常,CPU
From: https://www.cnblogs.com/nekodream/p/18107016

相关文章

  • 蓝旭预习博客2:Java异常类、常用类、容器与泛型
    Java异常类1.什么是异常异常是导致程序中断运行的一种指令流,如果不对异常进行正确处理,则可能导致程序的中断执行,造成不必要的损失。例如下标越界异常(IndexOutOfBoundsException)空指针异常(NullPointerException) 算术异常( ArithmeticException)数字格式化异常(NumberFormatE......
  • U8二次开发CO-基于Net8调用COM对象
    以前没有碰过U8,只知道基于Net平台构建,本次业务需求是要把钉钉和U8打通,完成代办和消息提醒。网上搜索U8相关二开资料后发现,都是一些技术片段,零零碎碎的不成体系,也有可能是大客户都去U9或者Cloud了,老旧的8面临过气与替换(个人意见),遂边琢磨边做一些示例。开始介绍U8的CO二次开发模......
  • java 异常类+常用类+容器、泛型
    目录一、.异常类:1.捕获和处理异常:2.抛出: 3.自定义异常类:二、包装类、String、BigDecimal1.包装类:2.String:3.BigDecimal:三、泛型、列表、set、map:1.泛型:2.列表:3.set:4.map:一、.异常类:异常是程序运行过程中可能出现的错误情况或有别于一般情况的情况。而java......
  • 输入输出-中断-总线-可靠性
    输入输出技术计算机系统中存在多种内存与接口地址的编制方式,常见的是下面两种:内存与接口地址独立编址方法内存地址和接口地址是两个完全独立的两个地址空间。访问数据时所使用的指令也完全不同,用于接口的指令只用于接口的读/写,其余的指令全都是用于内存的。因此,在编程序或......
  • 用函数指针数组来实现对一系列函数的调用
    include<stdio.h>intadd(inta,intb);intsub(inta,intb);intmax(inta,intb);intmin(inta,intb);voidmain(){inta,b,i,k;int(*func[4])(int,int)={add,sub,max,min}//定义指针数组,并对其赋初始值printf("selectoperator(0-add,1-sub,2-max,3-min)......
  • 使用Jep在Java中调用Conda虚拟环境下的Python
    为了解决毕设中需要用到在Java中调用Python的问题,我在网上寻找对应的解决方案。似乎没有太好的解决方案:Jython至今仍是Python2,Py4J似乎也不再活跃更新。所幸我找到了Jep这一神器。正当我雀跃不已,却又发现了一些问题,在两个小时的艰难攻关之下,这些问题逐渐迎刃而解。问题一:无法找到......
  • Blazor学习记录_8.CSS隔离和代码隔离_异常处理_流式渲染
    19.CSS隔离和代码隔离19.1代码隔离使用C#partial关键字,创建一个与razor文件同名,扩展名加.CS的C#类文件,然后把razor文件中的@code中的代码迁移至cs文件中。注意命名空间、泛形参数声明、依赖注入的迁移19.2CSS隔离如同前面代码隔离文件一样,我们创建一个组件样式文......
  • 获取std::exception_ptr指向的异常信息
    1、产生std::exception_ptr的方式:std::exception_ptrptr=nullptr;//用来保存异常信息try{test();}catch(...){std::exception_ptrptr=std::current_exception();//这是exeception_ptr产生的地方}或std::exception_ptrptr2......
  • (day 24)JavaScript学习笔记(异常的处理)
    概述         这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。    今天学习异常的处理,主要是捕获异常、throw关键字主动抛异常、Error......
  • JavaImprove--Lesson07--异常处理的两种方式,collection集合
    一.Java异常处理的两种方式Java的异常机制是一种处理程序中错误的方式,它包括异常的抛出、捕获和处理。异常是在程序运行过程中发生的异常事件,如数学运算中的除0异常、数组越界、空指针异常等。在Java中,异常被视为一种对象,可以通过使用try-catch语句块来捕获和处理。当try块中的......