Autor Thema: Und wieder ein Problem. Timer @ IRQ0  (Gelesen 2853 mal)

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« am: 29. November 2013, 19:31 »
Hey... mal wieder lol. Ich fühl mich als würde ich das Forum zuspamen. Sorry dafür!
Ich hab schon wieder ein Problem, das mich fuchsig macht.
Und zwar habe ich IRQs eingerichtet und remapped, damit IRQ0 nicht Double Fault aufruft.
Soweit so gut.
Dass dies geklappt hat merkt man, dass er nicht mehr 18222 mal in der Sekunde Double Fault Exception Catched (hab zur Probe mal das hlt ausgeschaltet)
Aber wenn den Timer "installiere" (also eine Handler-Funktion erstelle, die Funktion eintrage, und den so den IRQ -32 mache (ich habe die IRQs 0-15 auf IDT 32 - 47 gelegt) dann rührt sich nichts. Also der Kernel läuft wie vorher nur dass die Funktion ihren Satz nicht ausgeben mag.

Hier werden erstmal die IRQs installiert:
void irq_install()
{
void init_irq()
{
irq_remap();
set_idt_entry(32, (unsigned)irq0, 0x08, 0x8e);
set_idt_entry(33, (unsigned)irq1, 0x08, 0x8e);
set_idt_entry(34, (unsigned)irq2, 0x08, 0x8e);
    usw usw..
}

Hier geremapped
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);
}
Die dazugehörige costum Funktion
void outportb (unsigned short _port, unsigned char _data)
{
    asm volatile("outb %1, %0" : : "dN" (_port), "a" (_data));
}

Hier ist das Array und der handler_installer, der die handler in dem array ablegt
void* irq_routines[16]=
{
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
};

void irq_install_handler(int irq, void (*handler)(struct regs *r))
{
irq_routines[irq] = handler;
}
Von hier aus werden die Handler aufgerufen
void irq_handler(struct regs *r)
{
void(*handler)(struct regs *r);
handler = irq_routines[r->int_no -32];
if(handler)
{
handler(r);
}
if (r->int_no >= 40)
{
outportb(0xA0, 0x20);
}
outportb(0x20,0x20);
}


So.. Menge Zeug erstmal
Hier ist jetzt der timer_handler
und der installer
void timer_handler(struct regs *r)
{
timer_ticks++;
if(timer_ticks %18==0)
{
print("1 Second passed\n");
}
}

void init_timer()
{
irq_install_handler(0, timer_handler);
}

und nicht zu vergessen der Aufruf in der main()
init_irq();
init_timer();
asm volatile("sti");
« Letzte Änderung: 29. November 2013, 19:33 von JustJim »
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 29. November 2013, 19:43 »
Hey... mal wieder lol. Ich fühl mich als würde ich das Forum zuspamen. Sorry dafür!
Dafür ist das Forum da.

Auf dem ersten Blick seh ich da nichts verkehrtes. Deswegen musst du das für mich mal debuggen, wenn ich was dazu sagen soll. Zum Beispiel wird irq_handler überhaupt aufgerufen? Ist der Wert von r->int_no richtig? Steht in dem handler-Array der richtige Wert drin? Löst irgendwas einen GPF (o.Ä.) aus bevor die print-Funktion erreicht wird. Letzteres lässt sich zum Beispiel aus den Logs von QEMU ablesen.
Dieser Text wird unter jedem Beitrag angezeigt.

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 29. November 2013, 19:58 »
Okay es klingt zwar ziemlich dämlich. Und ich entschuldige mich im vorraus dafür.
Der Fehler bestand einfach darin, dass ich in der asm die irq's zum isr_stub jumpen lassen hab anstatt zum irq...
das ist das dumme wenn man die isrs kopiert um sich arbeit zu sparen haha.
Ein Ding ist mir bis jetzt aber immer aufgefallen.
Ich hab von RealMode BIOS-Print immernoch diesen blinkenden Positions-Unterstrich, der sich auch nicht bewegt, wenn ich im VGA-Speicher rumschreibe.
Ist zwar optisch, aber wie verschwindet der?
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 29. November 2013, 20:00 »
Du kannst ihn entweder bei der Ausgabe verschieben oder verschwinden lassen. Wie das geht, steht hier: http://www.lowlevel.eu/wiki/Textausgabe#Cursor
Dieser Text wird unter jedem Beitrag angezeigt.

JustJim

  • Beiträge: 20
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 29. November 2013, 20:26 »
Ahhhh wunderbar! Vielen Dank!  :mrgreen:
for(i=0; i<=length_of_ife; i++)
{
  learn(All);
}

 

Einloggen