Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 26. December 2005, 11:46
-
Hi,
also ich schreibe mir ja ein OS im PM. Jetzt wollte ich mal fragen wie das eigentlich so mit Treiber aus sieht. Bis jetzt habe ich z.B. den Tastaturtreiber im Kernel laufen. Aber das sind dann ja noch keine richtigen Treiber einbindungen. Die Treiber müssen ja im Ring Null laufen, nicht wahr? Aber wie genau geht das mit einer Treiber einbindung? Ich meine so wie z.B. bei Windows. Hardwarehersteller schreiben Treiber die in Windows eingebunden werden können. Aber wie genau geht so etwas überhaubt? Der Ring 0 erlaubt ja alles. Aber dann könnte man ja einfach einen schädlichen Code im Treiber schreiben und dadurch das ganze OS zum abstürtzen bringen. Also muss man doch irgendwie bestimmen dürfen was nicht gemacht werden darf. Ich wollte nur mal fragen wie das z.B. aussehen kann mit Treibereinbindungen.
Danke!!!
-
hi,
man kann Treiber sehr wohl auch in Ring3 laufen lassen, syscalls und I/O Permission Bitmap bzw. IOPL machens möglich. Wenn Treiber im Ring0 laufen können sie natürlich schadhaften Code enthalten, deshalb gibts bei Windows ja mitlerweile für "gute" Treiber Zertifikate.
"Also muss man doch irgendwie bestimmen dürfen was nicht gemacht werden darf" Das geht nicht wenn eine Anwendung in Ring0 läuft, es sei den du benutzt eine "sichere" Interpretsprache, welche nur indirekt die Möglichkeit eröffnet I/O mit Hardware zu machen, etc. Da solltest mal mit Legend oder Gohan reden, die wissen bestimmt mehr ;)
Wenn du den Linux Weg gehen willst dann erstellste innerhalb des Kernels ein en FS Treiber (devfs), bei dem sich die Treiber "registrieren", d.h. eine Datei erstellen (zB /dev/keyboard). Wenn jetzt eine Anwendung auf die Tastatur zugreifen will, dann öffnet sie die Datei /dev/keyboard und liest die Daten aus. Wenn eine Anwendung den Treiber konfigurieren will benutzt sie halt ioctl(). In Linux laufen auch alle Treiber in Ring0.
Über Windows hab ich leider keine/wenige Informationen: Ich glaub die verwenden intern auch so eine Art Dateisystem mit Treibern.
Hoffe ich konnte helfen :!:
-
Das ist momentan eines der Größten Probleme von Betriebssystemen! Kein "großes" OS hat eine komplette abschottung der Treiber da dieses zu viel Geschwindigkeit kostet. Wenn Treiber scheiße bauen hat man Pech gehabt. Man solte also nicht jeden "Treiber" installieren den man im INet feindet.
Wie du das in dienem OS realisierst bleibt dir vorbahalten.
-
kleine Ergänzung: Ich halte es für den Aufwand nicht Wert Treiber im Ring3 laufen zu lassen. Ich habs in meinem letzten OS versucht, werd aber jetzt dann neu anfangen und des mit Sicherheit anders machen. Wie steht in den *en.
-
Danke. Jetzt habe ich noch eine ganz andere Frage. Ich wollte dafür kein neues Thema auf machen. Mein Betriebssystem untersützt ja Multitasking. Mit cli und sti kann ich interrupts sperren und wieder zu lassen. Aber der IRQ0 (Interrupt) sorgt ja für den Task-Switch. Dann könnte ein Programm ja einfach cli ausführen und damit das ganze Multitasking stoppen. Oder funktionieren die Befehle nur im Kernelmodus? Aber wenn treiber im Kernelmodus laufen können die dann ja immer noch alles stoppen. Hhmm...
Danke!!!
-
Hallo,
Ich werde meine Treiber wie normale Tasks behandeln und in Ring3 laufen lassen. Grundlegende Geräte wie DMA/FDD/HDD werden von nativen Kerneltreibern übernommen, die in Ring0 laufen.
Außerdem überlege ich, Schnittstellentreiber (COM/...) ebenso nativ im Kernel einzubauen und auf Ring0 laufen zu lassen. Neue Treiber, beispielsweise für Drucker, müssten dann nichtmehr direkt die Ports ansprechen (was sie auch nicht können), sondern nurnoch mit den Schnittstellen-Treibern arbeiten, genauso wie FS-Treiber mit den nativen Medientreibern (FDD/HDD/...) laufen.
Sollte trotzdem ein Gerät/Treiber direkt über einen Port kommunizieren, so muss dies über die API und den Kernel abgehandelt werden, wobei ich auch dort Mechanismen einbauen will, die das Übertragen vereinfachen.
Gruß,
Joachim
-
Danke. Jetzt habe ich noch eine ganz andere Frage. Ich wollte dafür kein neues Thema auf machen. Mein Betriebssystem untersützt ja Multitasking. Mit cli und sti kann ich interrupts sperren und wieder zu lassen. Aber der IRQ0 (Interrupt) sorgt ja für den Task-Switch. Dann könnte ein Programm ja einfach cli ausführen und damit das ganze Multitasking stoppen. Oder funktionieren die Befehle nur im Kernelmodus? Aber wenn treiber im Kernelmodus laufen können die dann ja immer noch alles stoppen. Hhmm...
Danke!!!
cli/sti funktioniert nur mit cpl0. Gibt ein General Protection Fault (Int 13) mit cpl1/2/3.