2008-11-12 24 views
9

Tôi đang theo một số hướng dẫn và tham khảo đang cố gắng thiết lập hạt nhân của mình. Tôi đã đi qua một số mã không quen thuộc trong một hướng dẫn mà không phải là giải thích nó cả. Đó là mã được Tôi nói với bản đồ các 16 IRQs (0-15) đến ISR địa điểm 32-47:Thiết lập ánh xạ 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); 
} 

Mã cho outportb() được như sau, nhưng tôi đã có một nắm bắt rõ ràng về những gì bạn làm nó:

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

tôi nên đề cập rằng đây là kiến ​​trúc x86 trong chế độ được bảo vệ. Mã nguồn này hoạt động tốt và tôi hiểu nó làm gì, nhưng tôi không hiểu nó làm như thế nào. Ai đó có thể giải thích cho tôi những gì đang xảy ra ở đây, để trong trường hợp tôi cần phải mở rộng về điều này tôi sẽ biết những gì tôi đang làm?

Trả lời

12

outb và tương tự, ghi vào cổng IO phần cứng. Về cơ bản, có 2 tùy chọn chính để giao tiếp với một thiết bị. Bạn có thể đặt thiết bị được ánh xạ tới bộ nhớ hoặc cổng IO.

Đối với cách mã này làm việc, tôi sẽ nhận xét nó cho bạn:

ICW viết tắt của "Khởi tạo lệnh 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 */ 

hy vọng điều này giúp

Chào mừng bạn đến với thế giới của OS dev :) Tôi cũng khuyên bạn nên truy cập: http://forum.osdev.org/, nó là một nguồn tài nguyên vô giá cho một nhà phát triển hệ điều hành sở thích mới.

+0

Ồ, đó chính xác là những gì tôi cần. Thanks bunches! –

1

Câu trả lời đơn giản là ở chế độ được bảo vệ, các ngắt được sử dụng bởi Bộ điều khiển ngắt lập trình thứ nhất là các ngoại lệ của chế độ được bảo vệ, có nghĩa là chúng phải được ánh xạ lại.

Câu trả lời là hạnh phúc mà chỉ có PIC nhu cầu đầu tiên được ánh xạ (các Remapping của thứ hai là chỉ để thuận tiện vì nó bắt đầu tại int 70h). Đây là một trích dẫn từ BIOS AT gốc.

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

tham khảo kỹ thuật AT BIOS (c) 1984 IBM

Lưu ý:

Các jmp $+2 ; wait state for i/o là không cần thiết trên máy tính hiện nay.

icw1 xóa thanh ghi mặt nạ ngắt, cho phép ngắt trên PIC đó.

Chip 8259A đã lâu rồi nhưng giao diện lập trình vẫn được sử dụng. 8259A Programmable Interrupt Controller