2008-11-12 18 views
9

सेट अप करना मैं अपने कर्नेल सेट अप करने की कोशिश कर रहे कई ट्यूटोरियल और संदर्भों का पालन कर रहा हूं। मैं एक ऐसे ट्यूटोरियल में कुछ अपरिचित कोड में आया हूं जो इसे समझा नहीं रहा है। यह कोड सीधे मुझे बताया गया हूँ नक्शे है 16 IRQs (0-15) ISR करने के लिए स्थानों 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); 
} 

outportb() के लिए कोड इस प्रकार है, लेकिन मैं पहले से ही क्या अपने कर का एक स्पष्ट समझ है:

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

मैं उल्लेख करना चाहिए कि यह सुरक्षित मोड में x86 आर्किटेक्चर पर है। यह स्रोत कोड ठीक काम करता है और मैं समझता हूं कि यह क्या करता है, लेकिन मुझे नहीं पता कि यह कैसे करता है। क्या कोई मुझे बता सकता है कि यहां क्या हो रहा है, ताकि अगर मुझे इस पर विस्तार करने की ज़रूरत है तो मुझे पता चलेगा कि मैं क्या कर रहा हूं?

उत्तर

12

outb और इसी तरह, हार्डवेयर आईओ बंदरगाहों को लिखें। असल में, डिवाइस के साथ संचार करने के लिए 2 प्राथमिक विकल्प हैं। आप डिवाइस मेमोरी या आईओ बंदरगाहों के लिए मैप किया जा सकता है।

कैसे इस कोड काम करता है के रूप में, मैं आप के लिए यह टिप्पणी करेंगे:

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

आशा है कि यह मदद करता है की दुनिया के लिए

में आपका स्वागत है खड़ा है ओएस देव :) मैं यह भी सिफारिश करता हूं कि आप यहां जाएं: http://forum.osdev.org/, यह एक नए शौक ओएस डेवलपर के लिए एक अमूल्य संसाधन है।

+0

वाह, यह वही है जो मुझे चाहिए। धन्यवाद बंच! –

1

सरल उत्तर यह है कि संरक्षित मोड में पहले प्रोग्राममेबल इंटरप्ट कंट्रोलर द्वारा उपयोग किए जाने वाले इंटरप्ट्स संरक्षित मोड अपवाद हैं, जिसका अर्थ है कि उन्हें रीमेप किया जाना है।

खुश जवाब यह है कि पुनः मानचित्रित किए जाने की केवल पहली PIC जरूरतों (दूसरे के remapping केवल सुविधा के लिए है, क्योंकि यह int 70h में शुरू होता है) है। यहां मूल एटी 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 
;-------------------------------------------------------------------------------- 

तकनीकी संदर्भ एटी BIOS (ग) 1984 आईबीएम

नोट:

jmp $+2 ; wait state for i/o एक मौजूदा पीसी पर की आवश्यकता नहीं है।

icw1 इंटरप्ट मास्क रजिस्टर को साफ़ करता है, जो उस पीआईसी पर बाधाओं को सक्षम बनाता है।

825 9ए चिप लंबे समय से चला गया है लेकिन प्रोग्रामिंग इंटरफ़ेस अभी भी उपयोग किया जाता है। 8259A Programmable Interrupt Controller

संबंधित मुद्दे