Linux内核学习——中断和中断处理

中断和中断处理

中断

中断本质上是一种电信号,由硬件设备发向处理器,处理器接受到中断之后,就会向操作系统反映该中断,让操作系统去处理新来的数据。

不同的设备对应的中断不同,因此每个中断需要通过一个中断值来进行标识。

异常也是一种同步中断,很多处理器体系结构处理异常的方式与中断类似

中断处理程序

在Linux中,中断处理程序就是普通的C函数,但要按照特定的类型进行声明,这样内核才能用这个处理程序去响应中断。同时,这个中断响应程序位于中断上下文中,这是一种原子上下文,不可被阻塞。

中断发生后,操作系统接受到信号会通知硬件设备,并且还会做一下数据操作。

上半部与下半部的对比

为了使得中断处理程序能够运行得又快,完成工作量也大,一般把中断处理程序分为两部分,上半部处理紧急的,有严格限时的工作,下半部会执行一些其它的诸如处理和操作数据的工作。

中断上下文

当中断处理程序运行时,内核处于中断上下文中。

中断上下文不能睡眠,应该尽量简洁,避免循环出现,这样才能保证中断处理程序迅速。

中断处理机制的实现

中断处理系统在Linux中是依赖于体系结构的。

设备产生中断——>电信号被传到中断控制器——>如果中断线是激活状态,则把信号传到CPU——>CPU接收到信号之后,会定义正在做的事,关闭中断系统,跳转到内核预定义的内存位置,则中断处理程序的入口点。

/proc/interrupts

在这个文件中存放着系统中与中断相关的统计信息,可以看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
          CPU0       CPU1       CPU2       CPU3       
0: 15 0 0 0 IO-APIC 2-edge timer
1: 9 9438 1199 1250 IO-APIC 1-edge i8042
8: 0 1 0 0 IO-APIC 8-edge rtc0
9: 144 26 16 13 IO-APIC 9-fasteoi acpi
12: 36 10535 1621 1496 IO-APIC 12-edge i8042
16: 353 545207 28 43 IO-APIC 16-fasteoi ehci_hcd:usb1, wlp8s0
23: 8 19 6 2 IO-APIC 23-fasteoi ehci_hcd:usb2
24: 0 0 0 0 PCI-MSI 16384-edge PCIe PME
25: 0 0 0 0 PCI-MSI 458752-edge PCIe PME
26: 0 0 0 0 PCI-MSI 466944-edge PCIe PME
27: 255 6690 14093 39701 PCI-MSI 327680-edge xhci_hcd

这里就显示了中断号,和对应的接收中断数目的计数器。