硬中断是由硬件设备触发的中断。I/O设备要产生硬中断时,会由中断控制器发送一个电信号,内核的设备驱动程序接收到这个电信号,就会调用相应的中断处理函数对这个中断进行处理。硬中断可以在任何时刻到来,它代表的系统必须马上处理的紧急任务,也简称为中断的上半部,与此对应的是中断下半部(buttom half),也称为软中断,代表的系统不必马上处理的、没那么紧急的任务。
软中断处理函数一般在硬中断处理函数的末尾调用。硬中断处于所谓的“中断上下文中”。与此对应的是“进程上下文”。下面解释一下进程上下文,每个用户进程都可以分为用户态和内核态,一般情况下进程运行在用户态,当进程调用系统调用函数时,会进入内核态,这个时候进程就处于内核态的“进程上下文”中,当然内核的线程也属于进程上下文,如ksoftirqd线程。所以内核态有两种上下文,一种是“中断上下文”,一种是“进程上下文”。中断上下文一般处理一些耗时不是很长,对实时性要求很高,执行频度较高的应用。
比较特殊的是软中断,软中断会在中断处理完成后返回时执行,这个时候是处于中断上下文中的。在以前的内核版本中,没有出现ksoftirqd内核线程来防止软中断的重复调用,此时软中断会一直运行在“中断上下文中”。在后期的内核版本中,为了防止执行软中断的时候软中断又一直被触发,而让别的进程等的太久的情况发生, 在执行次数到了一个最大值的时候就执行内核线程ksoftirqd,然后中断就返回了.而不是一直 执行软中断.在ksoftirqd这个内核线程中执行软中断,此时就是在进程上下文中了。此时,软中断极可能出现在“中断上下文”,也可能出现在“进程上下文”。
中断有各自的优先级,以响应不同的处理请求。软中断的优先级相对来说处于低位,可被硬中断中断,但不会被用户的代码中断。而
硬中断不可能被其他中断中断。
引用《深入Linux内核架构》书中关于中断上下文与进程上下文的不同之处:
(1)中断是异步执行的,它们可以在任何时间发生。
(2)中断上下文中不能调用调度器,因而不能自动地放弃控制权。
(3)中断处理程序不能进入睡眠状态。原因是中断上下文不允许中断,进程睡眠后,内核只能永远地等待下去。
这是目前对Linux中断的理解,可能有偏差,再慢慢修正吧。