2008-11-12 11 views
9

커널 튜토리얼을 참조하고 커널을 설정하려고합니다. 나는 그것을 전혀 설명하지 않는 튜토리얼에서 익숙하지 않은 코드를 발견했다. 그것은 내가 말한거야 코드 매핑 년대 16 IRQs (0-15)32-47 위치 ISR에 :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); 
} 

outportb()에 대한 코드는 다음과 같다,하지만 난 이미 어떻게 그 일을 분명히 이해 있습니다

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

I을 이것은 보호 모드에서 x86 아키텍처에 있음을 언급해야합니다. 이 소스 코드는 정상적으로 작동하고 그것이하는 일을 이해하지만 어떻게하는지 이해하지 못합니다. 누군가가 나에게 여기에서 일어나는 일을 설명 할 수 있나요? 그래서 내가 이것을 확장해야 할 경우에 대비해서 내가하고있는 일을 알 수 있습니까?

답변

12

outb 및 그와 유사한 하드웨어 IO 포트에 쓰기. 기본적으로 장치와 통신하기위한 2 가지 기본 옵션이 있습니다. 장치를 메모리 또는 IO 포트에 매핑 할 수 있습니다.

이 코드가 어떻게 작동하는지에 관해서는, 나는 당신을 위해 그것을 언급합니다 :

ICW는 "초기화 명령 단어"

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 */ 

희망이의 세계에

에 오신 것을 환영합니다 도움을 의미합니다 OS dev :) 나는 또한 당신이 방문하는 것이 좋습니다 : http://forum.osdev.org/, 그것은 새로운 취미 OS 개발자를위한 귀중한 자원입니다.

+0

와우, 그게 내가 필요한 것입니다. 고마워요! –

1

간단히 대답하면 보호 모드에서 첫 번째 프로그램 가능 인터럽트 컨트롤러가 사용하는 인터럽트는 보호 모드 예외이므로 다시 매핑해야한다는 의미입니다.

행복한 대답 첫 번째 PIC 요구 (이 int 70h에서 시작 이후 두 번째의 매핑은 편의를위한) 매핑 할 수 있다는 점이다. 다음은 원래 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 
;-------------------------------------------------------------------------------- 

기술 참조 AT BIOS (c) 1984 IBM

참고

jmp $+2 ; wait state for i/o는 현재 PC에 요구되지 않는다.

icw1은 해당 PIC의 인터럽트를 활성화하는 인터럽트 마스크 레지스터를 지 웁니다.

8259A 칩은 오래되었지만 프로그래밍 인터페이스는 여전히 사용됩니다. 8259A Programmable Interrupt Controller