Einrichten von IRQ-Mapping
Frage
Ich folge mehrere Tutorials und Referenzen versucht, meinen Kernel einrichten lassen. Ich habe über einige unbekannten Code in einem Tutorial kommen, der nicht es überhaupt zu erklären. Es ist Code, der mir gesagt bildet die 16 IRQs (0-15)
zu ISR Standorte 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);
}
Der Code für outportb()
ist 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));
}
Ich sollte erwähnen, dass diese auf der x86-Architektur im geschützten Modus ist. Dieser Quellcode funktioniert gut, und ich verstehe, was es tut, aber ich verstehe nicht, wie sie es tut. Kann mir jemand erklären, was hier los, so dass im Fall, dass ich auf diese zu erweitern brauchen werde ich wissen, was ich tue?
Lösung
outb
und ähnliche, schreiben Sie an Hardware-IO-Ports. Grundsätzlich gibt es zwei Hauptoptionen für die mit einer Vorrichtung in Verbindung steht. Sie können das Gerät in den Speicher oder IO-Ports zugeordnet haben.
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 unter: http: //forum.osdev. org / ist es eine unschätzbare Ressource für einen neuen Hobby OS Entwickler.
Andere Tipps
Die einfache Antwort ist, dass im geschützten Modus die von dem ersten Programmable Interrupt Controller verwendete Interrupts Modus Ausnahmen geschützt sind, was bedeutet, dass sie neu zugeordnet werden müssen.
Die glückliche Antwort ist, dass nur die erste PIC
neu zugeordnet werden muss (die Neuzuordnung der zweiten nur für Bequemlichkeit, da es bei int 70h
beginnt).
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
;--------------------------------------------------------------------------------
Technische Referenz AT-BIOS (c) 1984 IBM
Hinweis:
Die jmp $+2 ; wait state for i/o
nicht auf einem aktuellen PC erforderlich ist.
Die icw1
löschen die Interrupt-Maskenregister, die die Interrupts auf dieser PIC ermöglicht.
Der 8259A-Chip ist längst verschwunden, aber die Programmierschnittstelle wird immer noch benutzt. 8259A Programmable Interrupt Controller