Linux 系统中断
1、概述
1.1 中断
程序运行过程中,系统外部、系统内部或者现行程序本身若出现紧急事件(定时器、设备IO、…),处理机立即中止现行程序的运行,自动转入相应的处理程序(中断服务程序),待处理完后,再返回原来的程序运行,这整个过程称为程序中断。
中断通常被定义为一个事件,该事件能够改变处理器执行指令的顺序。
这样的事件与 CPU 芯片内外部硬件电路产生的电信号相对应,使CPU和硬件设备进行通信。
1.2 中断的作用
提高计算机系统效率(并发性):计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。
维持系统可靠正常工作:现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。
满足实时处理要求:在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。
提供故障现场处理手段:处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。
中断使得计算机系统具备应对对处理突发事件的能力,提高了CPU的工作效率,如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,即轮询工作方式,轮询方法貌似公平,但实际工作效率却很低,却不能及时响应紧急事件。
中断:
1、适用于处理对响应要求非常高的事件
2、适用于处理持续时间非常短的事件
3、适用于低功耗的应用
4、程序设计较复杂
轮询:
1、适用于处理对事件响应要求低的场合
2、程序设计简单
1.3 中断的约束
中断处理是由内核执行的最敏感的任务之一,因为它必须满足下列约束:
- 中断应该被尽可能快地处理完。
- 中断处理程序必须编成使相应的内核控制路径能以嵌套的方式执行。
- 内核在处理一个中断时,可接受新的中断。但存在一个临界区,中断必须被禁止。
出于1)和3)的约束,中断的设计一般将中断处理程序分为两部分执行(即上半部和下半部函数)。上半部为中断被禁止的临界区,执行关键而紧急的任务,如把接收到的帧拷贝到输入队列,以便下半部函数执行时能进行处理。
1.4 中断请求 IRQ
不同的设备对应的中断不同,每一个中断都通过一个唯一的数字标识。这些数字表示的中断值被称为中断请求(IRQ, Interrupt Request)线,也可称为IRL(Interrupt Request Lines)。
1.5 中断服务程序 ISR
在响应一个特定中断时,内核会执行一个函数,这个函数叫做中断处理程序(Interrupt Handler),也可称为中断服务程序(Interrupt Service Routine, ISR)。
- 是被CPU硬件自动调用的,而不是其他程序代码中调用;
- 在ISR执行前、后,CPU自动进行了堆栈出入等操作;
- 写成C函数的参数和返回值都应为void。
1.6 中断向量表 IVT
中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。
中断向量表(interrupt vector table, IVT)就是中断向量的列表,在内存中保存(1K),其中存放着 256个中断源所对应的中断处理程序的入口地址。
- 中断向量表是一段连续的存储空间在复位后有默认的起始位置
- 每个中断在向量表中都有相应的表项,该表项的值为该中断对应的服务程序的地址(地址指针)
- 由程序代码确定中断向量表的每个表项
- 中断向量表的位置是可以通过改写中断向量基址寄存器重新定位的
1.7 中断优先级
中断优先级可以是固定的或编程指定的,
- 固定优先级:根据中断向量表顺序执行
- 设定优先级:每个中断都有优先级设置位
- 相同优先级的中断,按先后顺序处理
在某一时刻有几个中断源同时发出中断请求时,处理器只响应其中优先权最高的中断源。
当处理机正在运行某个中断服务程序期间出现另一个中断源的请求时,如果后者的优先权低于前者,处理机不予理睬,反之,处理机立即响应后者,进入所谓的“嵌套中断”。
1.8 中断嵌套
中断嵌套是指中断系统正在执行一个中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行的过程。
2、中断执行过程
- 中断源发出中断请求;
- 判断当前处理机是否允许中断和该中断源是否被屏蔽;
- 优先权排队;
- 处理机执行完当前指令或当前指令无法执行完,则立即停止当前程序,保护断点地址和处理机当前状态,转入相应的中断服务程序;
- 执行中断服务程序;
- 恢复被保护的状态,执行“中断返回”指令回到被中断的程序或转入其他程序。
上述过程中前四项操作是由硬件完成的,后两项是由软件完成的。
3、中断的分类
3.1 硬中断 和 软中断
从 中断实现的角度 看,分为硬中断和软中断。
- 硬中断:由硬件CPU实现。
实现:CPU 在每个指令周期的最后,会留一个 CPU 周期去查看是否有中断信号,若有,则把中断号取出、去中断向量表中寻找中断处理程序、跳过去执行。
触发:外部硬件直接给CPU引脚发送中断号信息,从而引起中断。
- 软中断:完全由软件实现。
实现:OS有一个单独的守护进程,不断轮询内存中的一组标志位(如BitMap),如果哪个标志位有值了,那去这个标志位对应的软中断向量表数组的相应位置,找到软中断处理函数,然后跳过去执行。
触发:其他软件通过设置这些标记位触发中断。
这些硬中断方式都可以打断程序或任务的执行,它们的触发都是为了给CPU一个中断信号,且CPU收到信号后的后续处理流程一样——即暂停执行当前程序或任务、根据中断号去中断表中找到对应的中断处理程序并执行、执行完后返回继续执行原程序或任务。
硬中断可进一步分类:
- 前两者为硬件中断(硬件产生的中断),
- 第三个为软件中断(软件产生的中断);
- 第一个为外部中断,
- 后两者为内部中断。
- Interrupt 中断(异步中断,随时可能发生)—— 外部设备通过CPU引脚触发:
可进一步分为可屏蔽中断(连接CPU INTR引脚触发)和不可屏蔽中断(连接CPU NMI引脚触发)。 - Exception 异常(同步中断)—— CPU执行出现异常时触发:
如除法指令分母为0、未定义的指令分别引起 0、6 号中断。分为三类:
Fault(故障):可恢复的错误。发生此中断时,CPU 将机器状态恢复到异常之前的状态,之后调用中断处理程序,结束后返回。常见的如缺页异常。
Trap(陷阱):有意的异常。通常是调试程序中用 int3 指令主动触发。
Abort(终止):不可恢复的异常。直接将此程序从进程表中去掉。
- INT 指令:由程序或任务显式通过 INT n 等指令触发。
3.1 硬件中断 和 软件中断
从 中断触发的角度 看,分为硬件中断和软件中断。
硬件中断(Hardware Interrupt): 通过硬件触发的中断
- 可屏蔽中断(maskable interrupt)。硬盘、鼠标、打印机、网卡等设备发出的中断信号,连接CPU INTR引脚触发,可通过在中断屏蔽寄存器中设定位掩码来关闭。
- 非可屏蔽中断(non-maskable interrupt,NMI)。无法通过在中断屏蔽寄存器中设定位掩码来关闭,CPU 必须立刻处理。典型例子是时钟中断、电源掉电、内存读写错误、总线奇偶校验错误等灾难性的错误。
- 处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。
- 伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。
软件中断(Software Interrupt): 通过软件触发的中断
- 软件中断。是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)。
4、上半部和下半部
为了提高系统的实时性和并发性,Linux内核将中断处理程序分为上半部(top half)和下半部(bottom half)。
上半部:
就是中断处理函数,处理一些寄存器操作、时间敏感任务,以及“登记中断”通知内核及时处理下半部的任务,确保中断处理函数快进快出。下半部:
如果中断处理过程比较耗时,则下半部负责处理中断任务中的大部分工作,如一个总线通信系统中数据处理部分。
比如,上半部将数据 copy 到内存中,下半部就执行对数据的处理。
Linux中断上下部分区别:
1)上半部由外设中断触发,下半部由上半部触发。
2)上半部不会被其他中断打断,下半部是可以被打断的。
3)上半部分处理任务要快,主要任务、耗时任务放在下半部。中断上下部分的设计原则:
1)与硬件相关的操作,如操作寄存器,必须放在上半部。
2)对时间敏感、要求实时性的任务放在上半部。
3)该任务不能被其他中断或者进程打断的放在上半部。
4)实时性要求不高的任务、耗时任务放在下半部。
参考资料:
深入理解系统中断(INTERUPT)
中断_百度百科
STM32 中断
Linux中断的上半部和下半部
Linux 系统中断相关推荐
- std string与线程安全_详解linux系统中断线程的那些事
很多情况下,使用信号来终止一个长时间运行的线程是合理的.这种线程的存在,可能是因为工作线程所在的线程池被销毁,或是用户显式的取消了这个任务,亦或其他各种原因.不管是什么原因,原理都一样:需要使用信号来 ...
- linux 系统中断信息,关于操作系统:中断处理(Linux /常规)
在mainbord上,我们有一个中断控制器(IRC),它充当可引发中断的设备与CPU之间的多路复用器: |--------| |-----------| | | -(0)--- ...
- linux 中断 c语言程序,linux驱动之中断处理过程C程序部分
当发生中断之后,linux系统在汇编阶段经过一系列跳转,最终跳转到asm_do_IRQ()函数,开始C程序阶段的处理.在汇编阶段,程序已经计算出发生中断的中断号irq,这个关键参数最终传递给asm_d ...
- Linux编程技术总结
前言 所谓Linux编程技术就是在Linux操作系统环境下进行软件开发时所使用的各种编程技术. 一 常见的Linux系统发行版 在介绍常见的 Linux 系统版本之前,首先需要区分 Linux 系统内 ...
- zynq Linux软件中断,Linux Zynq GPIO中断
注册中断:对每一个pin进行循环遍历for (pin_num = 0; pin_num < min_t(int, ZYNQ_GPIO_NR_GPIOS, (int)chip->ngpio ...
- 全志linux关机键,全志平台linux启动流程分析
转载:全志平台linux启动流程分析 一.BROM阶段 机器上电之后会执行固化在BROM里面的一段引导程序,这个程序会依次遍历所有支持的启动介质,直到找到第一个支持的.目前支持的启动介质是sd/mmc ...
- 网络编程—IO多路复用详解
假如你想了解IO多路复用,那本文或许可以帮助你 本文的最大目的就是想要把select.epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别. 基础知识 IO多路复 ...
- Linux内核分析——可执行程序的装载
链接的过程 首先运行C预处理器cpp,将C的源程序(a.c)翻译成ASCII码的中间文件(a.i) 接着C编译器ccl,将a.i翻译成ASCII汇编语言文件a.s 接着运行汇编器as,将a.s翻译成可 ...
- 汇编语言调用Linux系统调用
首先查找系统调用文件 #find / -name unistd.h /root/linux/include/unistd.h /usr/include/linux/unistd.h /usr/incl ...
最新文章
- Spring注解创建Bean的几种方式
- TF之DD:利用Inception模型+GD算法生成更高质量的Deep Dream高质量图片
- 英国电信前掌门韦华恩出任阿尔卡特朗讯CEO
- Android 应用开发(9)---内联复杂的XML资源
- mapreduce分组统计_如何优雅的理解MapReduce
- xml规范及xml解析
- 比亚迪唐DMI购车经验分享
- 中国手机沉浮录:告别青铜时代
- Cortex-M3/M4(1)-处理器概述
- 五笔字典86版wubi拆字图编码查询
- SpringBoot应用监控(带邮件警报)
- 【附源码】计算机毕业设计SSM小说阅读网站
- c罗说什么语言,那些年属于C罗的经典语录,那一句话最感动你?
- 怎么去区别机械硬盘的蓝盘,绿盘,红盘,黑盘各自特点
- 惊心动魄的开源项目“政变”,堪比宫斗...
- Excel之如何使用VLOOKUP函数合并两张表
- 低代码开发平台有什么价值
- 都是学 AI,为什么别人薪资比你高?
- 潮汐观测数据调和分析及预报成图
- 关于对于c语言全局变量初始化问题