Sulla mainbord abbiamo un controllore di interruzioni (IRC) che agisce come un multiplexer tra i dispositivi in grado di generare un interrupt e la CPU:Interrupt movimentazione (Linux/Generale)
|--------|
|-----------| | |
-(0)------| IRC _____|______| CPU |
-(...)----| ____/ | | |
-(15)-----|/ | |--------|
|-----------|
Ogni dispositivo è associato un IRQ (il numero a sinistra). Dopo ogni esecuzione, la CPU rileva la linea di richiesta di interruzione. Se viene rilevato un segnale, verrà eseguito un salvataggio di stato e la CPU carica una routine di gestione degli interrupt che può essere trovata nel vettore di interrupt che si trova su un indirizzo fisso in memoria. Per quanto posso vedere il numero dell'IRQ e il numero di vettore nel vettore di interruzione non sono gli stessi perché ho per esempio la mia scheda di rete registrata su IRQ 8. Su un processore Intel Pentium questo indicherebbe una routine usata per segnalare una condizione di errore, quindi ci deve essere una mappatura da qualche parte che punta al gestore corretto.
Domande:
1) Se scrivo un driver di periferica e registrano un IRQ X per esso. Da dove viene il sistema a sapere quale dispositivo deve essere gestito? Ad esempio, posso usare request_irq() con IRQ numero 10 ma come fa il sistema a sapere che il gestore deve essere usato per il mouse o la tastiera o per qualsiasi cosa scriva il driver?
2) Come appare allora il Vettore Interrupt? Voglio dire se uso l'IRQ 10 per il mio dispositivo questo sovrascriverebbe un gestore standard che è per la gestione degli errori nella tabella (il primo utilizzabile è 32 secondo Silberschatz (Operating System Concepts)).
3) Chi stabilisce gli IRQ in modo iniziale? Il Bios? Il sistema operativo?
4) Chi è responsabile per la corrispondenza dell'IRQ e dell'offset nel vettore di interrupt?
5) È possibile condividere IRQS. Come è possibile? Ci sono delle corsie hardware sulla scheda madre che collegano i dispositivi al controller di interrupt. Come possono essere configurate le corsie per lo stesso interrupt? Ci deve essere una tabella in cui la corsia 2 e 3 gestiscono IRQ15, ad es. Dove risiede questo tavolo e come si chiama?
Una spiegazione più dettagliata sulla configurazione di interruzione, la manipolazione e la mappatura può essere trovato qui: [Un codice passeggiata all'interno quadro kernel interrupt] (http://linuxburps.blogspot.in/2013/10/linux-interrupt- handling.html) –