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");