Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Interruzioni ed eccezioni:
La distinzione fondamentale tra questi due tipi di eventi è la seguente :
• le eccezioni (ad esempio, quelle segnalate dalla MMU, oppure quelle di overflow nelle operazioni
aritmetiche) sono eventi sincroni rispetto all’esecuzione del processo corrente : infatti, esse si verificano in
quanto provocati dalla stessa computazione in corso sul processore, la quale è espressa in modo da testare
esplicitamente la presenza di ben determinate eccezioni (solo quelle che interessano) a istanti ben
determinati (a livello firmware, o a livello assembler, o a livelli superiori) ;
• le interruzioni sono eventi asincroni rispetto all’esecuzione del processo corrente : infatti, essi non sono
provocati dalla computazione in corso sul processore, bensì da computazioni che evolvono parallelamente
a essa su unità di I/O (o altri processori); non avrebbe senso che il processo eseguito dal processore
testasse la presenza di ben determinate interruzioni a istanti scelti arbitrariamente ; convenzionalmente si
sceglie allora la fine del microprogramma di ogni istruzione per testare la presenza di una qualsiasi
interruzione, proseguendo subito alla chiamata dell’istruzione successiva se non sono attualmente
segnalate interruzioni presenti.
1
Modello DMA: Questo modello viene adottato per unità di I/O che effettuano trasferimenti a blocchi in
modo indipendente da, e quindi in parallelo a, l’elaborazione del processore centrale. Ad esempio, una
semplice unità disco può ricevere richieste così espresse:
• lettura, indirizzo base del blocco su disco da cui leggere, indirizzo base in M del blocco in cui scrivere,
• scrittura, indirizzo base del blocco su disco in cui scrivere, indirizzo base in M del blocco da cui leggere.
Nel caso di unità di I/O realizzate con processori general-purpose, gli indirizzi generati dalle unità di I/O
sono logici e vengono tradotti in indirizzi fisici da una propria MMU.
Nel caso di unità specializzate a firmware, se non fosse prevista una MMU gli indirizzi da esse generati sono
fisici. L ’arbitraggio del Bus DMA è indipendente da quello del Bus di I/O. La memoria principale M si trova
ora ad avere due interfacce: una dedicata con MMU, l’altra con il Bus DMA. Il microprogramma di M è
nondeterministico in quanto deve arbitrare le situazioni di conflitto, per la presenza contemporanea di
messaggi sulle due interfacce d’ingresso, dando priorità a una di esse (tipicamente, al Bus DMA), oppure
stabilendo una disciplina di priorità variabile.
2
richiesta del processore è di eseguire l’operazione esterna 2 oppure la 1, rispettivamente. È dunque
sufficiente che il processo interno esegua istruzioni di STORE con indirizzo e dato sorgente opportuni.
Fase Firmware: Le scelte ora fatte, in particolare l’uso dei registri riservati RG[60 .. 63], valgono solo a titolo
di esempio e non devono essere prese per oro colato; avremmo potuto scegliere quattro locazioni di
memoria di indirizzo noto, oppure una qualsiasi combinazioni di registri generali e locazioni di memoria. La
fase firmware è descritta dal seguente microprogramma (all’etichetta tratt_int, cui, come sappiamo, si salta
da ogni fase di esecuzione istruzione se e quando INT = 1):
tratt_int. reset INT, set ACKINT, int1
int1. (RDYINM, or(ESITO), = 0 – ) nop, int1;
(= 10) reset RDYINM, set ACKINM (cioè RDYOUTM), DATAIN REG[61], int2
(ricevuto ii codice dell'evento, questo viene passato alla Routine di interfacciamento interruzioni via
RG[61]}
(= 11) reset RDYIN, tratt_ecc ;
int2. (RDYINM, or(ESITO), = 0 - ) nop, int2;
(= 10) reset RDYINM, set ACKINM, DATAIN -> REG[62], ICREG[63], REG[60]IC, ch0
(ricevuta la seconda parola dei messaggio di I/O, questa viene passata alla Routine di interfacciamento
interruzioni via REG(62], viene salvato t’indirizzo d i ritorno dalla Routine, ed effettuato il salto alla Routine
stessa)
(=11) reset RDYINM, tratt_ecc ;
3
LOAD Rtab_int, Revent, Rhandler, DI
CALL Rhandler, Rret_handler
GOTO Rret_prog, EI
//dove Revent è R61, mentre Rret_prog è R63
Si noti che anche l’Handler, essendo una procedura chiamata dalla Routine Interfacciamento Interruzioni,
viene eseguito a interruzioni disabilitate. In generale, questa “facility” è utile in tutte le situazioni (e sono
molto frequenti) in cui il codice da eseguire in modo non interrompibile è una procedura (o un
annidamento di procedure).
Un altro esempio significativo si ha nella fase di commutazione di contesto, nella quale è conveniente
riabilitare le interruzioni durante l’ultima istruzione della fase stessa (START_PROCESS)