种豆资源网

当前位置:首页 > 经验 / 正文

硬中断

(2021-04-02 15:50:24) 经验
硬中断

硬中断

中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过汇流排把电信号传送给中断控制器。硬中断是由硬体产生的,比如,像磁碟,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQ,CPU可以将相应的请求分发到对应的硬体驱动上。

基本介绍

  • 中文名:硬中断
  • 外文名:hardware interrupt Request
  • 学科:计算机组成原理
  • 产生:由硬体产生的
  • 来源:磁碟,网卡,键盘,时钟
  • 特点:直接中断CPU

简介

在计算机系统中,CPU在正常运行程式时,由于程式的预先安排或内外事件,引起CPU中断正在运行的程式,而转到为预先安排的事件或内外事件服务的程式中去,这就是常称的中断。当由于执行某些指令引起的中断,如DIV指令,除数为0时产生的中断为软中断;CPU本身也有两条中断请求线:非禁止中断,和可禁止中断线。当这两条线上收到中断请求信号而引起的中断,则产生了硬中断。硬中断是一个异步信号,或需要改变在执行一个同步事件。硬中断是一种在轮询循环,等待外部事件方面避免浪费处理器的宝贵时间的方式。作为一个独立的有控制线系统,它们可以在硬体中实现或被集成到存储器子系统。硬中断就是通常意义上的“中断处理程式”,它是直接处理由硬体发过来的中断信号的。当硬中断收到它应当处理的中断信号以后,就回去自己驱动的设备上去看看设备的状态暂存器以了解发生了什幺事情,并进行相应的操作。
Linux下硬中断是可以嵌套的,但是没有优先权的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。

硬中断与软中断的区别

软中断是一组静态定义的下半部分接口,可以在所有的处理器上同时执行,即使两个类型相同也可以。但是一个软中断不会抢占另外的一个软中断,可以抢占软中断的硬中断。
为了满足实时系统的要求,中断处理应该越快越好。编写驱动程式的时候,一个中断产生之后,核心在中断处理函式中可能需要完成很多工作。但是中断处理函式的处理是关闭了中断的。也就是说在回响中断时,系统不能再次回响外部的其它中断。这样的后果会造成有可能丢失外部中断。于是,Linux核心设计出了一种架构,中断函式需要处理的任务分为两部分,一部分在中断处理函式中执行,这时系统关闭中断。另外一部分在软体中断中执行,这个时候开启中断,系统可以回响外部中断。软中断是执行中断指令产生的,而硬中断是由外设引发的。硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。硬中断是可禁止的,软中断不可禁止。硬中断处理程式要确保它能快速地完成任务,这样程式执行时才不会等待较长时间,称为上半部。软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。

类别

硬中断可以分为以下几种:
可禁止中断(maskable interrupt)。硬体中断的一类,可通过在中断禁止暂存器中设定位掩码来关闭。
非可禁止中断(non-maskable interrupt,NMI)。硬体中断的一类,无法通过在中断禁止暂存器中设定位掩码来关闭。典型例子是时钟中断(一个硬体时钟以恆定频率—如50Hz—发出的中断)。
处理器间中断(interprocessor interrupt)。一种特殊的硬体中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。
伪中断(spurious interrupt)。一类不希望被产生的硬体中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。

中断处理过程


在微机系统中,对于外部中断,中断请求信号是由外部设备产生,并施加到CPU的NMI或INTR引脚上,CPU通过不断地检测NMI和INTR引脚信号来识 别是否有中断请求发生。对于内部中断,中断请求方式不需要外部施加信号激发,而是通过内部中断控制逻辑去调用。无论是外部中断还是内部中断,中断处理过程 都要经历以下步骤:请求中断→回响中断→关闭中断→保留断点→中断源识别→保护现场→中断服务子程式→恢复现场→中断返回。

请求中断

当某一中断源需要CPU为其进行中断服务时,就输出中断请求信号,使中断控制系统的中断请求触发器置位,向CPU请求中断。系统要求中断请求信号一直保持到CPU对其进行中断回响为止。

中断回响

CPU对系统内部中断源提出的中断请求必须回响,而且自动取得中断服务子程式的入口地址,执行中断 服务子程式。对于外部中断,CPU在执行当前指令的最后一个时钟周期去查询INTR引脚,若查询到中断请求信号有效,同时在系统开中断(即IF=1)的情 况下,CPU向发出中断请求的外设回送一个低电平有效的中断应答信号,作为对中断请求INTR的应答,系统自动进入中断回响周期。

关闭中断

CPU回响中断后,输出中断回响信号,自动将状态标誌暂存器FR或EFR的内容压入堆叠保护起来,然后将FR或EFR中的中断标誌位IF与陷阱标誌位TF清零,从而自动关闭外部硬体中断。因为CPU刚进入中断时要保护现场,主要涉及堆叠操作,此时不能再回响中断,否则将造成系统混乱。

保护断点

保护断点就是将CS和IP/EIP的当前内容压入堆叠保存,以便中断处理完毕后能返回被中断的原程式继续执行,这一过程也是由CPU自动完成。

中断源识别

当系统中有多个中断源时,一旦有中断请求,CPU必须确定是哪一个中断源提出的中断请求,并由中断控制器给出中断服务子程式的入口地址,装入CS与IP/EIP两个暂存器。CPU转入相应的中断服务子程式开始执行。

保护现场

主程式和中断服务子程式都要使用CPU内部暂存器等资源,为使中断处理程式不破坏主程式中暂存器的内容,应先将断点处各暂存器的内容压入堆叠保护起来,再进入的中断处理。现场保护是由用户使用PUSH指令来实现的。

中断服务

中断服务是执行中断的主体部分,不同的中断请求,有各自不同的中断服务内容,需要根据中断源所要完成的功能,事先编写相应的中断服务子程式存入记忆体,等待中断请求回响后调用执行。

恢复现场

当中断处理完毕后,用户通过POP指令将保存在堆叠中的各个暂存器的内容弹出,即恢复主程式断点处暂存器的原值。

中断返回

在中断服务子程式的最后要安排一条中断返回指令IRET,执行该指令,系统自动将堆叠内保存的 IP/EIP和CS值弹出,从而恢复主程式断点处的地址值,同时还自动恢复标誌暂存器FR或EFR的内容,使CPU转到被中断的程式中继续执行。

记忆体管理

处理硬体中断的驱动程式对所有分配的记忆体有严格的要求。所有在中断期间要访问的代码和数据都必须是固定的、页码锁定的和不可废弃的。这包括中断处理函式本身的代码以及在中断处理过程中要用到的驱动程式代码段、任何动态分配的缓冲区和应用程式分配的要传递给驱动程式的缓冲区。
记忆体要求必须是固定的。因为记忆体管理器把中断处理函式要用到的数据段移动了,在一些位元组被拷贝后,硬体中断髮生,这时硬体中断处理函式被执行。硬体中断处理函式会更新正在移动的数据段中的一些内容,当处理函式结束运行之后,记忆体管理器接着移动数据段,而这时的数据段已经被处理函式更改过了。记忆体管理器并不知道处理函式已经改变了数据。而使用该数据段的应用程式就得不到希望得到的数据。
同时记忆体又要求必须是页面锁定的。假设硬体中断髮生了,而记忆体管理器是在可废弃的代码中,那幺就会发生段不在记忆体中的警告,在此种情况下就有可能发生重入 DOS 的情况,而 DOS 代码是不可重入的,所以代码段是不可废弃的。
搜索
热门图片
最近更新
随机推荐

Powered By 种豆资源网||