Schreiben eines "Hello World" -Gerätetreibers für Kernel 2.6 mit Eclipse

9

Tor

Ich versuche, einen einfachen Gerätetreiber unter Ubuntu zu schreiben. Ich möchte dies mit Eclipse (oder einer besseren IDE, die für die Treiberprogrammierung geeignet ist) tun. Hier ist der Code:

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );

Meine Bemühungen

Nach einigen Recherchen habe ich mich für die Entwicklung des Treibers für Eclipse CTD entschieden (obwohl ich immer noch nicht sicher bin, ob es Multithreading-Debugging-Tools unterstützt). Also ich:

  1. Installierte Ubuntu 11.04 Desktop x86 auf einer virtuellen VMWare-Maschine,
  2. Installiert eclipse-cdtund Linux-Header-2.6.38-8 mit Synaptic Package Manager,
  3. Erstellt einen C Projectbenannten TestDriver1und kopierten Code darüber,
  4. Der Standard-Build-Befehl wurde makein den folgenden benutzerdefinierten Build-Befehl geändert :

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

Das Problem

Ich erhalte eine Fehlermeldung, wenn ich versuche, dieses Projekt mit Eclipse zu erstellen. Hier ist das Protokoll für den Build:

**** Build der Konfiguration Debuggen für Projekt TestDriver1 ****

make -C /lib/modules/2.6.38-8-generic/build M = / home / isaac / workspace / TestDriver1 all

make: Verzeichnis '/usr/src/linux-headers-2.6.38-8-generic' eingeben

make: *** Keine Regel, um vmlinux', needed byalle zum Ziel zu machen '. Halt.

make: Verlassen des Verzeichnisses '/usr/src/linux-headers-2.6.38-8-generic'

Interessanterweise erhalte ich keine Fehlermeldung, wenn ich dieses Projekt verwende, shellanstatt es eclipsezu erstellen. Zur Verwendung shellerstelle ich einfach ein MakefileContaining obj-m += TestDriver1.ound verwende den obigen makeBefehl zum Erstellen.

Also muss etwas mit der Sonnenfinsternis nicht stimmen Makefile. Vielleicht sucht es nach der vmlinuxArchitektur (?) Oder etwas, während die aktuelle Architektur x86 ist. Vielleicht liegt es an VMWare?

Wie ich verstanden habe, würde eclipsedas automatische Erstellen der Makefiles und das manuelle Ändern zu zukünftigen Fehlern führen ODER die Verwaltung makefileerschweren.

Wie kann ich dieses Projekt auf Eclipse kompilieren?

Isaac
quelle

Antworten:

5

Ich bin fast in der gleichen Position mit dir. Nach diesen Anweisungen hatte ich Erfolg mit dem Erstellen des Kernels selbst und eines einzelnen Moduls.

Ich habe dem Hauptartikel drei Schritte (40 ~ 42) hinzugefügt, damit Eclipse einen bestimmten Treiber kompiliert, nicht den gesamten Kernel.

  1. Laden Sie Eclipse plus CDT herunter und installieren Sie es.
  2. Konfigurieren und erstellen Sie Ihren Kernel zum Definieren CONFIG_*und Generieren autoconf.h. Dies kann vor oder nach dem Herunterladen und Installieren von Eclipse erfolgen.
  3. Stellen Sie sicher, dass Sie die richtige Kernelquelle haben (z. B. stellen Sie sicher, dass Sie sich im richtigen Git-Zweig befinden). Wenn Sie später einen anderen Zweig auschecken, ist das in Ordnung, aber Sie müssen die Quelle neu indizieren, und das dauert ungefähr 20 Minuten.
  4. Starten Sie Eclipse.
  5. Klicken Sie auf File-> New->C Project
  6. Geben Sie einen Projektnamen wie ein my_kernel
  7. Deaktivieren Sie das Kontrollkästchen Standardspeicherort verwenden und geben Sie das Stammverzeichnis Ihres Kernels in das Feld Speicherort ein.
  8. Klicken Sie im Bereich Projekttyp: auf das Makefile-Projekt und wählen Sie Projekt leeren
  9. Wählen Sie auf der rechten Seite Linux GCC
  10. Klicken Sie auf Advanced settings... und ein Dialogfeld mit Eigenschaften wird angezeigt.
  11. Wählen Sie links Ressource aus, und wählen Sie dann im Abschnitt Codierung der Textdatei die Option Andere aus, und ISO-8859-1klicken Sie dann im Feld auf Übernehmen
  12. Öffnen Sie die C/C++ GeneralAuswahl links.
  13. Klicke auf Preprocessor Include Paths
  14. Wählen Sie GNU Cin der Liste Sprachen
  15. Wählen Sie CDT User Setting Entriesin der Liste Einstellungseinträge
  16. Klicken Sie auf Add.... Wählen Sie in der Dropdown-Liste oben links die Option Präprozessor-Makrodatei, include/generated/autoconf.hin der Dropdown-Liste oben rechts den Projektpfad und geben Sie sie in das Textfeld Datei ein. (Hinweis: für älteren Kernel [? Pre-2.6.36], die Lage autoconf.hist include/linux/autoconf.h)
  17. Fügen Sie auch andere von Ihnen verwendete Makrodateien hinzu.
  18. Klicken Sie auf Indexer
  19. Aktivieren Sie das Kontrollkästchen Projektspezifische Einstellungen aktivieren.
  20. Deaktivieren Sie Indexquelldateien, die nicht im Build enthalten sind
  21. Löschen Sie das Feld Zu indizierende Dateien im Voraus.
  22. Klicken Sie links auf Pfade und Symbole.
  23. Wählen Sie die Registerkarte Includes und dann GNU C
  24. Klicken Sie auf Add...
  25. Klicken Sie auf Workspace... und wählen Sie dann das Include-Verzeichnis Ihres Kernels aus
  26. Führen Sie einen weiteren Add, Workspace aus und fügen Sie arch/architecture/includez.arch/powerpc/include
  27. Klicken Sie auf die # SymbolsRegisterkarte
  28. Klicken Sie auf Add...
  29. Setzen Sie den Namen auf __KERNEL__
  30. Setzen Sie den Wert auf 1und klicken Sie auf OK
  31. Klicken Sie auf die Registerkarte Quellspeicherort
  32. Klicken Sie auf den Twisty für Ihr Projekt.
  33. Wählen Sie das Element Filter und klicken Sie auf Filter bearbeiten ...
  34. Klicken Sie auf Mehrere hinzufügen ... und wählen Sie dann alle arch / * -Verzeichnisse in Ihrer Kernelquelle aus, die nicht verwendet werden (dh alle, die nicht für die von Ihnen verwendete Architektur bestimmt sind).
  35. Klicken Sie auf OK und erneut auf OK, um diesen Dialog zu schließen.
  36. Klicken Sie im Dialogfeld Eigenschaften auf OK.
  37. Klicken Sie im Dialogfeld C-Projekt auf Fertig stellen.
  38. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Index und dann Neu erstellen
  39. Der Vorgang dauert ungefähr 20 Minuten.
  40. Öffnen Sie Ihre Projekteinstellung und gehen Sie zu C/C++ build -> Behaviour (tab)
  41. Aktivieren Sie das Build (Incremental buil)Kontrollkästchen und fügen Sie Ihren Modulpfad zum Textfeld hinzu (in meinem Fall M=drivers/servo/dynamixel).
  42. Wenn Ihr Modul fertig ist und Sie den Kernel kompilieren möchten, wiederholen Sie 41 und ersetzen Sie es M=..durch all.
sorush-r
quelle
1

Wenn Sie die Treiberentwicklung mit Eclipse durchführen möchten, müssen Sie dies umgekehrt tun.

Sie müssen sich über automake, autogen, pkg-config usw. informieren, ein Autotool-Projekt erstellen und es in Eclipse importieren. Die Eclipse-CDT sollte dies bieten, andernfalls haben Sie die Installation des 'Autotools-Plugins' verpasst (unsicher über den genauen Namen, Schreiben aus dem Speicher).

Geben Sie einfach die Idee auf, dass eclipse-cdt ein anständiges Makefile verwalten könnte, C ist leider oder dankbar kein Java.

Aquaherd
quelle
Vielen Dank. Ich werde das autotoolsPlugin bald überprüfen . Kennen Sie eine bessere IDE für die Treiberprogrammierung? Glaubst du, ich (ein fauler VS-Benutzer, der keine Erfahrung mit Linux hat) kann das schaffen makefile? Ist es makefilein großen Projekten wirklich überschaubar?
Isaac
Ich war auch ein fauler VS-Benutzer und ich muss zugeben, dass das Beherrschen der Autotools eine steile Lernkurve hat, aber es lohnt sich nicht nur für Linux. Eclipse ist eine der besten IDEs, aber Autotool-Projekte sind so vielfältig, dass keine IDE alle Möglichkeiten analysieren kann. Versuchen Sie es mit geany, wenn Sie es richtig machen möchten, versuchen Sie es mit anjuta und codelite, wenn Sie VS6 mögen, aber beherrschen Sie die Kompilierung der Befehlszeile immer.
Aquaherd
1

Ich bin auch neu in der Linux-Treiberprogrammierung. Ich habe festgestellt, dass es eine neue Möglichkeit gibt, Kernelmodule (die nicht im offiziellen Linux-Baum enthalten sind) namens DKMS bereitzustellen. Das Modul wird als Quelle installiert und DKMS übernimmt die Kompilierung für jeden Kernel. Dies bedeutet, dass das Makefile für-Modul manuell geschrieben wird und die Quelle für Autotools nicht enthalten ist.

http://linux.dell.com/dkms/

Aktualisiert...

DKMS wurde auf http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx verschoben

Diese Tutorials / kurze Einführung in DKMS (Links von der Dell-Projektseite): Artikel im Linux-Journal , Power Solutions- Artikel , Ottawa Linux Symposium- Artikel

DKMS für die schnelle Treiberbereitstellung. Zum Beispiel Kernelmodule, die DKMS in meinem Ubuntu-Computer verwenden:

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

Dies ist der Code, den ich zuvor geschrieben habe. Er könnte als DKMS Hello World hilfreich sein. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

user.dz
quelle
1

1> Sie können es mit diesem Befehl versuchen

"make" -> "/ usr / bin / make"

/usr/bin/make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

2> Speichern Sie im Verzeichnis Ihren Hallo-Wort-Code und erstellen Sie den Dateinamen "Makefile".

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
namphamtien
quelle