Wie soll ich mit dem Schreiben von Gerätetreibern beginnen? [geschlossen]

75

Ich würde gerne lernen, wie man Gerätetreiber schreibt, weil ich denke, dass es Spaß machen würde. Ich benutze ein Mac OS X Macbook, habe aber auch eine Ubuntu-Maschine (läuft auf einem Mac Min). Ich bin ziemlich vertraut mit C und lese gerade dieses Buch . Ich habe einige Links online gefunden, wie zum Beispiel Mac Dev Center . Ich mache das, weil es Spaß machen würde. Ich denke, es wäre wirklich erfreulich, wenn Hardware aufgrund der von mir geschriebenen Software funktioniert.

Ich denke, was ich möchte, sind einige Tipps oder Ratschläge und Anleitungen, und kennt jemand eine Liste von Geräten, die keine Treiber haben, oder kann ich einen Treiber für etwas schreiben, das bereits unterstützt wird (würde den ersteren bevorzugen, also bin ich eigentlich Wertschöpfung). Was ist ein gutes Gerät für den Einstieg? Beiße ich mehr ab, als ich kauen kann? Ich habe keine Angst vor einfacher Programmierung oder Montage oder vor dem Aufwand, der erforderlich ist. Ich hätte wirklich gerne eine Herausforderung!

Björn
quelle
1
Da Sie sowohl OS X als auch Linux erwähnt haben , für welches Betriebssystem sind diese Gerätetreiber gedacht?
Jschmier
Ich denke, ich würde OS X vorziehen, da dies der Laptop ist, den ich benutze.
Björn
2
"Geräte ohne Treiber ..." Ein solches Gerät wäre nicht verwendbar! Ein Gerätehersteller muss einen Treiber erstellen, sonst kann er sein Produkt nicht verkaufen. Trotzdem gibt es einige sehr, sehr einfache Geräte.
Jpaugh
eudyptula-challenge.org und github.com/agelastic/eudyptula (Readme hat die Aufgaben, schauen Sie nicht sofort auf die Lösungen;))
sjas
@jpaugh "In vielen Fällen wird ein Gerät gemäß einem veröffentlichten Hardwarestandard entwickelt. Dies bedeutet, dass der Treiber von Microsoft geschrieben werden kann und der Geräteentwickler keinen Treiber bereitstellen muss." von docs.miscrosoft.com
Elisha Habinsky

Antworten:

39

Unter Linux können Sie das Buch mit den O'Reilly Linux-Gerätetreibern lesen oder PDFs online lesen . Meiner Meinung nach ist es einer der besseren Texte zu diesem Thema.

Das Linux Kernel Module Programming Guide ist eine weitere gute Ressource.

Möglicherweise möchten Sie auch ein Buch speziell zum Linux-Kernel abholen. Zu diesem Zweck habe ich eine Kopie von Robert Loves Linux Kernel Development (2. Ausgabe) ( 3. Ausgabe unterwegs) abgeholt .

jschmier
quelle
Vielen Dank! Wie viel Arbeit kostet es, einen Gerätetreiber zu schreiben? Ist es mehr oder weniger Arbeit als das Schreiben einer großen komplexen Anwendung? Ich habe alle gefragt, die diese Frage beantwortet haben, weil ich wirklich eine Antwort möchte. Danke noch einmal!
Björn
1
Die Schwierigkeit und der Arbeitsaufwand hängen von der Komplexität des Geräts ab. Ein tty- Gerätetreiber ist möglicherweise viel weniger komplex als ein USB- oder PCI- Gerätetreiber.
Jschmier
5
Schreiben Sie zunächst ein Kernel-Modul als Treiber. Grundlegendes Hallo-Welt-Programm. und Einfügen in Ihr Ubuntu / Mac. Sehen Sie sich die Kernel-Protokolle an und verstehen Sie, was passiert. Versuchen Sie dann, einen Dummy-Treiber auf einem Bus wie (PCI oder USB) zu registrieren, und fügen Sie dann weitere Funktionen wie Lese- / Schreib- und IOCTL-Aufrufe hinzu. Schließlich können zur Implementierung komplexere Aufrufe von Power-Management-Hooks, Sleep, Shutdown übergehen. Auch wenn an Embedded, Plattformtreibern und DMA gearbeitet werden kann, ist dies eine interessante Lektüre.
Anirudh
32

Das Schreiben eines Gerätetreibers kann ziemlich einfach oder fast willkürlich kompliziert sein. Zum Beispiel war ich an einem Projekt beteiligt, bei dem sechs von uns fast drei Jahre gebraucht haben, um EINEN Fehler in einem Gerätetreiber zu beheben. Natürlich haben wir Dutzende anderer Fehler behoben, während wir danach gesucht haben ... der Code hat sich immens verbessert. Es stellte sich heraus, dass es sich bei dem Fix um einen Patch mit acht Zeilen handelte, der konservativ etwa eine Million Dollar kostete.

Aber als Nebenprojekt dazu schrieb ich in einer Woche einen Ethernet-Treiber aus dem Chip-Datenblatt und brauchte eine weitere Woche, um ihn zu debuggen. Ich musste es seitdem nicht mehr anfassen.

Es gibt im Allgemeinen keine Möglichkeit zu sagen, wie viel Arbeit ein Fahrer leisten wird. Ein GPU-Treiber kann Hunderte von Millionen kosten, ein Treiber für eine einzelne LED kostet höchstens ein paar Stunden Arbeit.

Andrew McGregor
quelle
10
Können Sie uns weitere Details mitteilen? Würde gerne den Patch verstehen und warum es so schwer zu debuggen war. Von welcher Geräteklasse war der Fahrer?
Anirudh
6

Wenn Sie sich für die Entwicklung von Linux-Gerätetreibern entscheiden möchten, ist das frei verfügbare O'Reilly-Buch Linux Device Drivers, Third Edition ein Muss.

Fragen Sie in den Linux-Mailinglisten nach nicht unterstützten Hardwareteilen, für die Sie einen Treiber schreiben können . Vielleicht ein USB 3.0-Gerät? ;)

AndiDog
quelle
Vielen Dank! Wie viel Arbeit kostet es, einen Gerätetreiber zu schreiben? Ist es mehr oder weniger Arbeit als das Schreiben einer großen komplexen Anwendung?
Björn
2

Für Mac sollten Sie sich das Buch Mac OS X Internals ansehen . Es ist nachdenklich und schwer, aber es macht Spaß zu lesen. Es handelt sich hauptsächlich um PowerPC-basierte Macs, es gibt jedoch einen Anhang zu Intel-basierten Macs. Für Linux werfen Sie einen Blick auf Linux Device Drivers, 3rd Edition - es ist leichter (kostenlose PDFs online :) und wirklich gerätetreiberorientiert, könnte ein besserer Start sein.

Nikolai Fetissov
quelle
Vielen Dank! Wie viel Arbeit kostet es, einen Gerätetreiber zu schreiben? Ist es mehr oder weniger Arbeit als das Schreiben einer großen komplexen Anwendung?
Björn
2
Hmm, in beiden Fällen müssen Sie wissen, was Sie tun, also müssen Sie die Umgebung verstehen, und das kommt aus der Erfahrung, die Sie erst erhalten, wenn Sie es versuchen :) Arbeiten Sie einige Beispiele aus LDDv3, dem Quellcode, durch ist online, aber für aktuelle Kernel etwas veraltet. Sie erhalten ein Gefühl dafür, worum es geht und was Sie als Nächstes lernen möchten.
Nikolai