Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - matt1491

Seiten: [1]
1
So jetz gehts endlich.

Die Lösung:
Das EOI-Signal wurde nicht am Ende meiner keyboard_handler-Routine aufgerufen. Bin danach einfach aus dem interrupt_handler herausgesprungen.

Jetzt bekomme ich alle Interrupts und meine Abfrage der Tastatur funktioniert auch. Jetzt mach ich mal an die Keycode Tabelle.

Danke an alle, die mir geholfen haben. Echt top Forum ;)
2
Also eingeschaltet habe ich noch nix.

Ich bin aber jetzt (vom Verständnis her) so weit, dass ich weiß, dass ich was auf 0x60 senden muss.
Nur was muss ich da senden?

Also wenn ich auf 0xFF auf 0x60 sende (also einen Reset der Tastatur auslöse), antwortet die Tastatur mit 0xFA (Acknowledge) auf 0x60. Scheint also schonmal soweit zu funktionieren.

--------
Edit: Hab gerade gelesen, dass die Tastatur beim Reset die LEDs an und abschaltet. Dies tut mein (PS/2) Tastatur NICHT. Bedeutet das, dass es nicht funktioniert?
--------

Die Werte habe ich von http://www.marjorie.de/ps2/ps2_keyboard.htm

Mein nächster Schritt war jetzt eine Funktion handle_keyboard aufzurufen, sobald ein Interrupt auf 0x21 (IRQ 1) gesendet wird. In dieser Funktion lese ich, was auf 0x60 anliegt. Ich dachte eigentlich, dass da jetzt der Code der gedrückten Taste drinsteht (bzw. irgendwas, wie ich da dann hinkomme).

Irgend ein Schritt fehlt mir noch und ich komm einfach nicht drauf.
3
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.Ô
4
Hallo,
und zwar beschäftige ich mich schon länger mit der Entwicklung eines Betriebssystems. Hab aber nie den richtigen Einstieg geschafft.

Nun habe ich mal damit angefangen und stecke gerade bei der bearbeitung der Interrupts.
Mein Code sieht ziemlich so aus, wie der Beispielcode im Teil 5 des Tutorials.

Wenn ich selber Interrupts erzeuge (asm volatile("int $0x0");), dann wird dieser auch angezeigt.
Nur ich stehe auf dem Schlauch, wie ich die Interrupts der Hardware (z.B. Tastatur) in mein Programm kriege.

Und noch ne kleine Verständnisfrage am Rande:
In dem C-Code wird die Funktion intr_stub_0 aufgerufen (also sie wird an die Funktion idt_set_entry übergeben). Woher weiß der C-Compiler jetzt, dass dadurch das Assembler-Makro intr_stub mit dem Parameter 0 aufgerufen werden muss? Blick da irgendwie nicht durch.

Hoffe mir kann jemand helfen.
Danke ;)
Seiten: [1]

Einloggen