Domanda

Nel manuale degli sviluppatori di software Intel si dice che i vettori di interruzione 32-255 sono generalmente definiti dall'utente per i dispositivi IO esterni.Nel mio corso di programmazione di sistemi devo sviluppare un semplice driver di dispositivo.La mia domanda è: come posso definire un vettore di interruzione specifico da utilizzare per un dispositivo specifico?Si fa con il BIOS?

Nota:stiamo sviluppando un sistema operativo semplice quindi la mia situazione è abbastanza specifica, tuttavia, alla fine devo capire come tutto ciò avviene su un sistema x86.Attualmente il nostro sistema è impostato in modo tale che alcuni vettori di interruzione superiori a 32 siano assegnati a dispositivi come una porta seriale e una tastiera.Leggendo la scheda tecnica del controller IO Intel 82801EB ICH5, in particolare la sezione relativa ai PIC 8259, si afferma che IRQ15 è il canale IDE secondario.Come verrebbe eventualmente messo in pila come vettore di interruzione?

Potrei essere così confuso che questa domanda non aveva senso, quindi mi scuso in anticipo.

MODIFICARE:Quindi la nostra classe di programmazione dei sistemi ha un sistema operativo molto semplice, che dispone di routine del kernel per l'installazione di ISR ​​per gestire interruzioni specifiche dato il numero del vettore.Nella nostra lezione dello scorso trimestre il professore ci ha fornito un file di intestazione che definiva la tastiera come numero vettoriale 0x2c o qualcosa di simile.Sto cercando di scoprire come mappare gli interrupt del canale IDE primario e/o secondario su vari ISR ​​utilizzando le nostre routine del kernel.Per ora, tutti i vettori di interruzione inutilizzati hanno un gestore predefinito che stamperebbe messaggi se si verificasse un'interruzione, quindi gli interrupt IDE non sono nemmeno attivi al momento, tuttavia questa è un'altra domanda.

È stato utile?

Soluzione 5

Bene, mi sembra di aver trovato la risposta nel nostro codice di supporto, in particolare la routine di inizializzazione PIC. Con le seguenti righe di codice IRQ sono mappati a 20h offset e 28h nella IDT per master e slave PIC, rispettivamente.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

Ciò significa che la tastiera è stato mappato al numero del vettore 2c ei canali primari e secondari sarà mappato 2e e 2f, rispettivamente. Alcuni di voi probabilmente mi avrebbe dato risposte migliori se avessi fatto la domanda migliore, ma apprezzo l'aiuto comunque!

Tabella 45 della scheda tecnica 82801EB ICH5 dettagli linee IRQ del 8259 del, e nel mio sistema operativo il master è semplicemente caricata alle 20h offset e lo schiavo è 28 nonies.

Grazie!

Altri suggerimenti

È possibile programmare i PIC (controllore di interruzione programmabile) per mappare determinati IRQ del dispositivo.

Su x86, ci sono due PIC collegati in catena che forniscono IRQ0-IRQ17.L'IRQ0-7 è gestito dall'8259 e l'IRQ8-15 da un secondo 8259.Il primo segnala la CPU ed è il master, mentre il secondo (lo slave) segnala il primo.

L'IDT (tabella descrittore degli interrupt) mappa gli interrupt sugli indirizzi ISR ​​(routine di servizio degli interrupt).Gli interrupt possono essere generati direttamente con l'istruzione INT (trap software).

Ad esempio, per aumentare l'interrupt 0x80, esegui INT 0x80.

Per gestire 0x80, mov [0x80*4], int_80_handler.Supponendo un'architettura a 32 bit, l'indirizzo del file int_80_handler la funzione è ora memorizzata nella posizione 0x80 dell'IDT.

Troverai utili questi:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

E 'stato un po' che ho affrontato con questa roba quindi questo potrebbe essere off: Ricordo che il controller PC interrupt ha 15 IRQ linee. Questi mappa per specifici x86 adiacenti vettori interrupt. Così, quando una periferica innesca una linea IRQ, il PIC interrompe la CPU e indica quale vettore per saltare, come se è stato eseguito il corrispondente istruzione INT. Alcuni IRQ sono fissi per alcune periferiche, ma credo che i dispositivi PCI negoziare con il sistema operativo per IRQ e alcune altre risorse (come fanno l'eredità dispositivi ISA PnP).

Non capisco cosa si intende per 'Come vorrei che alla fine essere messo in pila come un vettore di interruzione?'

Ci sono due modi possibili per un dispositivo per ottenere un interrupt:

  1. Utilizzare il Plug and Play o il meccanismo Pci. In tal caso il BIOS chiamerà il dispositivo periferico e chiedere i requisiti di risorse. Successivamente il driver può enumerare i dispositivi plug-and-play, la ricerca del dispositivo supportato e ottenere l'interrupt di processo dal dispositivo.

  2. Come è stato fatto nei primi giorni: Basta usare un interrupt. Aggiungere un dip-switch per il dispositivo che permette all'utente di selezionare tra i diversi interrupt. L'allocazione delle risorse è alla mano degli utenti ora. L'utente sarà inoltre passare il numero di interrupt all'autista al momento del caricamento in qualche modo.

Ora come collegare l'interrupt. Ciò dipende dal sistema operativo e la modalità x86 è in esecuzione in caso di un sistema osso nudo, nudo è possibile interrogare l'IDT (Interrupt Descriptor Table) tramite un'istruzione speciale. Una volta che avete IDT è possibile ottenere l'indirizzo e colpire l'indirizzo del gestore IRQ nello slot corretto. Per modalità reale non so come si fa più.

Se si dispone di almeno un po 'del sistema operativo in tempo reale o qualcosa con OS-like, è probabile che ci sia già una funzione del kernel che fa il lavoro duro per voi.

Come ricordo v'è una tabella vettoriale all'inizio di spazio di memoria che punta alla routine di chiamare quando si verifica un allarme specifico. I può essere colpendo ad un livello troppo basso qui (vecchio programmatore Assembly x86) ma a livello di base si ottiene il vettore installato in quella tabella allora la vostra routine viene chiamata. Io non ho nessuno dei miei vecchi materiale di riferimento con me quindi non si può dare le chiamate reali, ma sarei sorpreso se il metodo ufficiale operata al di fuori del BIOS.

In questi giorni di GUI Sono sicuro che ci sono altri metodi più appropriati, che permettono la condivisione degli interrupt e tutta quella roba buona.

EDIT: Ignora molto di quello, ho appena visto che si sta guardando interrupt 16 e al di sopra, che sono al di fuori degli interrupt hardware. Mi sono allontanata da quel livello di programmazione prima che ci fossero interessanti bit di hardware in quello spazio così sempre e solo affrontato i primi 15 IRQ (16 essendo cascata tra controllori). Sto lasciando solo nel caso che sia di interesse per chiunque altro:)

INT 21 h / AH = 25h - set vettore di interrupt; ingresso AL = numero di interrupt. DS:. DX -> nuovo gestore di interrupt

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