Autor Thema: Treiber aus dem Kernel laden  (Gelesen 7814 mal)

Fawkes

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« am: 18. March 2004, 00:07 »
Guten Abend alle miteinander.

Ich programmiere also auch an einem BS (wie sollte es anders sein)
und möchte nun, nachdem ich Bootloader und Kernel habe, einen Treiber
für die Tastatur schreiben (in Assembler). Wie ich den Treiber schreibe
hab ich mir erlesen, dazu jedoch noch eine Frage: Ist es besser die BIOS
Interrupts (16h) zu benutzen oder über den Port 60h zu gehen, vor allem in
Bezug auf den später angestrebten PMode?
So nun aber eigentlich zum Hauptproblem. Der Treiber muss ja geladen
werden, wahrscheinlich aus dem Kernel heraus. Wie stelle ich das an?
Denn er soll ja permanent im Hintergrund laufen und nicht die anderen
Programme stören.

Danke schon mal im voraus :)
Wer Rechtschreibfehler findet, darf sie behalten.

Lizer

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. March 2004, 13:25 »
Um den Treiber zu laden, brauchst du erstmal ein Dateisystem. Ich würde aber sowieso empfehlen, das Teil direkt in den Kernel zu schreiben. Wenn du PMode machen willst, auf jeden Fall Port 60. Wenn dann jemand eine Taste drückt, wird ein Interrupt ausgelöst. Den musst du vorher mit einer Routine verbinden (IDT) die die Taste dann von Port 60 & 64 ausliest. Muss also nix "im Hintergrund laufen".

In RM brauchswt nicht wirklich 'n Treiber, es reicht wenn du 'ne Routine zur Verfügung stellst (getch), die per int 16 ah = 0 'ne Taste ausliest und den Wert zurückliefert. Dass int 16 ah 0 blockiert ist wurst oder sogar wünschenswert, da Multitasking im RMode eh nicht geht und daher keine anderen Prozesse durch das Warten auf die Taste behindert werden. Auf getch kannste dann alle anderen Funktionen aufbauen.

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. March 2004, 16:40 »
Wenn Du ihn laden willst, solltest Du ihm nen eigenen Stack geben.
Das heißt oberhalb des bp vom Kernel hinkopieren und dann dort nen Stack bauene. Aber dann bist Du halt eigentlich schon bei Multitasking.

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #3 am: 18. March 2004, 21:51 »
Wie Lizer schon sagte.

Du baust den Code einfach in deinen Kernel und legst in der IDT für den Keyboardinterrupt ein Call-Gate an, das zu diesem Code der den Port 60 ausliest springt.

Dann läuft dein Code praktisch gesehen im "Hintergrund".
----------------------
Redakteur bei LowLevel

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #4 am: 18. March 2004, 23:12 »
Also eigentlich hat es Lizer schon gesagt unter RM braucht man sich nich die Arbeit zu machen einen Treiber zu schreiben der vom BIOS reicht da. Bios Interrupts sind nur halt meistens langsamer als Treiber, aber da der RM ja eh nicht durch Effizienz glänzt is das eigentlich egal. Außerdem dürfte nen Tastatur Treiber Perfomance mässig sowieso nich so ins gewicht fallen. Im PM is das anders da musst du über Ports programmieren weil der Speicherbereich in dem Das BIOS seine Interrupthandler ablegt sowieso überschrieben wird.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Fawkes

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 20. March 2004, 13:00 »
Um jetzt nicht noch einen Thread aufzumachen, weil das Problem nicht wirklich so gravierend sein sollte, schreib ich es mal anschließend hier her.

Und zwar versuch ich jetzt den Tastatutreiber über den Port 60h zu schreiben, funktioniert auch alles, nur schreibt mir der Rechner gleich zig Zeilen mit dem Zeichen voll. Ich hab da was von einem IRQ-Handler gehört, könnte mir da mal jemand weiterhelfen, vielleicht mit ner Internetseite oder so. Englisch oder Deutsch, ist egal.

Danke
Wer Rechtschreibfehler findet, darf sie behalten.

Lizer

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 20. March 2004, 22:20 »
Haste dran gedacht, 0x20 an Port 0x20 zu schicken, um den IRQ zu bestätigen? Wenn'de das nicht machst, denkt der PC, du hast den IRQ nicht gekriegt und schickt ihn nochmal.

 

Einloggen