Autor Thema: IRQs verursachen General Protection fault  (Gelesen 4956 mal)

Billy G.

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« am: 15. August 2010, 12:15 »
Hallo miteinander,

ich schreibe seit einiger Zeit an einem kleinen Kernel.

Ich habe GDTs, IDTs und ISRs schon untergebracht, aber bei den IRQs bekomme ich immer
einen General protection fault, wegen dem

asm volatile("sti");

in main(), wie ich glaube. Aber wie kann ich diesen Fehler umgehen?

Danke für alle Antworten

Billy G.

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #1 am: 15. August 2010, 13:09 »
Hallo,

kann man deinen bisherigen Quelcode irgendwo einsehen?
Das würde uns sehr helfen

EDIT: Der Fehler wird nicht am asm("sti") liegen, sondern eher an der Verarbeitung der IRQs

LittleFox
« Letzte Änderung: 15. August 2010, 13:19 von littlefox »

Billy G.

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. August 2010, 13:21 »
Die Funktion die für das initialisieren der IRQs zuständig ist:



static void init_idt()
{
   idt_ptr.limit = sizeof(idt_entry_t) * 256 -1;
   idt_ptr.base  = (uint32_t)&idt_entries;

   memset(&idt_entries, 0, sizeof(idt_entry_t)*256);

   outb(0x20, 0x11);
     outb(0xA0, 0x11);
     outb(0x21, 0x20);
     outb(0xA1, 0x28);
     outb(0x21, 0x04);
     outb(0xA1, 0x02);
     outb(0x21, 0x01);
     outb(0xA1, 0x01);
     outb(0x21, 0x0);
     outb(0xA1, 0x0);

   asm volatile ("sti;");

   idt_set_gate( 0, (uint32_t)isr0 , 0x08, 0x8E);
   idt_set_gate( 1, (uint32_t)isr1 , 0x08, 0x8E);
   idt_set_gate( 2, (uint32_t)isr2 , 0x08, 0x8E);
   idt_set_gate( 3, (uint32_t)isr3 , 0x08, 0x8E);
   idt_set_gate( 4, (uint32_t)isr4 , 0x08, 0x8E);
   idt_set_gate( 5, (uint32_t)isr5 , 0x08, 0x8E);
   idt_set_gate( 6, (uint32_t)isr6 , 0x08, 0x8E);
   idt_set_gate( 7, (uint32_t)isr7 , 0x08, 0x8E);
   idt_set_gate( 8, (uint32_t)isr8 , 0x08, 0x8E);
   idt_set_gate( 9, (uint32_t)isr9 , 0x08, 0x8E);
   idt_set_gate( 10, (uint32_t)isr10 , 0x08, 0x8E);
   idt_set_gate( 11, (uint32_t)isr11 , 0x08, 0x8E);
   idt_set_gate( 12, (uint32_t)isr12 , 0x08, 0x8E);
   idt_set_gate( 13, (uint32_t)isr13 , 0x08, 0x8E);
   idt_set_gate( 14, (uint32_t)isr14 , 0x08, 0x8E);
   idt_set_gate( 15, (uint32_t)isr15 , 0x08, 0x8E);
   idt_set_gate( 16, (uint32_t)isr16 , 0x08, 0x8E);
   idt_set_gate( 17, (uint32_t)isr17 , 0x08, 0x8E);
   idt_set_gate( 18, (uint32_t)isr18 , 0x08, 0x8E);
   idt_set_gate( 19, (uint32_t)isr19 , 0x08, 0x8E);
   idt_set_gate( 20, (uint32_t)isr20 , 0x08, 0x8E);
   idt_set_gate( 21, (uint32_t)isr21 , 0x08, 0x8E);
   idt_set_gate( 22, (uint32_t)isr22 , 0x08, 0x8E);
   idt_set_gate( 23, (uint32_t)isr23 , 0x08, 0x8E);
   idt_set_gate( 24, (uint32_t)isr24 , 0x08, 0x8E);
   idt_set_gate( 25, (uint32_t)isr25 , 0x08, 0x8E);
   idt_set_gate( 26, (uint32_t)isr26 , 0x08, 0x8E);
   idt_set_gate( 27, (uint32_t)isr27 , 0x08, 0x8E);
   idt_set_gate( 28, (uint32_t)isr28 , 0x08, 0x8E);
   idt_set_gate( 29, (uint32_t)isr29 , 0x08, 0x8E);
   idt_set_gate( 30, (uint32_t)isr30 , 0x08, 0x8E);
   idt_set_gate( 31, (uint32_t)isr31 , 0x08, 0x8E);
   
   idt_set_gate(32, (uint32_t)irq0, 0x08, 0x8E);
   idt_set_gate(33, (uint32_t)irq1, 0x08, 0x8E);
   idt_set_gate(34, (uint32_t)irq2, 0x08, 0x8E);
   idt_set_gate(35, (uint32_t)irq3, 0x08, 0x8E);
   idt_set_gate(36, (uint32_t)irq4, 0x08, 0x8E);
   idt_set_gate(37, (uint32_t)irq5, 0x08, 0x8E);
   idt_set_gate(38, (uint32_t)irq6, 0x08, 0x8E);
   idt_set_gate(39, (uint32_t)irq7, 0x08, 0x8E);
   idt_set_gate(40, (uint32_t)irq8, 0x08, 0x8E);
   idt_set_gate(41, (uint32_t)irq9, 0x08, 0x8E);
   idt_set_gate(42, (uint32_t)irq10, 0x08, 0x8E);
   idt_set_gate(43, (uint32_t)irq11, 0x08, 0x8E);   
   idt_set_gate(44, (uint32_t)irq12, 0x08, 0x8E);   
   idt_set_gate(45, (uint32_t)irq13, 0x08, 0x8E);   
   idt_set_gate(46, (uint32_t)irq14, 0x08, 0x8E);   
 

   idt_flush((uint32_t)&idt_ptr);
}



Ziemlich lang und unübersichtlich...  :-o

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #3 am: 15. August 2010, 13:32 »
asm volatile("sti") muss nach den idt_set_gate()s kommen

EDIT: da fehlt auch noch ein IRQ (IDT 47, IRQ 15)
« Letzte Änderung: 15. August 2010, 13:58 von littlefox »

Billy G.

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 15. August 2010, 13:59 »
Das mit dem ......sti..... (wie auch immer) hab ich bereits probiert. Ging nich. :cry:


Aber der Fehlende IRQ hats gemacht.  :-D :mrgreen: :-)


Danke!!!  :lol: :lol: :lol:


PS:Werde in Zukunft besser kommentieren.


Programm Noob

  • Gast
Gespeichert
« Antwort #5 am: 15. August 2010, 15:11 »
Moin

Das sti müsste genaugenommen hinter den idt flush.
Weil dort die IDT erst geladen wird.

Programm Noob

 

Einloggen