那么,CPU 如何知道最后一次输出何时完成?或者何时有数据在等待读取?通常,在一个状态寄存器中可以获得此信息,通过读取与某设备想关联的一个(或多个)IO 端口可以访问它。在这种情况下会出现两个问题。首先,CPU 不得不花费时间来检查状态。其次,如果设备持有来自某处的数据,比如连接的调制解调器,那些数据必须要及时被读取,否则就可能被下一个可用的数据字节所覆盖。
不浪费多余 CPU 周期,并确保数据能被及时读写,这两个问题是由 中断(interrupt) 的概念所解决的。中断也称为 中断请求(Interrupt Requests) 或 IRQs。当设备中发生 CPU 需要知道的某事件时,设备就会发出一个中断,CPU 则临时停止正在做的其他工作,来处理那件事情。
根据上一节的经验,毫无疑问关于中断的信息也保存在 /proc 文件系统中,在 /proc/interrupts 中。运行 cat /proc/interrupts 命令,可以看到类似于清单 4 的输出。
清单 4. /proc/interrupts
CPU0
0: 226300426
XT-PIC timer
1:
92913
XT-PIC keyboard
2:
0
XT-PIC cascade
5:
0
XT-PIC usb-uhci
8:
1
XT-PIC rtc
9: 2641134
XT-PIC ehci-hcd, eth0, Intel ICH4
10:
0
XT-PIC usb-uhci
11:
213632
XT-PIC usb-uhci
14: 1944208
XT-PIC ide0
15: 3562845
XT-PIC ide1
NMI:
0
ERR:
0
这一次,中断数字是从 0 到 15 的十进制数。同样,将这些中断与清单 5 所示的 PC 标准 IRQ 分配进行比较。
清单 5. 标准 IRQ 设置
IRQ 0 - System Timer
IRQ 1 - Keyboard
IRQ 2(9) - Video Card
IRQ 3 - COM2, COM4
IRQ 4 - COM1, COM3
IRQ 5 - Available (LPT2 or Sound Card)
IRQ 6 - Floppy Disk Controller
IRQ 7 - LPT1
IRQ 8 - Real-Time Clock
IRQ 9 - Redirected IRQ 2
IRQ 10 - Available
IRQ 11 - Available
IRQ 12 - PS/2 Mouse
IRQ 13 - Math Co-Processor
IRQ 14 - Hard Disk Controller
IRQ 15 - Available