Impostazione del mapping IRQ
Domanda
Sto seguendo diversi tutorial e riferimenti cercando di configurare il mio kernel. Ho trovato del codice sconosciuto in un tutorial che non lo spiega affatto. È il codice che mi viene detto che mappa i 16 IRQ (0-15)
alle posizioni ISR ?? 32-47
:
void irq_remap(void)
{
outportb(0x20, 0x11);
outportb(0xA0, 0x11);
outportb(0x21, 0x20);
outportb(0xA1, 0x28);
outportb(0x21, 0x04);
outportb(0xA1, 0x02);
outportb(0x21, 0x01);
outportb(0xA1, 0x01);
outportb(0x21, 0x0);
outportb(0xA1, 0x0);
}
Il codice per outportb ()
è il seguente, ma ho già una chiara comprensione di ciò che sta facendo:
void outPortB(unsigned short port, unsigned char data)
{
__asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (data));
}
Dovrei menzionare che questo è su architettura x86 in modalità protetta. Questo codice sorgente funziona bene e capisco cosa fa, ma non capisco come lo fa. Qualcuno può spiegarmi cosa sta succedendo qui, quindi in caso avessi bisogno di approfondire questo saprò cosa sto facendo?
Soluzione
outb
e simili, scrivono su porte IO hardware. Fondamentalmente, ci sono 2 opzioni principali per comunicare con un dispositivo. È possibile associare il dispositivo alla memoria o alle porte IO.
Per quanto riguarda il funzionamento di questo codice, lo commenterò per te:
ICW è l'acronimo di " Initialization Commands Words "
outportb(0x20, 0x11); /* write ICW1 to PICM, we are gonna write commands to PICM */
outportb(0xA0, 0x11); /* write ICW1 to PICS, we are gonna write commands to PICS */
outportb(0x21, 0x20); /* remap PICM to 0x20 (32 decimal) */
outportb(0xA1, 0x28); /* remap PICS to 0x28 (40 decimal) */
outportb(0x21, 0x04); /* IRQ2 -> connection to slave */
outportb(0xA1, 0x02);
outportb(0x21, 0x01); /* write ICW4 to PICM, we are gonna write commands to PICM */
outportb(0xA1, 0x01); /* write ICW4 to PICS, we are gonna write commands to PICS */
outportb(0x21, 0x0); /* enable all IRQs on PICM */
outportb(0xA1, 0x0); /* enable all IRQs on PICS */
spero che questo aiuti
Benvenuti nel mondo degli sviluppatori di sistemi operativi :) Vi consiglio anche di visitare: http: //forum.osdev. org / , è una risorsa inestimabile per un nuovo sviluppatore di sistemi operativi per hobby.
Altri suggerimenti
La semplice risposta è che in modalità protetta gli interrupt utilizzati dal 1 ° Programmable Interrupt Controller sono eccezioni in modalità protetta, il che significa che devono essere rimappati.
La felice risposta è che solo il primo PIC
deve essere rimappato (il rimappatura del secondo è solo per comodità poiché inizia da int 70h
).
Ecco una citazione dal BIOS AT originale.
INTA00 equ 020h ; 8259 port
INTA01 equ 021h ; 8259 port
INTB00 equ 0A0h ; 2nd 8259
INTB01 equ 0A1h
INT_TYPE equ 070h ; start of 8259 interrupt table location
;---------------------------------------------------------
; re-initialize the 8259 interrupt #1 controller chip :
;---------------------------------------------------------
mov al, 11h ; icw1 - edge, master, icw4
out INTA00,al
jmp <*>2 ; wait state for i/o
mov al, 8 ; setup icw2 - int type 8 (8-f)
out INTA01, al
jmp <*>2
mov al, 4 ; setup icw3 - master lv 2
out INTA01, al
jmp <*>2
mov al, 1 ; setup icw4 - master, 8086 mode
out INTA01, al
jmp <*>2
mov al, 0FFh ; mask all ints. off
out INTA01, al ; (video routine enables interrupts)
;---------------------------------------------------------
; re-initialize the 8259 interrupt #2 controller chip :
;---------------------------------------------------------
mov al, 11h ; icw1 - edge, slave icw4
out INTB00, al
jmp <*>2
mov al, INT_TYPE ; setup icw2 - int type 70 (70-7f)
out INTB01, al
mov al, 2 ; setup icw3 - slave lv 2
jmp <*>2
out INTB01, al
jmp <*>2
mov al, 1 ; setup icw4 - 8086 mode, slave
out INTB01, al
jmp <*>2
mov al, 0FFh ; mask all ints. off
out INTB01, al
;--------------------------------------------------------------------------------
Riferimento tecnico AT BIOS (c) 1984 IBM
Nota:
Il jmp $ + 2; lo stato di attesa per i / o
non è richiesto su un PC corrente.
Il icw1
cancella il registro della maschera di interrupt, che abilita gli interrupt su quel PIC.
Il chip 8259A è sparito da tempo ma l'interfaccia di programmazione è ancora utilizzata. 8259A Programmable Interrupt Controller