不同的外部设备、不同的体系结构、不同的OS其中断实现机制都有差别。
中断存在的意义是CPU控制外部设备的同时,外部设备也可以高效的“控制CPU”。这种设计思想扩展到了外部硬件控制CPU、软件控制CPU、CPU运行管理等三个方面。因此,使用events事件表示,更加贴切实际,但在平时描述中,基本上仍然采用了中断这个词。
events的分类如下图所示,主要包括中断和异常,外部硬件控制CPU对应hardware interupt,软件控制CPU对应software interrupt,CPU运行管理则对应exception。(所以脑子里还是要丰富这个认识)
(你整得戳得代码就容易产生异常,你如果对这个没有映像,说明友友你是个软件小能手。)
1、什么是中断
我想用我的语言去描述,写了删除了,写的是个狗屁,于是我去查,
一个微信公众号写的不错:
中断是为了解决外部设备完成某些工作后通知CPU的一种机制(譬如硬盘完成读写操作后通过中断告知CPU已经完成)。早期没有中断机制的计算机就不得不通过轮询来查询外部设备的状态,由于轮询是试探查询的(也就是说设备不一定是就绪状态),所以往往要做很多无用的查询,从而导致效率非常低下。由于中断是由外部设备主动通知CPU的,所以不需要CPU进行轮询去查询,效率大大提升。(中断的意义)
从物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如 8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后,处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识,这些值通常被称为中断请求线。
2、软件中断与硬件中断
现在我们来继续看看这些名词,这是因为其实因为操作的都是物联网设备,那么基本上都是基于ARM体系的硬件。但是刚刚查的资料都是继续x86的,虽然都是linux操作系统。于是这里先继续来丰富点自己的理论知识。
1. 硬件中断:
硬件中断是由某些硬件设备引起的,例如启动 I/O 的请求、硬件故障或类似的事情。引入硬件中断是为了避免在轮询循环中浪费处理器宝贵的时间,等待外部事件。
例如,当 I/O 操作完成时,例如从磁带驱动器将一些数据读入计算机。
2. 软件中断:
软件中断是通过使用 INT 指令调用的。此事件立即停止程序的执行并将执行传递给 INT 处理程序。INT 处理程序通常是操作系统的一部分,并确定要采取的操作。它发生在应用程序终止或从操作系统请求某些服务时。例如,输出到屏幕,执行文件等。
3. 区别
(我一直以为软件中断的优先级比硬件中断的优先级低的。)
- 硬件中断是由外设引发的, 软中断是执行中断指令产生的.
- 硬件中断的中断号是由中断控制器提供的, 软中断的中断号由指令直接指出, 无需使用中断控制器.
- 硬件中断是可屏蔽的, 软中断不可屏蔽.
- 硬件中断处理程序要确保它能快速地完成任务, 这样程序执行时才不会等待较长时间, 称为上半部.
- 软中断处理硬中断未完成的工作, 是一种推后执行的机制, 属于下半部.
3、软中断与硬中断
- 硬中断是由外部事件引起的因此具有随机性和突发性;硬中断是否可以嵌套的,是否有优先级(由硬件设计体系决定)。
- 软中断是执行中断指令产生的,无面外部施加中断请求信号,因此中断的发生不是随机的而是由程序安排好的。
由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包
的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。
为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间
就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(sofTIrq)来完成。
这里解释了我们之前在GIC中断系列中对于中断的两个stage的文字。原来这个中断两个阶段是这个意思。
- 软中断是执行中断指令产生的,而硬中断是由外设引发的。
- 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
- 硬中断是可屏蔽的,软中断不可屏蔽。
- 硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
- 软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
(和软件中断硬件中断对应起来了!!!)
4、中断嵌套、软中断指令、
1、中断嵌套
Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。
2、软中断指令
int是软中断指令。
中断向量表是中断号和中断处理函数地址的对应表。
int n - 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。