Interrupt-Handling
-
Also ich meine, ob es irgendwo ein gutes Beispiel für einen kleinen Tastaturtreiber gibt, der im Real-Mode läuft und wo jeder Schritt gut dokumentiert ist.
Das heißt ein Programm, das auf IRQ 1 (Tastatur) wartet und anschließend was an ein anderes Peripheriegerät zurücksendet.
-
Die begrenzte Anzahl der Eingänge, die unflexible und langsame Programmierung und vor allem die fehlende Mehrprozessorsystemunterstützung haben zur Entwicklung eines Nachfolgers, dem APIC-System, geführt. Obwohl der PIC in aktuellen Chipsätzen zwar aus Kompatibilitätsgründen noch neben dem APIC vorhanden ist, wird er von modernen Betriebssystemen nicht mehr verwendet.
im grunde läuft das aber so ab:
im programm schreibst du die adresse einer funktion, die dann aufgerufen werden soll, in die interruptvector tabelle, damit der prozessor weiß, was er dann machen soll, wie z.b. den wert aus dem register, in welches der tastencode abgelegt wird, auslesen und in einer variablen speichern.
wenn du dann auf eine taste drückst, wird ein high-signal am irq1-pin angelegt, woraufhin der interrupt controller ein high-signal am int-pin der cpu anlegt und den wert des interrupts auf den datenbus legt. die cpu beendet die momentane rechenoperation und ruft die oben erwähnte interrupt service routine auf.
wenn dich sowas interessiert: kauf dir ein msp430 launchpad.
-
@oser
Du verwirrst mich ein wenig. Einerseits verlinkst du auf einen Uralt-PIC, anderseits sprichst du von Real Mode.Könntest du mal beschreiben auf welcher Ebene wir uns befinden. Möchtest du beispielsweise wissen wie ein Tastatur-Treiber für einen aktuellen Windows- PC funktioniert? Möchtest du einen Einblick in die Windows Driver Framework erlernen?
-
@Quiche-Lorraine Mir geht es eigentlich nur darum, wie man einen eigenen (Tastatur)-Treiber schreiben würde, wenn man sein eigenes Betriebssystem erstellt, welches zunächst noch im Real-Mode läuft, ohne dabei auf die BIOS-Interrupts angewiesen zu sein.
-
@oser ja wie gesagt: interrupt vector festlegen und in der isr die daten vom einen register ins andere schreiben.
-
@oser Lies das hier, speziell den Absatz "So how do I program this stuff?":
https://wiki.osdev.org/Interrupts
-
@hustbaer
Irre ich mich oder sind Interrupts hier fraglich solange man nicht genau die Zielplatform kennt.Es könnte ja sein, dass der TE einen USB Hub an den PC anschliest und danach eine USB Tastatur an den Hub anschließt. Mit Interrupts wäre dann hier nicht gedient. Der Quellcode des Tastaturtreibers wäre dann abhängig vom dem USB Hub Treiber.
Andererseits könnte es sich um eine PS/2 Tastatur handeln. Dann könnte ich mir ein GPIO Port vorstellen könnte, welcher an dem PS/2 Port angeschlossen wäre. Ein Pin Changed Interrupt würde dann generisch auf Tastaturevents reagieren. Das gleiche gälte für spezielle Tastaturen im embedded Bereich.
Verwirrend finde ich auch den Wunsch nach Quellcode in Kombination dem zitierten uralt PIC. Man müsste, um den Wunsch des TE zu erfüllen, Code von DOS oder früher zeigen.
Daher empfehle ich für den Einstieg das Gleiche wie Wade1234. Man sollte sich ein Controller bzw. Evaluation Board kaufen und damit herumexperimentieren. Denn je hardwarenäher man programmiert, desto abhängiger wird man von der Hardware.
-
@Quiche-Lorraine das ist dann im endeffekt aber auch wieder nur
@Wade1234 sagte in Interrupt-Handling:
interrupt vector festlegen und in der isr die daten vom einen register ins andere schreiben.
@Quiche-Lorraine sagte in Interrupt-Handling:
Verwirrend finde ich auch den Wunsch nach Quellcode in Kombination dem zitierten uralt PIC. Man müsste, um den Wunsch des TE zu erfüllen, Code von DOS oder früher zeigen.
das ist eben das problem im internet: man benutzt vorbildlich die suchmaschine und stößt dann auf sachen, die seit 20 jahren gar nicht mehr angesagt sind, weil die seitenbetreiber es nicht ansatzweise für nötig halten, mal den stinkenden müll rauszubringen.
-
Naja, es ist schon gut, dass auch ältere Sachen noch da und auffindbar sind.
Ich würde mir von den Suchmaschinen (speziell Google) aber wünschen, dass sie in dem Zusammenhang den Kontext besser erkennen und neuere/aktuellere/relevantere Informationen bevorzugen. Das seh ich auch öfter, wenn ich nach irgendwelchen Bibliotheksfunktionen suche. Dann verlinken die ersten Treffer auf irgendwelche jahre alten Versionen, und ich muss die aktuelle Seite dazu selber raussuchen (zumindest bei boost gibts dafür einen eigenen Link, bei den meisten anderen nicht).
-
@Quiche-Lorraine
Sind Interrupts hier fraglich? Ja und nein. Ich weiss nicht was der OP eigentlich will. Aber er hat erstmal primär nach Interrupts gefragt und dann zusätzlich die Tastatur erwähnt.Jetzt gibt es drei Möglichkeiten:
- Er kennt sich gut genug aus um zu wissen dass er Interrupts braucht
- Er kennt sich so schlecht aus dass ihn der von mir gepostete Link ausreichend demotiviert und er es aufgibt
- Irgendwas dazwischen
Bei 1 und 2 passt der Link. Und bei 3 hat er einfach Pech gehabt. Die Frage hab ich trotzdem beantwortet. Mehr oder weniger - Beispielcode hab ich ihm keinen gegeben. Hätte ich schnell welchen gefunden, hätte ich auch das getan. Trotz der (grossen) Gefahr dass der Code auf seinen Anwendungsfall dann gar nicht passt (real mode vs. protected mode vs. USB-ohne-legacy-BIOS etc.). Wäre mir dann aber Schnuppe gewesen. Weil: er soll halt auch mal lernen richtig Fragen zu stellen.
Und gerade bei Leuten die sporadisch bis gar nicht zurückschreiben wenn man ihnen antwortet, ist mir meine Zeit zu schade als dass ich versuchen würde es aus ihm herauszufragen was er nun eigentlich will.
-
@Mechanics Ja, ich find's bei Boost Libraries immer ulkig dass Google hier grundsätzlich die Doku zu (z.T. sehr) alten Versionen als erstes listet.
-
PrettyOS verfügt über einen Keyboardtreiber: https://sourceforge.net/p/prettyos/code/HEAD/tree/trunk/Source/kernel/hid/
Dort findet man die wesentlichen Elemente in konkreter Form.
-
@Erhard-Henkes ich habe da mal eine frage. in der keyboard.c steht z.b. folgendes:
static void keyboard_updateLED(void) { outportb(0x60, 0xED); inportb(0x60); outportb(0x60, LED); inportb(0x60); }
sind die ports eigentlich irgendwie genormt oder so? woher weißt du, dass die led über 0x60 angesteuert wird?
-
@Wade1234 IBM PS/2 ... https://wiki.osdev.org/PS/2_Keyboard
-
@Swordfish also ohne das jetzt ausprobiert zu haben: ich kann auf meinem experimentierrechner mit freebsd die tastatur-led blinken lassen, indem ich /dev/port öffne und die entsprechenden werte an die entsprechenden stellen schreibe? also vorausgesetzt, das board ist "ibm-kompatibel"?
-
@Wade1234 https://stackoverflow.com/a/219154/10735411
OpenBSD machts doch selbst nicht anders: https://github.com/openbsd/src/blob/master/sys/dev/pckbc/pckbdreg.h
-
@Swordfish also ich sags mal so: ich weiß, dass ich mir unter unix diese ganze geschichte mit gerätetreibern usw. eigentlich sparen kann, indem ich direkt in die ports oder in den speicher schreibe. aber es gehörte irgendwie immer zu meinen ungelösten problemen, welche ports und welche speicheradressen das im endeffekt sind, weil mir niemand diese fragen beantworten konnte.
-
@Wade1234 sagte in Interrupt-Handling:
ich weiß, dass ich mir unter unix diese ganze geschichte mit gerätetreibern usw. eigentlich sparen kann
Im Protected Mode als User in Ring 3? Echt?
-
@Swordfish als user nicht, aber root darf ja.
-
Lol.
Was für ein Dreckssystem für ein elendiges