【I/O方式——程序中断】

系列文章目录

1.《带你深挖计算机底层逻辑,打通你计算机基础知识的任督二脉》
2.《深度学习计算机底层原理,深度剖析存储器》
3.《基于内存全面理解高速缓冲存储器》
4.《深度学习计算机指令系统,彻底搞懂指令十大寻址方式》
5.《降维打击,带你深度学习CPU(上)》
6.《深度学习CPU(番外篇)——虚拟内存》
7.《深度学习CPU(番外篇)——虚拟内存》
8.《操作系统——内存连续分配管理方式》
9.《操作系统——内存基本分页存储管理》



前言

        输入输出系统实现主机与I/O设备之间的数据传送,可以采用不同的控制方式,各种方式在代价、性能、解决问题的着重点等方面各不相同,常用的I/O方式有程序查询、程序中断、DMA和通道等,其中前两种要依赖于CPU当中程序指令的执行。


一、程序中断的基本概念

        程序中断是指在计算机执行程序的过程当中,出现某些继续处理的异常情况或者特殊请求,这个时候CPU会暂行现在的程序,而转去对这些异常情况或特殊请求进行处理,处理完毕后在返回到现在程序的断点处,继续执行原来的程序,早期的中断技术是为了处理数据的传输。

        但是随着计算机的发展,中断技术页不断地被赋予新的功能,主要有以下功能:

  • 实现CPU与I/O设备的并行工作。
  • 处理硬件故障和软件错误。
  • 实现人机交互、用户干预机器需要用到中断系统。
  • 实时处理多道程序、分时操作,多道程序的切换需要用到中断技术。
  • 实时处理需要借助中断系统来实现快速响应。
  • 实现应用程序和操作系统的切换,称为“软中断”。
  • 多处理器系统中各个处理器之间的信息交流和任务切换。

程序中断方式的思想:

        CPU在程序中安排好在某个时机启动某台外部设备,然后CPU继续执行当前的程序,不需要一直等待外部设备准备就绪,一旦外部设备完成数据传送的准备工作以后,就主动向CPU发出中断请求,请求CPU为自己服务。在可以响应中断的条件下,CPU暂时中止正在执行的程序,转去执行中断服务程序为外部设备服务,在中断服务程序当中完成一次主机与外部设备之间的数据传送,传送完成以后,CPU返回原来的程序。

        注意:中断服务程序就是专门用来处理发出请求的设备或者事件的一个程序。


二、程序中断的工作流程

        1.中断请求:

        中断源是请求CPU中断的设备或者事件,一台计算机允许由多个中断源,每个中断源向CPU发出中断请求的时间是随机的,CPU为了记录中断事件区分不同的中断源,中断系统需要对每个中断源设置中断请求标记触发器,当其状态为“1”时则表示有中断请求,这些触发器可以组成中断标记寄存器,该寄存器可以集成在CPU当中,也可以分散在各个中断源中。

        通过INTR线发出的时可屏蔽中断,通过NMI线发出的是不可屏蔽中断,可屏蔽中断的优先级是最低的,在关中断模式下不会被响应,那么不可屏蔽中断用于处理紧急并且特别重要的事件,如时钟中断、电源掉电等情况,他的优先级是最高的,那么优先级次高的是内部异常,即使在关中断模式下也会被响应。

        2.中断响应判优:

        中断响应优先级是指CPU响应中断请求的先后顺序,优先级越高那么CPU自然也就越先响应,由于许多中断源提出中断请求的时间是随机的,因此当多个中断源同时提出请求的时间都是随机的,因此当多个中断源同时提出请求的时候,需要通过中断判优逻辑来确定响应哪个中断源的请求,中断响应的判优通常是通过硬件排队器来实现的。

        一般情况来说优先级不可屏蔽中断>内部异常>可屏蔽中断;而在内部异常中硬件故障>软件中断;在I/O传送中断请求中高速设备>低速设备,输入设备优先于输出设备,实时设备优先于普通设备。

        注意中断优先级当中分为响应优先级和处理优先级,响应优先级在硬件设备上是固定的,不能改动,但是处理优先级可利用中断屏蔽技术动态调整,以实现多重中断,这个在文章的结尾会为大家介绍。

        3.CPU响应中断的条件

        CPU在满足一定的条件下响应中断源发出的请求,并经过一些特定的操作,转去执行中断服务程序,CPU响应中断必须满足以下三个条件。

  • 中断源有中断请求
  • CPU允许中断以及开中断(异常和不可屏蔽中断不受此限制)
  • 一条指令执行完毕以后,才可以响应中断,不能半途而废

注意:I/O设备的就绪时间是随机的,而CPU在统一的时间即每条指令执行阶段结束前向接口发出中断查询信号,以获取I/O的中断请求,也就是说,CPU响应中断的时间是在每条指令执行阶段的结束时刻,这里说的中断仅指I/O中断,内部异常不属于此类情况。

        4.中断响应过程

        CPU响应中断以后,经过某些操作转去执行中断服务程序。这些操作是由硬件直接实现的,我们将它称为中断隐指令,中断隐指令并不是指令系统中的一条真正的指令,只是一种虚拟的说法,本质上是硬件的一系列自动操作,他所完成的操作如下:

  • 关中断:CPU响应中断以后,首先要保护程序的断点和现场信息,在保护断点和现场的过程中,CPU不能响应更高级的中断请求,否则,若断点信息或现场保存不完整,在中断服务程序结束以后就不能正确地恢复并继续执行现行的程序。
  • 保存断点:为保证在中断服务程序执行完成以后能正确地返回到原来的程序,必须将原程序的断点(指令无法直接读取的PC和PSW中的信息),保存在栈或者寄存器当中。
  • 引出中断服务程序:识别中断源,将对应的服务程序入口地址送入程序计数器PC中,

注意:

        异常和中断的差异,异常指令通常并没有执行成功。异常处理后需要重新执行,所以异常的断点是当前指令的地址,而中断时在一个指令已经执行完成以后才产生中断,所以中断的断点时下一条指令的地址。

        还有上文当中涉及到一些计算机最底层的原理,PC(程序计数器)和PSW(状态寄存器),这些内容其实我已经在我之前的文章当中讲过了,今天就不再这里做过多的赘述了,如果由对于计算机底层感兴趣的小伙伴可以浏览我之前的文章降维打击,带你深度学习CPU(上)

附上原文链接:http://t.csdn.cn/tlcWL

        5.中断向量: 

        识别中断源的方法有两种,硬件向量法和软件查询法,今天主要为大家讲解硬件向量法,每个中断都有一个唯一的类型号,每个中断类类型号都对应一个中断服务程序,每个中断服务程序都有一个入口地址也就是中断向量,CPU必须找到这个入口地址,才能执行中断服务程序,将系统中全部的中断向量几种放到内存中的某个区域来进行存放,这个存放中断向量的存储区域就叫做中断向量表。

        CPU响应中断以后,通过识别中断源获得中断类型号。然后再根据中断类型号计算出中断向量的地址,再根据中断向量的地址从中断向量表中找到中断向量(服务程序的入口地址),并且将其送入PC中。转而执行中断服务程序,这种方法被称为中断向量法,采用中断向量法的中断被称为向量中断。

        6.中断处理过程:

        不同计算机的中断处理过程各具特色,就其多数而论,中断处理过程如下:

  • 关中断
  • 保存断点
  • 中断服务程序
  • 保存现场和屏蔽字

进入中断服务程序以后首先要保存现场和中断屏蔽字,现场信息是指用户可见的工作寄存器的内容,他存放着程序执行到断点的现行值。

  • 开中断:允许更多中断请求得到响应,实现中断嵌套
  • 执行中断服务程序:这也是中断请求的目的
  • 关中断:保证在恢复现场和屏蔽字的时候不被中断
  • 恢复现场和屏蔽字:将现场和屏蔽字恢复到以前的状态
  • 开中断、中断返回:中断服务程序的最后一条指令通常是一条中断返回指令,将其返回到原程序的断点处,以便执行原程序。

注意:恢复现场是指在中断返回前,必须寄存器当中的内容恢复到中断处理前的状态,这部分工作又中断服务程序完成。中断返回由中断服务程序的最后一条指令返回指令完成。


三、多重中断和中断屏蔽技术

        若CPU在执行中断服务程序的过程中,又出现了新的更高优先级中断请求,而CPU对新的中断请求不予响应,则这种中断称为单重中断,若CPU暂停现行的中断服务程序转去处理新的中断请求,则这种中断称为中断嵌套,CPU想要完成多重的中断必须要满足下列条件。

  • 在中断服务程序中提前设置开中断指令
  • 优先级别更高的中断源有权利中断优先级别较低的中断源

        中断处理优先级是指多重中断的实际优先级处理次序,可以利用中断屏蔽技术动态调整,从而可以灵活地调整中断服务程序的优先级,使得中断处理更加灵活,如果不适用中断屏蔽技术,则处理优先级和响应优先级相同。

        现代计算机一般使用中断屏蔽技术,每个中断源都有一个屏蔽触发器,“1”表示屏蔽掉该中断请求,而“0”则表示可以正常申请,所有的屏蔽触发器组合在一起,便构成一个屏蔽字寄存器,屏蔽字寄存器的内容称为屏蔽字。


总结

        今天为大家系统地讲解了操作系统当中程序中断的内容,在这篇文章当中硬件部分要牢记每个中断源的两个重要的硬件部分中断请求标记触发器,由中断请求标记触发器组成标记寄存器,还有屏蔽触发器,有屏蔽触发器组成的屏蔽字寄存器,屏蔽字寄存器里面的内容称为屏蔽字。

        还有中断嵌套的过程要深度理解,只有现场和断点的保存过程和恢复过程是关中断的状态,其余情况都是开中断的,为了中断嵌套。

        还有一定要理解中断向量的概念,他其实就是中断服务程序的入口地址,每一个中断都有一个唯一的类型号,而每一个类型号都对应一个终端服务程序,每个中断服务程序都有一个入口地址,CPU必须找到入口地址,也就是中断向量,但是这里要知道,中断向量虽然是入口地址但是想要找到这个入口地址要靠中断向量的地址,也就是服务程序地址的地址。

        到这里想必大家应该明白程序中断的概念了,通过整理这篇文章我的收获也非常大,每次写博客感觉都是一次蜕变,曾经那些晦涩难懂的知识点,突然变得好亲切,也许这就是分享的魅力吧。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清灵白羽 漾情天殇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值