2008-11-12 10 views
9

Ich befolge mehrere Tutorials und Referenzen, die versuchen, meinen Kernel einzurichten. Ich bin in einem Tutorial auf einen unbekannten Code gestoßen, der ihn nicht erklärt. Es ist Code, den ich gesagt bildet die 16 IRQs (0-15) zu ISR Standorten 32-47:Einrichten der IRQ-Zuordnung

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); 
} 

Der Code für outportb() wird wie folgt, aber ich habe bereits eine klare Vorstellung von dem, was sein Tun:

void outPortB(unsigned short port, unsigned char data) 
{ 
    __asm__ __volatile__ ("outb %1, %0" : : "dN" (port), "a" (data)); 
} 

I sollte erwähnen, dass dies auf x86-Architektur im geschützten Modus ist. Dieser Quellcode funktioniert gut und ich verstehe, was es tut, aber ich verstehe nicht, wie es funktioniert. Kann mir jemand erklären, was hier vor sich geht, damit ich im Falle, dass ich das weiter ausführen muss, wissen werde, was ich tue?

Antwort

12

outb und ähnliche, schreiben Sie auf Hardware-IO-Ports. Grundsätzlich gibt es 2 primäre Optionen für die Kommunikation mit einem Gerät. Sie können das Gerät Speicher- oder IO-Ports zuordnen lassen.

Was, wie dieser Code funktioniert, ich werde es einen Kommentar für Sie:

ICW steht für "Initialisierungskommandos 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 */ 

hoffe, das hilft

Willkommen in der Welt von OS dev :) Ich empfehle auch, dass Sie besuchen: http://forum.osdev.org/, es ist eine unschätzbare Ressource für einen neuen Hobby-OS-Entwickler.

+0

Wow, das ist genau das, was ich brauchte. Danke Trauben! –

1

Die einfache Antwort ist, dass im geschützten Modus die Interrupts, die vom 1. Programmable Interrupt Controller verwendet werden, geschützte Modus-Ausnahmen sind, was bedeutet, dass sie neu zugeordnet werden müssen.

Die glückliche Antwort ist, dass nur die ersten PIC Bedürfnisse (die Neuzuordnung der zweiten nur für Bequemlichkeit, da es bei int 70h beginnt) neu zugeordnet werden. Hier ist ein Zitat aus dem ursprünglichen AT BIOS.

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 
;-------------------------------------------------------------------------------- 

Technical Reference AT-BIOS (c) 1984 IBM

Hinweis:

Die jmp $+2 ; wait state for i/o nicht auf einem aktuellen PC erforderlich ist.

Die icw1 löscht das Interrupt-Maskenregister, das die Interrupts auf diesem PIC aktiviert.

Der 8259A-Chip ist längst weg, aber die Programmierschnittstelle wird noch verwendet. 8259A Programmable Interrupt Controller

Verwandte Themen