Note: This section describes the PC's priority interrupt handling based on the i8259. Although current systems support a more advanced mechanism (the Advanced Programmable Interrupt Controller (APIC)), it is still possible to use the older interface.
In the PC, all HW interrupts are processed using the i8259 IC, the priority interrupt controller (PIC). This IC has 8 interrupt request (IRQ) lines which are connected directly to I/O devices. These lines have an implicit priority: IRQ line 0 has the highest priority, next comes IRQ line 1, and so on until IRQ line 7. This means, that the PIC will forward an interrupt request to the processor, only if no interrupt with the same or higher priority is being processed. Furthermore, it is possible to mask each line independently: while an IRQ line is masked, the PIC will not forward any interrupt request on that line to the CPU.
The PC uses two PICs in cascade, as shown in Figure 2, with the INT line of the second one (the slave) connected to the IRQ line 2 of the first one (the master). This means that IRQ lines 0 and 1 of the master have higher priority than the IRQ lines of the slave PIC. However, all IRQ lines of the slave have higher priority than IRQ lines 3 to 7 of the master.
Figure 2 outlines the interrupt mechanism used in the PC. When an I/O device activates its interrupt request line, the PIC will activate the CPU's interrupt line, initiating an interrupt sequence. The CPU will then save the address of the instruction being executed and the flags register on the stack and will disable interrupts, and will respond by activating an interrupt acknowledgment line. When the PIC detects that this line is active, it will put an 8-bit value, which was previously programmed on the PIC, in the data bus. The processor then uses this 8-bit value as an index to a table (the Interrupt Descriptor Table) whose entries contain the addresses of interrupt service routines. The processor will then transfer control to the address of the entry corresponding to the 8-bit value received from the PIC. As a result, the processor will execute the device's interrupt service routine, or interrupt handler, which is responsible for informing the PIC that it has "finished" handling the interrupt, and must terminate with instruction IRETD
.
The sequence described in the previous paragraph, assumes that:
Because the PIC does not generate another interrupt for devices with the same or lower priority until it is informed that the current interrupt has already been handled, it is up to the interrupt handler (IH) to do it, by writing the EOI command (0x20) to the control register. If the interrupt originates on the slave PIC, the IH will need to issue the EOI command to both the slave and the master PICs. Table 4 shows the addresses of the PIC registers and Table 5 shows the IRQ lines and the interrupt vectors for common I/O devices of a PC.
PIC | Controller Register | Interrupt Mask Register |
---|---|---|
PIC1 | 0x20 | 0x21 |
PIC2 | 0xA0 | 0xA1 |
PIC 1 | PIC 2 | ||||
---|---|---|---|---|---|
IRQ | Device | Vector | IRQ | Device | Vector |
0 | Timer 0 | 0x08 | 8 | Real Time Clock | 0x70 |
1 | Keyboard | 0x09 | 9 | Replace IRQ2 | 0x71 |
2 | slave 8259 | 0x0A | 10 | Reserved | 0x72 |
3 | Serial device COM2 | 0x0B | 11 | Reserved | 0x73 |
4 | Serial device COM1 | 0x0C | 12 | Mouse | 0x74 |
5 | Reserved/Sound card | 0x0D | 13 | Math coprocessor | 0x75 |
6 | Diskette | 0x0E | 14 | Hard disk | 0x76 |
7 | Parallel port | 0x0F | 15 | Reserved | 0x77 |
An interrupt handler cannot take any arguments nor return any values. Furthermore, it must save all the registers that it uses and must terminate with the IRETD
instruction, which resets the stack and the processor to its state at the time the interrupt occurred. Because the interrupts are disabled while the interrupt handler executes, the CPU will not handle further interrupts. Therefore an interrupt handler should be as short as possible; if necessary, the interrupt handler may enable interrupts by executing the STI
instruction.