Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Billy G. am 15. August 2010, 12:15

Titel: IRQs verursachen General Protection fault
Beitrag von: Billy G. 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.
Titel: Re:IRQs verursachen General Protection fault
Beitrag von: LittleFox 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
Titel: Re:IRQs verursachen General Protection fault
Beitrag von: Billy G. 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
Titel: Re:IRQs verursachen General Protection fault
Beitrag von: LittleFox 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)
Titel: Re:IRQs verursachen General Protection fault
Beitrag von: Billy G. 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.

Titel: Re:IRQs verursachen General Protection fault
Beitrag von: Programm Noob 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