Autor Thema: Aufbau eines nicht pollenden Keyboardtreiber (mit Shell)  (Gelesen 2084 mal)

Threadcore

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
Hallo

Ich bin momentan dran, den Keyboardtreiber zu schreiben. Ich initialisiere das Keyboard (einfach mal leeren) und hänge eine Funktion an den Keyboard-Interrupt - diese Funktion ist der eigentliche Keyboardtreiber. Nun, da das Ganze ja vom Interrupt gesteuert wird, entfällt dort ein unsauberes Pollen. Wie wird nun aber eine Shell realisiert? Die Shell sollte ja an die Eingaben des Keyboards kommen. Wie ich bei ein paar Shellansätzen gesehen habe, wird dort immer wieder geloopt, bis ein neues Zeichen im Keyquery ist. Gibt es da nicht-pollende Lösungen ?

Es geht mir nicht um den Code, sondern rein um eine theoretische Implementation. Bei meinem OS polle ich per Syscall eine Funktion im Kernel an (nicht 0x60 und 0x64, sondern eine Variable) und lese dort den Wert aus. Dieser Syscall für die Variable muss ich aber pollend realiseren (Da ich bisher Nichts besseres weiss). Genau das möchte ich verhindern.

Wäre um euer Wissen froh.
Gruss Simon
« Letzte Änderung: 21. December 2011, 13:16 von Threadcore »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 21. December 2011, 13:37 »
Nimm einen blockierenden Syscall. Unter Unix ist es beispielsweise so, dass read() in der Regel nicht aus dem Kernel zurückkehrt bevor es was gelesen hat. Innerhalb vom Kernel könnte der read-Syscall für den aktuellen Task einen Callback einrichten, der aufgerufen wird, wenn es in einer Datei was neues zu lesen gibt, und den Task bis dahin schlafen legen.

Das muss natürlich nicht genau das Interface sein, das du benutzt, aber auch wenn du z.B. einen tastaturspezifischen Syscall haben willst, kannst du den Tastaturtreiber eine Liste von Callbacks/wartenden Tasks verwalten lassen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. December 2011, 13:42 »
Sorry hab nicht richtig gelesen/nachgedacht. Für eine Shell brauchst du logischerweise jedes einzelne Zeichen sofort. Leg einfach den Task schlafen, bis ein Zeichen gelesen wurde (Interrupt), wecke den Task auf und gib das Zeichen im nächsten timeslot dann an den Task zurück (auf den stack), wie taljeth bereits sagte.
Für eine Shell kannst du dir dann auch ein Timeout sparen. Wenn du mehrere Shells offen hast, musst du halt immer die aktive auswählen.

Threadcore

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. December 2011, 16:55 »
Hallo

Ja, ich muss noch schauen, da die Shell per GRUB-Modul geladen wird, muss mich da mal etwas mehr schlauer machen, aber die Richtung/Gedanke ist mir klar.

Gruss Simon

Threadcore

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. December 2011, 18:49 »
Hallo

Die Implementation ist soweit ok (Momentan läuft testhalber noch alles im Kernel). Nun habe ich einfach noch das Problem, das gewisse Zeichen verschluckt werden.zB anstatt ich ic und auch Leerzeichen, aber die Gründe sind mir noch unklar. Hat da jemand etwas Erfahrung ?

Interrupt wird aufgerufen
IQ1 auf 33 ruft Keyboard-Funktion auf
Auslesen des scancode von 0x60
Scancode zerlegen/auswerten
Ausgeben
outb(0x20, 0x20) - EOI setzen

Schöne Weihnachten
Gruss Simon

 

Einloggen