Chapter 3. Hardware Interrupts
Hardware interrupts are used by devices to communicate that they require attention from the operating system. Some common examples are a hard disk signaling that is has read a series of data blocks, or that a network device has processed a buffer containing network packets. Interrupts are also used for asynchronous events, such as the arrival of new data from an external network. Hardware interrupts are delivered directly to the CPU using a small network of interrupt management and routing devices. This chapter describes the different types of interrupt and how they are processed by the hardware and by the operating system. It also describes how the Red Hat Enterprise Linux for Real Time kernel differs from the standard kernel in handling the types of interrupt.
A standard system receives many millions of interrupts over the course of its operation, including a semi-regular "timer" interrupt that periodically performs maintenance and system scheduling decisions. It may also receive special kinds of interrupts, such as NMI (Non-Maskable Interrupts) and SMI (System Management Interrupts).
Hardware interrupts are referenced by an interrupt number. These numbers are mapped back to the piece of hardware that created the interrupt. This enables the system to monitor which device created the interrupt and when it occurred.
In most computer systems, interrupts are handled as quickly as possible. When an interrupt is received, any current activity is stopped and an interrupt handler is executed. The handler will preempt any other running programs and system activities, which can slow the entire system down, and create latencies. Red Hat Enterprise Linux for Real Time modifies the way interrupts are handled in order to improve performance, and decrease latency.
Example 3.1. Viewing Interrupts on Your System
To examine the type and quantity of hardware interrupts received by a Linux system, use the
catcommand to view
cat /proc/interruptsCPU0 CPU1 0: 13072311 0 IO-APIC-edge timer 1: 18351 0 IO-APIC-edge i8042 8: 190 0 IO-APIC-edge rtc0 9: 118508 5415 IO-APIC-fasteoi acpi 12: 747529 86120 IO-APIC-edge i8042 14: 1163648 0 IO-APIC-edge ata_piix 15: 0 0 IO-APIC-edge ata_piix 16: 12681226 126932 IO-APIC-fasteoi ahci, uhci_hcd:usb2, radeon, yenta, eth0 17: 3717841 0 IO-APIC-fasteoi uhci_hcd:usb3, HDA, iwl3945 18: 0 0 IO-APIC-fasteoi uhci_hcd:usb4 19: 577 68 IO-APIC-fasteoi ehci_hcd:usb1, uhci_hcd:usb5 NMI: 0 0 Non-maskable interrupts LOC: 3755270 9388684 Local timer interrupts RES: 1184857 2497600 Rescheduling interrupts CAL: 12471 2914 function call interrupts TLB: 14555 15567 TLB shootdowns TRM: 0 0 Thermal event interrupts SPU: 0 0 Spurious interrupts ERR: 0 MIS: 0
The output shows the various types of hardware interrupt, how many have been received, which CPU was the target for the interrupt, and the device that generated the interrupt.
3.1. Level-Signaled Interrupts
Level-signaled interrupts use a dedicated interrupt line to deliver voltage transitions.
The dedicated line can send one of two voltages to represent a binary 1 or binary 0. Once a signal has been sent by the line, it will remain in that state until the CPU specifically resets it. This is achieved by the CPU asking the generating device to stop asserting the line. This allows a number of devices to share a single interrupt line. If the CPU has instructed a device to stop asserting the line, and it remains asserted, there is another interrupt pending.
Although level-signaled interrupts require a high level of hardware logic in both the devices and the CPU, they also provide a number of benefits. Not only can they be used by more than one device, but they are almost completely unable to miss an interrupt.