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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top