So ich hab die ganze Geschichte doch mit Interrupts gemacht (der Code is hauptsächlich vom Tut. hier).
Jetzt wäre es ganz cool wenn sich jemand das Anschauen könnt, also dies ist mein Interrupt-Handler und "readKeys" is auf 1 wenn ich grad in der "getc" also Einlesemethode (bleibt solange auf 1 bis Enter dabei war oder ende vom Buffer ereicht wurde) bin.
void handle_interrupt(struct cpu_state* cpu)
{
if (cpu->intr <= 0x1f) {
print("Exception %d, Kernel angehalten!");
moveCursor(0,0);
// TODO Hier den CPU-Zustand ausgeben
while(1) {
// Prozessor anhalten
asm volatile("cli; hlt");
}
} else if (cpu->intr >= 0x20 && cpu->intr <= 0x2f) {
if(cpu->intr == 33){ // Tastatur
mprintf(byteToChar(key_ins),80*13,0x07); //Nur ne Ausgabe wieviel Tastenanschläge bzw. Tastatur Interrupts es gab
moveCursor(0,0);
unsigned char flag;
unsigned char input;
flag = inb(0x64) & (0x01); //Hier ggf noch überprüfen ob flag auch wirklich gesetzt bevors weiter geht
input = inb(0x60);
new_checkKeys(flag, input); //schreibt mir in ne bitmaske welche tasten gerade gedrückt sind
if((readKeys > 0) && (input < 128))
new_getLine_int(flag, input); //ruft die methode auf welche nacheinander die Zeichen in den Buffer lädt
key_ins++;
} else
if(cpu->intr == 32){ //timer
mprintf(byteToChar(tim),80*12,0x07); //Ausgabe von Timer Interrupt Anzahl -> Zeit seit dem das programm leuft
moveCursor(0,0);
tim++; //und Variable hochzählen
}
if(readKeys > 0 ){ //--> Hier is die Frage ob man des so machen kann, also wenn readKeys auf 1 is, den Prozessor noch im Interrupt schlafen legen
outb(0x20, 0x20);// und warten bis neuer Interrupt kommt
outb(0xa0, 0x20);
asm volatile ("sti;hlt");
}
if (cpu->intr >= 0x28) {
// EOI an Slave-PIC
outb(0xa0, 0x20);
}
// EOI an Master-PIC
outb(0x20, 0x20);
} else {
print("Unbekannter Interrupt");
while(1) {
// Prozessor anhalten
asm volatile("cli; hlt");
}
}
}
So Ist das ok, Oder wird da der Stack zugemüllt da bei einem Interrupt (z.b. durch PIT) der alte Interrupt noch nicht beendet wird, also Register wieder herstellen usw. Und dann wird ja wieder auf den neuen Interrupt gewartet, der ggf. wieder nicht zu ende kommt usw.
Also seinen Sinn des polling zu vermeiden tuts schon, also cpu auslastung ist so minimal.
Wenn das so schwachsinn is, wie kann ich des anderes machen.