You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					136 lines
				
				6.9 KiB
			
		
		
			
		
	
	
					136 lines
				
				6.9 KiB
			| 
											4 years ago
										 | 			iAPX 86 Interrupt Primer | ||
|  | 			------------------------ | ||
|  | 
 | ||
|  | 			     by Ralf Brown | ||
|  | 				 12/87 | ||
|  | 		    Updated 6/88, 4/90, 9/92, 1/97 | ||
|  | 
 | ||
|  | 
 | ||
|  | What is an interrupt? | ||
|  | --------------------- | ||
|  |    An interrupt is a hardware signal that tells the CPU to temporarily | ||
|  |    stop what it is doing and go do something else.  Without interrupts, | ||
|  |    the CPU would have to constantly check for external events; with | ||
|  |    interrupts, the CPU can work on something else and still respond to | ||
|  |    an event as soon as it occurs.  | ||
|  | 
 | ||
|  |    CPUs typically have an instruction to disable interrupts for use | ||
|  |    when a section of code has to run without being disturbed by | ||
|  |    external events.  Because of this, most CPUs also have a special | ||
|  |    interrupt called a Non-Maskable Interrupt (NMI), which is responded | ||
|  |    to even when all other interrupts are disabled.  The NMI is used to | ||
|  |    signal calamities such as memory failure or imminent power loss. | ||
|  | 
 | ||
|  | Why so many different interrupts? | ||
|  | --------------------------------- | ||
|  |    The 8086 family of processors has the ability to recognize 256 | ||
|  |    different interrupts.  They also have the ability to let a program | ||
|  |    invoke any of these interrupts with a special instruction, known as | ||
|  |    a software interrupt (as opposed to a hardware interrupt which is | ||
|  |    signalled from outside the processor).  Software interrupts are | ||
|  |    treated just like hardware interrupts, except that they are never | ||
|  |    disabled and do not result in an acknowledgement to other chips in | ||
|  |    the computer.  The software interrupt instruction on the 8086 family | ||
|  |    is called INT, and is given the number of the interrupt.  Thus an | ||
|  |    INT 21h instruction invokes interrupt number 33 decimal. | ||
|  | 
 | ||
|  |    Other processors also have software interrupts, though they often | ||
|  |    use different names, such as the Motorola 68000 family TRAP | ||
|  |    instruction, the Intel 8080 RST (ReSTart) instruction, or many | ||
|  |    mainframes' SVC (SuperVisor Call).  | ||
|  | 
 | ||
|  |    Since a program can invoke an interrupt by number rather than by its | ||
|  |    address (as it has to in calling subroutines), interrupts are a | ||
|  |    convenient way of providing services without having to recompile a | ||
|  |    program whenever the address of the code providing the service | ||
|  |    changes.  This also allows a user program to enhance the services | ||
|  |    provided by directing the interrupt to itself.  These enhanced | ||
|  |    services can then be made available to other programs. | ||
|  | 
 | ||
|  | How does an interrupt work in real-address mode? | ||
|  | ------------------------------------------------ | ||
|  |    The 8086 reserves the lowest 1024 bytes of memory for a table (IVT, | ||
|  |    Interrupt Vector Table) containing the addresses for each of the 256 | ||
|  |    possible interrupts.  When an interrupt occurs (hardware or | ||
|  |    software), the processor multiplies its number by 4 and looks at the | ||
|  |    resulting memory location to find the address of the piece of code | ||
|  |    which handles the interrupt.  It then places the current address in | ||
|  |    the program and the processor flags on the stack, and jumps to the | ||
|  |    beginning of the interrupt handler. | ||
|  | 
 | ||
|  |    When the interrupt handler finishes, it invokes a special | ||
|  |    instruction to return from the interrupt.  This instruction takes | ||
|  |    the previously saved flags and program address off of the stack and | ||
|  |    places them back in the appropriate registers in the CPU. | ||
|  | 
 | ||
|  |    The interrupt handler has to be careful to preserve any registers | ||
|  |    that it uses which are not used to communicate results to the | ||
|  |    program that invoked the interrupt.  If the interrupt can be | ||
|  |    triggered by a hardware interrupt (only certain ones can on IBM | ||
|  |    PC's, XT's, and AT's), then the interrupt handler has to preserve | ||
|  |    ALL registers, since the interrupt could have happened anywhere. | ||
|  | 
 | ||
|  | How does an interrupt work in protected mode? | ||
|  | --------------------------------------------- | ||
|  |    The 80286 and later processors can also operate in protected mode, | ||
|  |    in which case the interrupt handling is somewhat different.  First, | ||
|  |    the interrupt table consists of eight-byte descriptors instead of | ||
|  |    four-byte addresses, and need not be located at physical address | ||
|  |    zero, nor contain the full 256 entries (the address and size of the | ||
|  |    Interrupt Descriptor Table (IDT) may be manipulated with the LIDT | ||
|  |    and SIDT instructions). | ||
|  | 
 | ||
|  |    Second, in protected mode, the descriptor for an interrupt number | ||
|  |    specifies HOW control is transferred to the interrupt handler. | ||
|  |    Three types of transfer are possible: Interrupt Gate, Trap Gate, | ||
|  |    and Task Gate.  The first two types transfer control to a handler | ||
|  |    running in the same process as the active program, while a Task Gate | ||
|  |    performs a complete context switch in order to invoke a handler in | ||
|  |    a different process from the active program.  Interrupt and Trap | ||
|  |    gates are identical except that an Interrupt Gate will clear IF | ||
|  |    and thus disable interrupts, while a Trap Gate leaves IF unchanged. | ||
|  | 
 | ||
|  | How does an interrupt work in virtual-86 (V86) mode? | ||
|  | ---------------------------------------------------- | ||
|  |    The 80386 and later processors provide a virtual-8086 mode which is | ||
|  |    a protected mode that appears to software to be the same as Real | ||
|  |    mode.  Because it is a protected mode, however, interrupts and | ||
|  |    various other actions that potentially affect system integrity do | ||
|  |    not execute directly, but instead invoke a supervisor program running | ||
|  |    in standard protected mode.  Thus, whenever a program running in | ||
|  |    V86 mode invokes an interrupt call, the CPU switches to protected | ||
|  |    mode and transfers control to the interrupt handler specified by | ||
|  |    the protected-mode IDT, rather than the real-mode IVT.  The | ||
|  |    supervisor program may handle the interrupt call in any way it | ||
|  |    likes, but typically switches the CPU back into V86 mode and jumps | ||
|  |    to the address specified in the real-mode IVT (a process which is | ||
|  |    known as "reflecting" the interrupt). | ||
|  | 
 | ||
|  | 
 | ||
|  | GLOSSARY | ||
|  | -------- | ||
|  | API (Application Program[ming] Interface) | ||
|  |    An API is the set of function calls and services that a program | ||
|  |    makes available to other processes (applications).  Each function or | ||
|  |    service has a set format which specifies the values to be supplied | ||
|  |    by the caller and the values which are returned. Because of this | ||
|  |    interface specification, the underlying organization of the function | ||
|  |    or service can be changed without affecting the applications which | ||
|  |    use it.  For example, the DOS INT 21h file access functions remained | ||
|  |    unchanged between DOS 2.x and DOS 3.x, even though the internal data | ||
|  |    structures and code organization changed significantly. | ||
|  | 
 | ||
|  | IDT (Interrupt Descriptor Table) | ||
|  | 
 | ||
|  | IVT (Interrupt Vector Table) | ||
|  | 
 | ||
|  | NMI (Non-Maskable Interrupt) | ||
|  |    Most external (hardware) interrupts can be disabled by the CLI | ||
|  |    (CLear Interrupt enable flag) instruction when the CPU is executing | ||
|  |    critical code that should not be interrupted, such as switching from | ||
|  |    one stack to another.  However, there are some situations so dire | ||
|  |    that the CPU must act on them immediately no matter what else it is | ||
|  |    doing, even if it has disabled interrupts.  The Non-Maskable | ||
|  |    Interrupt serves precisely this purpose, as it cannot be disabled | ||
|  |    (masked) by the CPU. |