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?

È stato utile?

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

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