简析Linux内核中断机制
作者:互联网
一、背景介绍
1、什么是中断?为什么要有中断?
2、中断完整流程是什么?
3、中断为什么要分上下半部?
4、下半部有哪些机制,如何选择?
5、如何使用同步机制保护中断临界区?
6、中断风暴?
二、基本原理
中断:改变处理器正常执行指令顺序的事件,可由硬件设备或者CPU本身产生。
中断与轮询:
(1)处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。
(2)引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。
(3)这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价,极大提高资源利用率。
三、分类
中断分类
interrupt/中断
由I/O设备生成的外部事件引起(包括CPU之间发送消息,IPI中断),也叫硬件中断;异步,需要切换到中断执行场景,存在上下文切换
可屏蔽中断
通过INTR线向CPU请求的中断,不影响系统运行,可以随时处理,主要来自外部设备(键盘、打印机、网卡等)
进程执行场景(process context)和中断执行场景(interrupt context)有两个区别:一是进程执行场景是可以调度、可以休眠的,而中断执行场景是不可以调度不可用休眠的;二是在进程执行场景中是可以接受中断信号的,而在中断执行场景中是屏蔽中断信号的。所以如果中断执行场景的执行时间太长的话,就会影响我们对新的中断信号的响应性,所以我们需要尽量缩短中断执行场景的时间。
中断执行场景为什么要屏蔽中断信号?
异步中断的处理有下面两类办法:
1.立即完全处理:
对于简单好处理的异步中断可以立即进行完全处理。
2.立即预处理 + 稍后完全处理:
对于处理起来比较耗时的中断可以采取立即预处理加稍后完全处理的方式来处理。
在Linux中,中断预处理叫做上半部,中断后处理叫做下半部。由于“上半部、下半部”词义不明晰,我们在本文中都用中断预处理、中断后处理来称呼。中断预处理只有一种方法,叫做hardirq(硬中断)。中断后处理有很多种方法,分为两类,直接中断后处理有softirq(软中断)、tasklet(微任务),线程化中断后处理有workqueue(工作队列)、threaded_irq(中断线程)。
不可屏蔽中断
通过NMI线向CPU请求的中断,不建议屏蔽,如电源掉电、硬件故障等。
exception/异常
处理器本身在执行指令过程中检测到的条件(包括CPU异常和指令中断),也叫软件中断 ;同步,均在进程执行场景,不需要上下文切换,直接执行相关指令
trap/陷阱
有意的,预先安排的异常事件;不需要修复,执行完成后继续执行下一条指令
linux使用陷阱指令:int 0x80进行系统调用
fault/故障
引起故障的指令被执行时但未结束时,CPU检测到的意外事件,需要修复且有可能修复;故障处理程序完成后,尝试修复错误,重新执行引起故障的指令。
常见的Page fault/缺页异常
abort/终止
发生致命错误,需要修复但是无法修复,因此直接终止程序
四、中断流程
CPU收到中断信号后会首先保存被中断程序的状态,然后再去执行中断处理程序,最后再返回到原程序中被中断的点去执行。
中断描述符、中断向量号、中断过程、寄存器保存
接受中断信号
查找向量表
五、exception/异常
代码流程分析
六、interrupt/中断
外设连接中断控制器(PIC,APIC),IRQ分配过程分析,通过IRQ进入中断处理程序
1、hardirq
2、softirq
tasklet、workqueue
七、中断与同步
八、参考资料
【1】https://zhuanlan.zhihu.com/p/360548214
【2】https://zhuanlan.zhihu.com/p/540897981
【3】http://www.wowotech.net/sort/irq_subsystem
【4】https://linux-kernel-labs.github.io/refs/heads/master/lectures/interrupts.html#
【5】https://zhuanlan.zhihu.com/p/94788008
【6】https://www.cnblogs.com/aaronLinux/p/10842499.html
标签:场景,中断,简析,指令,内核,Linux,执行,CPU,处理器 来源: https://www.cnblogs.com/HZL2017/p/16656655.html