add directory docs
This commit is contained in:
135
docs/interrupts/inter61/INTERRUP.PRI
Normal file
135
docs/interrupts/inter61/INTERRUP.PRI
Normal file
@@ -0,0 +1,135 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user