Danke für die Antworten bisher.
@PNoob: Das Einschalten der Interrupts kommt bei mir (wie im Tutorial) am Ende der Funktion, wo die IDT initialisiert wird.
@taljeth: Ich hab mir mittlerweile das 5. Tutorial 1 zu 1 runtergeladen um Schreibfehler etc. auszuschließen. Ich glaube eher ich hab da noch ein Verständnisproblem, wie das ganze funktioniert.
Es ist doch so, dass ich im ASM-Code für jeden Interrupt-Kanal eine Funktion definiert habe. Diese ruft dann eine gemeinsame C-Funktion auf, die das ganze dann behandelt. Anhand der Nummer, die im CPU-State mit drin steht (intr) kann die Funktion feststellen auf welchem IRQ ein Interrupt erfolgte, oder?
Warscheinlich bin ich da aber komplett auf dem Holzweg -.-
Die andere Möglichkeit wäre, dass du keinen sinnvollen Interrupthandler für die Tastatur eingerichtet hast. Wenn du dich an das Tutorial gehalten hast, ist IRQ 1 (der Tastaturinterrupt) auf 0x21 gemappt. asm volatile("int $0x21"); wäre also vielleicht auch noch einen Versuch wert.
Ist das nur zum Testen, was passiert? Meine IRQ-Handler-Funktion unterscheidet nicht nach Nummer, wie die aus dem Tutorial, sonder ich lasse mir einfach zum Interrupt alle Informationen aus dem CPU-State ausgeben. Außerdem wird die CPU angehalten (habs auch schon ohne probiert -> Keine Änderung).
Ich kann über int alle Möglichen Interrupts erzeugen, aber ich möchte die, die direkt von der Hardware (z.B. Tastatur) in mein Programm bekommen.
Was evtl auch noch hilfreich ist:
Wenn ich im "main"-Programm kein Interrupt werfe (Also nur GDT und IDT initialisiere), gibt das Programm direkt beim Start auch schon einen Interrupt 32 aus.
Hier mal die Ausgabe:
Exception 32, Kernel angehalten!
eax: 524424
ebx: 184288
ecx: 524424
edx: 1109504
esi: 184643
edi: 184648
ebp: 425644
intr: 32
error: 0
eip: 1048598
cs: 8
eflags: 518
esp: 0
ss: 10
Edit:
Meine handle_interrupt sieht jetzt folgendermaßen aus:
void handle_interrupt(struct cpu_state* cpu) {
if (cpu->intr <= 0x1f) {
kprintf("Exception %d, Prozessor angehalten!\n",cpu->intr);
while(1) {
asm volatile("cli; hlt");
}
} else if (cpu->intr >= 0x20 && cpu->intr <= 0x2f) {
kprintf("Interrupt %d\n",cpu->intr);
if (cpu->intr >= 0x28) {
outb(0xa0, 0x20);
}
outb(0x20, 0x20);
} else {
kprintf("Unbekannter Interrupt\n");
while(1) {
asm volatile("cli; hlt");
}
}
}
Ich werfe in meinem Hauptprogramm keinen Interrupt. Jetzt kommt in einer Endlosschleife in Interrupt 32 o.Ô