Mehanizam prekida
Elektrotehnički fakultet
Operativni sistemi 1
u Beogradu
Čas 3
Mehanizam prekida
On receipt of the interrupt, the kernel saves its
current context
(a frozen image of what the process was doing)
,
determines the cause of the interrupt, and service the interrupt.
Maurice J. Bach
Primer
: U isto vreme se radi download (u pozadini) i kucanje teksta u
Wordu. Ili svira muzika i bilo koji drugi interaktivni program (Word,
Visual Studio, Eclipse, …)
Struktura OS
DOS:
Teorija
<
Slika CPUa i nekoliko periferija koje su zakačene preko IRQ linija
>
<
Slika 8086ice i kontrolera periferije 8259A
>
Pojmovi
-
Prekid
-
Adresa prekidne rutine, ili kraće prekida (
interrupt pointer
)
-
Tabela adresa prekidnih rutina (
Interrupt vector table
)
-
Dozvola i zabrana izvršenja prekida:
Interrupt flag
i
Trap flag
u
PSW registru
Kod 8086ice kada se dogodi prekid,
hardver
izvršava sledeću proceduru:
Operativni sistemi 1 Copyright
2006 Miloš Milovanović
Mart 2006
1 / 21
Elektrotehnički fakultet
Operativni sistemi 1
u Beogradu
- Određuje se broj prekida N
- Registri PSW, CS i IP se stavljaju na stek u tom redosledu
- Resetuju se bitovi IF i TF iz registra PSW
- Stavlja se sadržaj memorijske lokacije 4*N u registar IP i sadržaj
lokacije 4*N+2 u registar CS (
interrupt pointer
se smešta u PC)
Da bi se izvršio povratak iz prekidne rutine, potrebno je izvršiti (softverski)
naredbu
IRET
, koja će pokupiti sa steka registre koje je hardver sačuvao
prilikom obrađivanja prekida.
Zad 0.
Napisati program na C jeziku koji broji događaje koje je generisala
tastatura. Broj prekida na koji je zakačena tastatura je 9h. Adresa registra
podataka tastature je 60h, a kontrolnog registra je 61h. Adresa kontrolnog
registra kontrolera periferije je 20h.
#include
<stdio.h>
volatile
int
cntr = 0;
void
interrupt keyboardISR(){
asm {
in al, 60h
//; Get scan code
}
//;
++cntr;
//; Process event
//;
//; Protokol završetak obrade prekida.
//; Obaveštava se periferija kontroler prekida da je
//; prekid obrađen
asm {
in al, 61h
//; Send acknowledgment without
or al, 10000000b
//; modifying the other
// bits.
out 61h, al
//;
and al, 01111111b
//;
out 61h, al
//;
Operativni sistemi 1 Copyright
2006 Miloš Milovanović
Mart 2006
2 / 21

Elektrotehnički fakultet
Operativni sistemi 1
u Beogradu
asm {
cli
push es
push ax
mov ax,0
mov es,ax
// vraća originalnu rutinu rutinu
push word ptr oldKbdSEG
pop word ptr es:0026h
push word ptr oldKbdOFF
pop word ptr es:0024h
pop ax
pop es
sti
}
}
void
doSomething(){
asm sti
for
(
int
i = 0; i < 10; ++i) {
printf("main %d ", i);
for
(
int
j = 0; j< 30000; ++j)
for
(
int
k = 0; k < 30000; ++k);
}
printf("Tastatura je generisala %d dogadjaja! ", cntr);
}
int
main(){
inic();
Operativni sistemi 1 Copyright
2006 Miloš Milovanović
Mart 2006
4 / 21
Elektrotehnički fakultet
Operativni sistemi 1
u Beogradu
doSomething();
restore();
return
0;
}
Zad 1.
Napisati program na C jeziku koji prekida izvršenje glavnog
programa na svakih 5s i ispisuje na ekran odgovarajuću poruku. Prekid od
timer-a
se generiše 18.2 puta u sekundi. Ovaj prekid se nalazi na broju 1Ch.
Rešenje:
#include
<iostream.h>
volatile
int
brojac = 100;
// prekidna rutina
void
interrupt timer(){
if
(--brojac==0) {
brojac = 100;
cout << "..........................." << endl;
}
}
unsigned
oldTimerOFF, oldTimerSEG;
// stara prekidna rutina
// postavlja novu prekidnu rutinu
void
inic(){
asm{
cli
push es
push ax
mov ax,0
// inicijalizuje rutinu za tajmer
mov es,ax
Operativni sistemi 1 Copyright
2006 Miloš Milovanović
Mart 2006
5 / 21

Ovaj materijal je namenjen za učenje i pripremu, ne za predaju.
Slični dokumenti