Domanda

Dovrei prima condividere tutto quello che so - e questo è il caos più completo.Ci sono diverse domande sull'argomento, quindi per favore non irritarti :).

1) Per trovare un ISR, alla CPU viene fornito un numero di interrupt.Nelle macchine x86 (286/386 e successive) è presente un IVT con ISR al suo interno;ogni voce ha una dimensione di 4 byte.Quindi dobbiamo moltiplicare il numero di interrupt per 4 per trovare l'ISR.Quindi la prima serie di domande è: sono completamente confuso sul meccanismo con cui la CPU riceve l'interruzione.Per generare un'interruzione, innanzitutto il dispositivo deve cercare l'IRQ, quindi cosa?Il numero di interrupt viaggia "su IRQ" verso la CPU?Ho anche letto qualcosa come il dispositivo che inserisce l'indirizzo ISR sul bus dati;cos'è allora?Qual è il concetto di dispositivi che prevalgono sull'ISR.Qualcuno può dirmi alcuni dispositivi di esempio in cui la CPU esegue il polling degli interrupt?E dove trova l'ISR per loro?

2) Se due dispositivi condividono un IRQ (il che è molto possibile), in cosa differisce la CPU tra loro?Cosa succede se entrambi i dispositivi sollevano simultaneamente un'interruzione della stessa priorità?Ho saputo che ci sarà un mascheramento dello stesso tipo e interruzioni a bassa priorità, ma come avviene questa comunicazione tra CPU e controller del dispositivo?Ho studiato il ruolo di PIC e APIC per questo problema, ma non sono riuscito a capire.

Grazie per aver letto.Grazie mille per la risposta.

È stato utile?

Soluzione

Le CPU non eseguono il polling degli interrupt, almeno non in senso software.Per quanto riguarda il software, gli interrupt sono eventi asincroni.

Ciò che accade è che l'hardware all'interno della CPU riconosce la richiesta di interruzione, che è un input elettrico su una linea di interruzione, e, in risposta, mette da parte la normale esecuzione di eventi per rispondere all'interruzione.Nella maggior parte delle CPU moderne, ciò che accade dopo è determinato da un handshake hardware specifico per il tipo di CPU, ma la maggior parte di esse riceve un numero di qualche tipo dal dispositivo di interruzione.Quel numero può essere 8 bit o 32 o qualsiasi altro, a seconda del design della CPU.La CPU utilizza quindi questo numero di interruzione per indicizzarsi nella tabella dei vettori di interruzione, per trovare un indirizzo per iniziare l'esecuzione della routine di servizio di interruzione.Una volta determinato l'indirizzo (e il contesto di esecuzione corrente viene salvato in modo sicuro nello stack) la CPU inizia a eseguire l'ISR.

Quando due dispositivi condividono una linea di richiesta di interruzione, possono causare l'esecuzione di ISR ​​diversi restituendo un numero di interruzione diverso durante il processo di handshake.Se si hanno a disposizione abbastanza numeri di vettore, ciascun dispositivo di interruzione può utilizzare il proprio vettore di interruzione.

Ma due dispositivi possono anche condividere una linea di richiesta di interruzione e un vettore di interruzione, a condizione che l'ISR condiviso sia abbastanza intelligente da risalire a tutte le possibili fonti dell'interruzione data e controllare i registri di stato per vedere quale dispositivo ha richiesto il servizio.

Un po' più di dettaglio

Supponiamo di avere un sistema composto da una CPU, un controller di interruzione e un dispositivo di interruzione.In passato, questi sarebbero stati dispositivi fisici separati, ma ora tutti e tre potrebbero addirittura risiedere nello stesso chip, ma tutti i segnali sono ancora presenti all'interno del case in ceramica.Utilizzerò una CPU powerPC (PPC) con un controller di interruzione integrato, collegata a un dispositivo su un bus PCI, come esempio che dovrebbe funzionare bene.

Diciamo che il dispositivo è una porta seriale che trasmette alcuni dati.Un tipico driver della porta seriale caricherà una serie di dati nel FIFO del dispositivo e la CPU potrà svolgere il lavoro regolare mentre il dispositivo fa il suo lavoro.In genere questi dispositivi possono essere configurati per generare una richiesta di interruzione quando il dispositivo sta esaurendo i dati da trasmettere, in modo che il driver del dispositivo possa tornare indietro e inserirne di più.

La logica hardware nel dispositivo si aspetta un riconoscimento dell'interruzione del bus PCI, a quel punto possono accadere un paio di cose.Alcuni dispositivi utilizzano l'"autovettorizzazione", il che significa che si affidano al controller di interruzione per verificare che venga selezionata la routine di servizio corretta.Altri avranno un registro, che il driver del dispositivo preprogrammerà, che contiene un vettore di interruzione che il dispositivo inserirà sul bus dati in risposta al riconoscimento dell'interruzione, affinché il controller dell'interruzione possa rilevarlo.

Un bus PCI ha solo quattro linee di richiesta di interruzione, quindi il nostro dispositivo seriale dovrà asserirne una.(Non importa quale al momento, di solito dipende in qualche modo dallo slot..) Il prossimo in linea è il controller degli interrupt (ad es.PIC/APIC), che deciderà se riconoscere l'interrupt in base ai bit di maschera impostati nei propri registri.Supponendo che riconosca l'interruzione, ottiene quindi il vettore dal dispositivo di interruzione (tramite le linee del bus dati) o può, se così programmato, utilizzare un valore "preimpostato" fornito dal driver del dispositivo stesso dell'APIC.Finora, la CPU è stata beatamente inconsapevole di tutto questo, ma le cose stanno per cambiare.

Ora è il momento che il controller degli interrupt attiri l'attenzione del core della CPU.La CPU avrà i propri bit della maschera di interruzione che potrebbero far sì che ignori semplicemente la richiesta del PIC.Supponendo che la CPU sia pronta a ricevere interruzioni, è ora che inizi l'azione vera e propria.L'istruzione corrente di solito deve essere ritirata prima che l'ISR possa iniziare, quindi con i processori in pipeline questo è un po' complicato, ma è sufficiente dire che ad un certo punto del flusso di istruzioni, il contesto del processore viene salvato nello stack e nell'hardware -l'ISR determinato prende il sopravvento.

Alcuni core della CPU hanno più linee di richiesta e possono avviare il processo di restringimento dell'ISR eseguito tramite la logica hardware che sposta il puntatore delle istruzioni della CPU su uno dei pochi gestori di livello superiore.Il vecchio 68K, e forse altri, lo facevano in questo modo.Il powerPC (e, credo, l'x86) hanno un singolo input per la richiesta di interruzione.L'x86 stesso si comporta un po' come un PIC e può ottenere un vettore dai PIC esterni, ma il powerPC salta semplicemente a un indirizzo fisso, 0x00000500.

Nel PPC, il codice in 0x0500 probabilmente salterà immediatamente da qualche parte nella memoria dove c'è abbastanza spazio per un codice decisionale serio, ma è pur sempre la routine del servizio di interruzione.Quella routine andrà prima al PIC e otterrà il vettore, e chiederà anche al PIC di interrompere l'asserzione della richiesta di interruzione nel core della CPU.Una volta noto il vettore, l'ISR di livello superiore può rivolgersi a un gestore più specifico che servirà tutti i dispositivi noti per utilizzare quel vettore.Il gestore specifico del vettore scorre quindi l'elenco dei dispositivi assegnati a quel vettore, controllando i bit di stato di interruzione in tali dispositivi, per vedere quali necessitano di assistenza.

Quando un dispositivo, come l'ipotetica porta seriale, viene trovato in mancanza di servizio, l'ISR per quel dispositivo intraprende le azioni appropriate, ad esempio caricando i dati del FIFO successivo da un buffer del sistema operativo nel FIFO di trasmissione della porta.Alcuni dispositivi abbandoneranno automaticamente la richiesta di interruzione in risposta all'accesso, ad esempio, la scrittura di un byte nel FIFO di trasmissione potrebbe causare la disattivazione della linea di richiesta da parte del dispositivo della porta seriale.Altri dispositivi richiederanno che uno speciale bit del registro di controllo venga attivato, impostato, cancellato, ecc., per eliminare la richiesta.Esistono milioni di dispositivi I/O diversi e nessuno di loro sembra mai farlo allo stesso modo, quindi è difficile generalizzare, ma di solito è così.

Ora, ovviamente, c'è altro da dire: che dire delle priorità di interruzione?cosa succede in un processore multi-core?Che dire dei controller di interrupt nidificati?Ma ho bruciato abbastanza spazio sul server.Spero che tutto questo aiuti.

Altri suggerimenti

Sono arrivato a questa domanda dopo 3 anni..Spero di poter aiutare ;)

L'Intel 8259A o semplicemente il "PIC" ha 8 pin, IRQ0-IRQ7, ogni pin si collega a un singolo dispositivo.

Supponiamo che tu abbia premuto un pulsante sulla tastiera..la tensione del pin IRQ1, collegato al KBD, è alta..quindi dopo che la CPU viene interrotta, conferma l'interruzione bla bla bla...il PIC aggiunge semplicemente 8 al numero della linea IRQ quindi IRQ1 significa 1+8 che significa 9

Quindi la CPU imposta CS e IP sulla nona voce nella tabella vettoriale.e poiché l'IVT è un array di long, basta moltiplicare il numero di celle per 4;)

Cpu.cs = ivt [9] .cs cpu.ip = ivt [9] .ip

L'ESR si occupa del dispositivo attraverso le porte I/O;) Scusa per il mio cattivo inglese ..però sono arabo :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top