Linux Treiber Tutorial



  • Hallo,
    ich weiß nicht, ob ich in dem Forum richtig bin, im Zweifelsfall bitte einfach verschieden.

    Und zwar geht es darum, dass ich gerne die Grundlagen der Treiberprogrammierung erlernen würde, vor allem in Bezug auf Linux.

    Kennt ihr da gute Tutorials, Anleitungen oder so dazu? Die Programmierung an sich ist nicht das Problem, es geht nur um die Fähigkeit des Treiberschreibens.
    Es ist egal ob C oder C++ (da Linux wohl eher C), ASM würde ich nach Möglichkeit vermeiden, geht aber für das reine Verständnis sonst auch.
    Ob Englisch oder Deutsch ist auch egal.

    Ich finde leider nur Quellen, die auf uralten Kernelversionen basieren.
    Habt ihr da irgendwelche Tipps?

    Danke!



  • Es macht einen grossen Unterschied was für einen Treiber du schreiben willst. Also für welche Art von Gerät.



  • Ich dachte nur, dass es vermutlich auch Gemeinsamkeiten geben wird. Der grobe/typische Aufbau zum Beispiel.
    Die relevanten Ausschnitte aus der API zum Beispiel, die man kennenlernen muss.
    Aber konkreter würde ich gerne z.B. WLAN-Treiber, Grafiktreiber und Druckertreiber erstellen.
    Auch müsste ich zum Beispiel wissen, was für Informationen ich für das jeweilige Gerät brauche, um einen passenden Treiber dafür schreiben zu können. Ohne das zu wissen, kann man auch nicht vernünftig danach suchen.
    Ich habe schon einmal versucht, auf GitHub den Quellcode von einem WLAN-Treiber zu durchschauen, aber wenn man nicht genau weiß, worauf man achten muss, ist man da irgendwie recht schnell verloren.
    Es geht mir auch um den genauen Aufbau eines Treibers generell, z.B. auch unter Windows und macOS (oder ist der Aufbau komplett anders?). Fokus soll aber auf Linux liegen mit neustem Kernel (4.14)



  • Eventuell ist das was für dich:
    "Linux-Treiber entwickeln: Eine systematische Einführung in die Gerätetreiber- und Kernelprogrammierung"
    https://www.dpunkt.de/buecher/12176/9783864902888-linux-treiber-entwickeln.html

    Ich selbst habe es allerdings nicht gelesen, kann dazu also noch nichts sagen. Es ist aber auch auf meiner Einkaufsliste und ich denke, ich werde es mir eventuell noch holen.

    Ansonsten gibt es im englischsprachigen Bereich noch ein paar Bücher zu dem Thema.

    Sowie im Netz uralt, aber kostenlos:
    https://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html



  • divven schrieb:

    Aber konkreter würde ich gerne z.B. ..., Grafiktreiber ...erstellen.

    Na da wünsche ich dann schonmal viel Spaß.

    Auch müsste ich zum Beispiel wissen, was für Informationen ich für das jeweilige Gerät brauche, um einen passenden Treiber dafür schreiben zu können. Ohne das zu wissen, kann man auch nicht vernünftig danach suchen.

    Bei den typischen Peripheriegeräte und Steckkarten ist oft irgendein Chip verbaut, du musst wissen was das für einer ist und dann beim Hersteller die Databooks dazu durchlesen.
    Wenn du nichts dazu findest, wird's schwer. Es könnte auch ein FPGA oder spezieller ASIC sein zu dem es keine öffentlichen Dokus gibt.

    Auch kann es nicht Schaden zu verstehen, wie die Bus Systeme (USB, I2C, PCI, SPI usw.) und dazugehörigen Protokolle funktionieren.

    Am einfachsten wäre es wohl, wenn du erst einmal Mikrocontroller programmieren lernst. D.h. kauf dir Raspberry Pi 3 und Versuche in C die GPIOs ohne Unterstützungslibraries direkt zu programmieren.

    Manche Dinge erfordern auch Software Knowhow. Bei einem Druckertreiber dürfte schon viel KnowHow im Treiber selbst stecken.



  • Ja, diese uralte Anleitung habe ich auch schon gefunden. Aber da hat sich eben auch einiges geändert, weswegen ich mir nicht als erstes veraltetes Wissen aneignen wollte.
    Ich weiß das noch bei mir von C++, als ich mit einem Buch mit C++98 angefangen habe und erst später C++11 entdeckt habe.

    Das Buch sieht tatsächlich nicht schlecht aus, ist mir für den Preis allerdings ohne Empfehlungen zu teuer. Ich werde da sonst einmal in meinem Bekanntenkreis herumfragen, ob jemand dieses Buch kennt und mich auch einmal im Internet umsehen.
    Es gibt leider genug Jürgen-Wolfs. 😉

    Ich weiß auch, dass Grafiktreiber anspruchsvoll sind, aber irgendwie schaffen das ja auch andere Leute - die das auch einmal lernen mussten.
    Ich brauche nur Quellen, aus denen ich lernen kann.

    Dass man die Datasheets der Chips braucht, weiß ich. Aber auch darin muss man ja erst einmal wissen, wonach man suchen muss.
    Gibt es da noch irgendeine bessere Quelle außer Google? Weil darüber finde ich irgendwie kaum Datasheets zu irgendwelchen Chipsets.

    Die Bus-Protokolle sollten aber doch eigentlich allesamt vom OS erledigt werden, oder nicht? Ich werde mich aber sonst auch da einmal einlesen.
    Microcontrollerprogrammierung habe ich tatsächlich auch schon einmal angefangen. Allerdings fehlen mir da irgendwie Projekte, die auch wirklich sinnvoll sind oder mich zumindest weiterbringen.
    Allerdings habe ich bisher nur ATMega-µCs verwendet. In einer Schublade habe ich aber, glaube ich, auch noch einen Arduino-Nachbau von Elegoo (Uno heißt der meines Wissens mit einem ATMega328).
    Ein wenig habe ich damit auch schon in ASM herumprogrammiert. Aber inwiefern mich das jetzt der Treiberprogrammierung näherbringt, weiß ich noch nicht so ganz.



  • Treiberentwicklung ist ein recht komplexes Thema, alles andere als Einsteigerfreundlich. Hauptsächlich deswegen weil man dazu viele Dinge kennen/wissen muss. Speziell die von dir genannten Geräteklassen sind nicht einfach.

    Druckertreiber geht vielleicht gerade noch, je nachdem welche Qualität du erreichen willst. Einfach nur Schwarz/Weiss Grafiken auf einem Drucker ausgeben ist nicht so schwer, und der Teil der dann noch nötig ist um daraus einen Treiber zu bauen mit den dann beliebige Programme drucken können ist vermutlich noch halbwegs überschaubar. Wenn du gute Qualität bei Photodruck erreichen willst, wird es aber sehr schnell sehr aufwendig.

    Grundsätzlich stellt ein Treiber die Verbindung zwischen einem Gerät (Drucker, Grafikkarte, Netzwerkkarte) und dem OS her.

    D.h. du musst einerseits wissen wie das Gerät funktioniert, d.h. was du machen musst damit das Gerät das macht was du willst. Die meisten "Druckersprachen" (=wie die Daten aufgebaut sein müssen die du z.B. per USB an den Drucker schickst) sind relativ einfach. Bei Netzwerkkarten wird es schon wesentlich komplexer, und super-komplex wird es bei Grafikkarten.

    Andrerseits musst du dann wissen wie die Schnittstellen des OS für den jeweiligen Gerätetyp aussehen. Bei Netzwerkkarten heisst das z.B. du musst wissen wie der TCP/IP Stack des OS aufgebaut ist und wie dort alles funktioniert. Was wiederrum voraussetzt dass du weisst wie TCP/IP überhaupt funktioniert.

    Was Gemeinsamkeiten angeht, die gibt es schon. Dazu wie man grundsätzlich einen Treiber für Linux schreibt gibt es ja einige Artikel. Ja, die meisten sind für ältere Kernel-Versionen. Keine Ahnung wie viel sich da bei Linux geändert hat. Bei Windows hat sich z.B. seit Windows 2000 das grundlegende Treibermodell nicht geändert. Bei spezifischen Treibern wie Grafikkarten- oder Netzwerk-Treibern hat sich viel geändert, aber das betrifft dann nur die OS Schnittstellen mit denen diese spezifischen Gerätetypen interagieren müssen, nicht aber das Treibermodell an und für sich.

    ----

    Ich vermute dass es einfach zu viel auf einmal ist wenn du damit anfangen willst gleich einen Grafik- oder Netzwerk-Treiber zu schreiben. Als Einstieg solltest du vielleicht erstmal einen Treiber schreiben der einfach nur ein Treiber ist und nicht versucht mit einem Gerät zu interagieren. Oder du gehst es anders rum an, und versuchst als erstes mal nur dein Gerät anzusteuern, ohne dafür gleich einen Treiber zu schreiben. Bei Druckern geht das z.B. normalerweise sehr schön, da man die auch ohne Treiber einfach so aus einem normalen Programm heraus ansteuern kann - einfach Daten über die Schnittstelle an den Drucker schicken.



  • divven schrieb:

    Das Buch sieht tatsächlich nicht schlecht aus, ist mir für den Preis allerdings ohne Empfehlungen zu teuer. Ich werde da sonst einmal in meinem Bekanntenkreis herumfragen, ob jemand dieses Buch kennt und mich auch einmal im Internet umsehen.

    Auf Amazon gibt's wie üblich noch Rezensionen.

    Dass man die Datasheets der Chips braucht, weiß ich. Aber auch darin muss man ja erst einmal wissen, wonach man suchen muss.

    Du musst wissen wie man sie programmiert.
    Bedenke, zum einen kommunizierst du vielleicht nur zwischen x86 CPU und µC, wenn der µC seine eigene Software in seinem eigenen Flashspeicher hat.
    Dann müsstest du ein bisschen Klebstoff programmieren, so dass es fürs OS passt.

    Anderseits gibt's auch µC ohne eigenen Flashspeicher, bei denen müsste man jetzt extra Flashspeicher auf die Peripheriehardware verbauen, das kostet aber ein paar Cent mehr und könnte man sich eigentlich sparen, wenn man die Firmware für den µC einfach in den Treiber für den x86er steckt und zur Laufzeit lädt.
    Dann reicht es nicht mehr aus, nur Klebstoff zu programmieren, sondern dann musst du die Software für den µC selber schreiben oder als binary BLOB aus den Windowstreibern irgendwie extrahieren und eventuell noch leicht anpassen, damit es mit Linux zusammen harmoniert.

    Gibt es da noch irgendeine bessere Quelle außer Google? Weil darüber finde ich irgendwie kaum Datasheets zu irgendwelchen Chipsets.

    Der Hersteller ist immer die beste Anlaufstelle.

    Die Bus-Protokolle sollten aber doch eigentlich allesamt vom OS erledigt werden, oder nicht? Ich werde mich aber sonst auch da einmal einlesen.

    Das ist wahrscheinlich, aber wenn du den Background verstehst, dann weißt du, was du an Daten erwarten kannst.

    Ein wenig habe ich damit auch schon in ASM herumprogrammiert. Aber inwiefern mich das jetzt der Treiberprogrammierung näherbringt, weiß ich noch nicht so ganz.

    Deswegen dachte ich an den Raspi, der hat nen ARM auf dem ein Linux läuft und für die GPIO kannst du dann direkt Treiber schreiben.


Log in to reply