إعداد IRQ الخرائط
سؤال
أنا بعد عدة دروس و مراجع يحاول الحصول على نواة اقامة.لقد جئت عبر بعض غير مألوف البرمجية في البرنامج التعليمي الذي ليس شرح ذلك على الإطلاق.إنه رمز أنني قلت خرائط 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 العمارة في الوضع المحمي.هذا الكود يعمل بشكل جيد وأنا أفهم ماذا يفعل, ولكن أنا لا أفهم كيف يفعل ذلك.يمكن للشخص أن يفسر لي ما يحدث هنا ، بحيث في حال كنت بحاجة إلى التوسع في هذا أعرف ماذا أفعل ؟
المحلول
و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 ديف :) أنا أيضا ننصح زيارة: HTTP: //forum.osdev. غزاله / ، فمن مصدرا قيما للمطور هواية نظام التشغيل الجديد.
نصائح أخرى
الجواب بسيط هو أنه في الوضع المحمي المقاطعات التي تستخدمها 1 للبرمجة المقاطعة تحكم محمية وضع استثناءات ، الأمر الذي يعني أنها يجب أن تكون إعادة تعيين.
سعيد الجواب هو أن الأولى فقط PIC
يحتاج إلى إعادة تعيين ( على الخارطه من الثانية فقط للراحة لأنه يبدأ في 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
;--------------------------------------------------------------------------------
المرجع التقني في السير (ج) 1984 IBM
ملاحظة:
على jmp $+2 ; wait state for i/o
غير مطلوب على الكمبيوتر الحالي.
على icw1
مسح تسجيل قناع المقاطعة التي تمكن يقطع على أن الموافقة المسبقة عن علم.
على 8259A رقاقة ذهب منذ فترة طويلة ولكن واجهة برمجة لا تزال تستخدم.8259A القابلة للبرمجة تحكم المقاطعة