Der beste Weg, um in die Kernel-Programmierung einzusteigen?

8

Nicht so sehr nach den Büchern fragen (obwohl, wenn Sie Anleitungen / Tutorials kennen, die hilfreich wären), aber wie kann man am besten mit der Kernel-Programmierung beginnen, und gibt es eine bestimmte Distribution, die am besten zu erlernen ist?

Ich interessiere mich hauptsächlich für den Teil "Gerätetreiber", aber ich möchte auch erfahren, wie der Kernel eingerichtet ist (Module und dergleichen). Ich habe ungefähr 4-5 Jahre Erfahrung mit C / C ++, aber es sind hauptsächlich Kenntnisse vom College (so ist es) nicht wie 4-5 Jahre Berufserfahrung, wenn Sie wissen, was ich meine)

Jeff Schaller
quelle
4
Zunächst ist es Kernel mit einem e geschrieben.
Caleb
Ja, ich habe das bemerkt, als ich die Tags anbrachte lol.
4
Nehmen Sie sich das nächste Mal Zeit, um das Problem zu beheben. Es ist eine gute Möglichkeit, die Community hier zu respektieren, die sich die Zeit nimmt, Ihnen zu helfen. Auch wenn Sie für den Kernel codieren möchten, müssen Sie bei solchen Details streng sein!
Caleb
@Caleb, wird tun!
Vielen Dank für diese Frage, ich habe mich immer gefragt
Mike Pennington

Antworten:

11

Zuerst:

Für die Baby-Phasen ist das Schreiben verschiedener Variationen von "Hallo Welt" -Modulen und virtuellen Hardwaretreibern der beste Einstieg (echte Hardware führt zu Problemen der realen Welt, die am besten auftreten, wenn Sie mehr Ahnung haben, was Sie tun).

"Linux Device Drivers" ist ein ausgezeichnetes Buch und es lohnt sich, damit zu beginnen: http://lwn.net/Kernel/LDD3/

LDD (zumindest früher) enthält Übungen, in denen Sie virtuelle Treiber geschrieben haben, z. B. RAM-Festplatten und virtuelle Netzwerkgeräte.

Zweitens:

Abonnieren Sie https://lkml.org/ oder die Mailingliste eines Subsystems, in das Sie sich hacken werden. Lauern Sie ein bisschen, scannen Sie Threads, lesen Sie die Codeüberprüfung (Antworten auf Patches), um zu sehen, welche Art von Dingen Menschen haben stolpern oder abholen.

Prüfen Sie, ob Sie (billige) Hardware für ein Gerät erhalten können, das noch nicht oder noch nicht gut unterstützt wird. Gute Kandidaten sind billige USB-Netzwerkkarten oder ähnliche, kostengünstige USB-Peripheriegeräte. Etwas mit einem veralteten oder veralteten Treiber, der möglicherweise vom Hersteller geschrieben wurde, möglicherweise für 2.4.x, ist ideal, da Sie mit etwas beginnen können, das funktioniert (irgendwie), und es schrittweise anpassen / neu schreiben können es, testen, wie Sie gehen. Mein erster Treiberversuch war für eine Davicom DM9601 USB-Netzwerkkarte. Es gab einen vom Hersteller geschriebenen Kerneltreiber der 2.4-Serie, den ich langsam an 2.6 anpasste. (Hinweis: Der Treiber in der Hauptzeile ist nicht mein Treiber, am Ende hat jemand anderes einen von Grund auf neu geschrieben).

Ein weiterer guter Weg ist ein Blick auf die Kernel Newbies-Site, insbesondere auf die Aufgaben der "Kernel-Hausmeister": http://kernelnewbies.org/KernelJanitors/Todo Dies ist eine Liste von Aufgaben, die ein Anfänger bewältigen sollte.

jmtd
quelle
4
Gute Antwort für Linux, da nur eine Ressource fehlt: LXR zum Durchsuchen der Kernelquelle .
Gilles 'SO - hör auf böse zu sein'
8

Es gibt viele Kernel.

Linuxist nicht das einzige Spiel da draußen, aber es ist das am weitesten verbreitete. Einige Leute empfehlen den minixKernel, um Betriebssystemkonzepte zu verstehen. Ich würde mich für die Linux 2.6.x-Serie entscheiden, da diese am häufigsten verwendet wird und nicht für etwas verschwendet wird, das (fast) niemand verwendet. Solaris, XNU (Mac), FreeBSD und Dragonfly sind bemerkenswert. 1

Finden Sie etwas sehr Einfaches (serielle Schnittstelle, USB usw.) und lassen Sie es etwas anderes tun. Versuchen Sie für eine zusätzliche Herausforderung, ein Kernelmodul für etwas zu schreiben, das noch keines hat. (Stellen Sie sicher, dass Sie den Verdächtigen zuerst nach PCI sudo lspci -nnund / oder USB-ID googeln sudo lsusb.)

Update: Führen Sie dies nicht direkt auf Ihrem Primärsystem durch, sondern verwenden Sie wie erwähnt virtuelle Maschinen (VM) (Computer in einem Computer). VirtualBox kann dies bereitstellen und es ist kostenlos. Ich möchte auch nicht, dass es überwältigend erscheint, aber versuchen Sie es mit VM-Snapshots, damit Sie zurückkehren können, falls etwas die VM selbst beschädigt.

Update 2 : Der Hinweis zu Git (DVCSes Inc. Mercurial, Fossil, Basar, Darcs) ist eine gute Idee, hauptsächlich für Code und kleine, wichtige Dateien. Versuchen Sie, Git nicht zum Sichern von Musik, Videos usw. zu verwenden, es sei denn, Sie kennen die Auswirkungen. ;)

dhchdhd
quelle
6

Suchen Sie ein Modul oder einen Treiber, den Sie ändern möchten, oder beginnen Sie mit einem Modul vom Typ null / hallo Welt, und erstellen Sie von dort aus. Arbeiten Sie speziell mit einem Modul, da Sie damit den Code in einen laufenden Kernel laden, entladen, neu kompilieren und neu laden können. Später können Sie in die Kernbits einsteigen, aber im Grunde haben Module alle Arten von und Sie können so ziemlich alles tun, was Sie wollen.

Zweitens verwenden Sie eine VM. Richten Sie einen Gastcomputer unter VirtualBox oder über VM ein und führen Sie dort Ihre Kerneltests für eine Weile durch. Auf diese Weise können Sie Ihr Hauptsystem nicht beenden, wenn Sie etwas kaputt machen, und ein Neustart, ein Zurückverfolgen zu einem funktionierenden Snapshot usw. ist wirklich einfach.

Drittens lernen git.

Caleb
quelle
1

Jemand erwähnt bereits das Buch "Linux Device Drivers" - dies ist eine ausgezeichnete Ressource, und ich kann es auch sehr empfehlen.

Obwohl in der Frage erwähnt wird, dass der Urheber nicht speziell nach Büchern fragt, ist die neueste Ausgabe des Buches "Understanding the Linux Kernel" ( http://oreilly.com/catalog/9780596005658/ ) von unschätzbarem Wert, um mehr über den Linux-Kernel im Allgemeinen zu erfahren und enthält auch einen Abschnitt über Linux-Gerätetreiber.

CORPORATEWAGESLAVE
quelle