人物探究硬中断和软中断原理与区别以can报文解析实例为场景
从本质上讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,并通过总线把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。
硬中断由与系统相连的外设自动产生,如网卡、硬盘等。主要是用来通知操作系统系统外设状态的变化。当网卡收到数据包的时候,就会发出一个硬中断。我们通常所说的“中断”指的是硬中断(hardirq)。
每个设备或设备集都有它自己的IRQ(请求),基于这些IRQ,CPU可以将相应的请求分发到对应的硬件驱动上。在多核心系统上,一般情况下一个中的只能在一颗CPU上被触发,但在特殊情况下,可以在没有主CPU支持的情况下,在大型主机上同时触发多个中的。
对于那些需要花费一些时间去处理的进程,内核调度代码也可以被其他硬中的打扰。这意味着时钟、中止等事件可能会导致当前正在运行的进程被挂起,从而让其他进程来运行。
软中断则不同,由于实时性要求较高,当出现长时间任务时,将其推迟至后续完成,以提高效率。这部分工作通常由当前正在运行进程产生,对I/O请求进行调度。如果I/O模型允许,这些请求可能会排队并且可以稍后处理,或许还会使得当前执行过程暂停直至I/O完成,然后再继续执行。
另一方面,不同类型或相同类型但不同的软中的不能嵌套执行。而对于软件指令intn-触发软间n,它们是通过定义好的向量表地址+4*n来寻找对应函数地址。此外,Linux提供了开关控制函数,如local_irq_disable()和local_irq_restore()用于管理本地以及保存状态,以及local_bh_disable()和local_bh_enable()用于管理softirq、tasklet和workqueue等下的开关控制。
最后,我们还需要了解如何判断是否处于不同类型的抢占状态,比如in_interrupt(), in_irq(), 和in_softirq().