2008-11-12 10 views
9

Podążam za kilkoma tutorialami i odnośnikami, próbującymi ustawić moje jądro. W samouczku natknąłem się na nieznany kod, który w ogóle go nie tłumaczy. Jest to kod, który mi powiedziano mapuje 16 IRQs (0-15) do ISR lokalizacje 32-47:Konfigurowanie odwzorowania IRQ

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

Kod dla outportb() jest w następujący sposób, ale mam już jasne zrozumienie tego, co jej robi:

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

I należy wspomnieć, że dotyczy to architektury x86 w trybie chronionym. Ten kod źródłowy działa dobrze i rozumiem, co robi, ale nie rozumiem, jak to działa. Czy ktoś może mi wyjaśnić, co się tutaj dzieje, więc na wypadek, gdy będę musiał to rozwinąć, będę wiedział, co robię?

Odpowiedz

12

outb i podobne, napisz do sprzętowych portów IO. Zasadniczo istnieją dwie główne opcje komunikacji z urządzeniem. Urządzenie może być odwzorowane na pamięć lub na porty IO.

chodzi o jak ten kod działa, będę komentować to dla ciebie:

WWK oznacza „inicjalizacją Komendy 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 */ 

nadzieję, że pomoże

Witamy w świecie OS dev :) Polecam również odwiedzić: http://forum.osdev.org/, jest to nieocenione źródło informacji dla nowego programisty systemu operacyjnego.

+0

Wow, dokładnie tego potrzebowałem. Dzięki kiści! –

1

Prostą odpowiedzią jest to, że w trybie chronionym przerwania używane przez 1. programowalny kontroler przerwań są wyjątkami trybu chronionego, co oznacza, że ​​muszą być ponownie zamapowane.

Szczęśliwe odpowiedź jest taka, że ​​tylko pierwsze PIC należy odwzorować (remapowanie drugiego jest tylko dla wygody, ponieważ rozpoczyna się int 70h). Oto cytat z oryginalnego BIOS-u AT.

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

Uwaga:

jmp $+2 ; wait state for i/o nie jest wymagane na obecnym komputerze.

icw1 czyści rejestr maski przerwań, który umożliwia przerywanie tego PIC.

Układ 8259A dawno już minął, ale interfejs programowania jest nadal używany. 8259A Programmable Interrupt Controller