Linux Interrupts

Linux 中断请求

中断请求的英文是IRQ(Interrupt Request),是用来驱动CPU正常工作的重要机制。 中断根据源头分类成:
由外设发出的硬件中断,软件发出的软中断,以及异常组成。

以前,每个外设都连接一根线到PIC(programmable Interrupt circuit)芯片,有PIC芯片来发生数据到CPU,并将CPU的INTR引脚置位。
现在,CPU集成了PIC成为APIC(Advanced PIC)。

中断分类

中断分为3类型

硬件中断

鼠标和键盘,还有IO设备都会发出硬件中断,例如网卡的数据到了,就会出发中断请求(IRQ),
这个请求会触发CPU去执行ISR, 而这个ISR需要在系统启动的时候注册的。一个Vector表。

软件中断

当播放电影的时候,声音和画面的同步非常重要,这是由系统的定时器jiffies来不停地调度声音播放器来准确播放对应的声音。
软中断在实时操作系统的作用也非常重要。

异常中断

异常中断又分为3类: 缺页异常(Faults),陷入异常(Traps),异常退出(Aborts)

例如当程序的内存被swap到硬盘了或者一段动态链接库还没有载入到内存里来,在程序走到这个位置之前,
程序就会提前发出缺页异常,当系统检查了权限和地址有效后(地址有效表示在逻辑地址范围内),
CPU开始为程序执行加载需要的数据,并清除这个异常。 所以这个异常是可以修正的,这个请求必须提前发出。

当GDB调试的时,设置断点会插入一条特殊的指令到程序里,当执行到断点位置就会出发Traps请求,软件的主导权由CPU交给GDB。

当程序触发一个异常例如0/0时,会出发退出异常,由cpu来清理堆栈。

请求的可阻塞性

对于硬件中断请求,CPU的决策是立即执行,对于软中断和异常,CPU采用尽量延后的策略。

查看系统的中断

在中断执行 watch -n1 "cat /proc/interrupts"可以定时更新中断的次数

列的含义从左至右以此为:

1
IRQ vector, interrupt count per CPU (0 .. n), the hardware source, the hardware source's channel information, and the name of the device that caused the IRQ.