中断和中断处理
中断
中断本质上是一种电信号,由硬件设备发向处理器,处理器接受到中断之后,就会向操作系统反映该中断,让操作系统去处理新来的数据。
不同的设备对应的中断不同,因此每个中断需要通过一个中断值来进行标识。
异常也是一种同步中断,很多处理器体系结构处理异常的方式与中断类似
中断处理程序
在Linux中,中断处理程序就是普通的C函数,但要按照特定的类型进行声明,这样内核才能用这个处理程序去响应中断。同时,这个中断响应程序位于中断上下文中,这是一种原子上下文,不可被阻塞。
中断发生后,操作系统接受到信号会通知硬件设备,并且还会做一下数据操作。
上半部与下半部的对比
为了使得中断处理程序能够运行得又快,完成工作量也大,一般把中断处理程序分为两部分,上半部处理紧急的,有严格限时的工作,下半部会执行一些其它的诸如处理和操作数据的工作。
中断上下文
当中断处理程序运行时,内核处于中断上下文中。
中断上下文不能睡眠,应该尽量简洁,避免循环出现,这样才能保证中断处理程序迅速。
中断处理机制的实现
中断处理系统在Linux中是依赖于体系结构的。
设备产生中断——>电信号被传到中断控制器——>如果中断线是激活状态,则把信号传到CPU——>CPU接收到信号之后,会定义正在做的事,关闭中断系统,跳转到内核预定义的内存位置,则中断处理程序的入口点。
/proc/interrupts
在这个文件中存放着系统中与中断相关的统计信息,可以看看:
1 | CPU0 CPU1 CPU2 CPU3 |
这里就显示了中断号,和对应的接收中断数目的计数器。