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:
Hier geremapped
Hier ist das Array und der handler_installer, der die handler in dem array ablegt
So.. Menge Zeug erstmal
Hier ist jetzt der timer_handler
und der installer
und nicht zu vergessen der Aufruf in der main()
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:
Code: [Auswählen]
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
Code: [Auswählen]
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 FunktionCode: [Auswählen]
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
Code: [Auswählen]
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 aufgerufenCode: [Auswählen]
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
Code: [Auswählen]
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()
Code: [Auswählen]
init_irq();
init_timer();
asm volatile("sti");

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert
