Écriture d'un pilote de périphérique «Hello World» pour le noyau 2.6 à l'aide d'Eclipse

9

Objectif

J'essaie d'écrire un pilote de périphérique simple sur Ubuntu. Je veux le faire en utilisant Eclipse (ou un meilleur IDE adapté à la programmation du pilote). Voici le 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 );

Mon effort

Après quelques recherches, j'ai décidé d'utiliser Eclipse CTD pour développer le pilote (même si je ne sais toujours pas s'il prend en charge les outils de débogage multithread). Donc je:

  1. Installé Ubuntu 11.04 desktop x86 sur une machine virtuelle VMWare,
  2. Installés eclipse-cdtet linux-headers-2.6.38-8 utilisant Synaptic Package Manager,
  3. Créé un code C Projectnommé TestDriver1et copié-collé dessus,
  4. Modification de la commande de génération par défaut,, en la commande de makegénération personnalisée suivante:

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

Le problème

Je reçois une erreur lorsque j'essaie de créer ce projet à l'aide d'Eclipse. Voici le journal de la construction:

**** Construction de la configuration Debug pour le projet TestDriver1 ****

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

make: Entrer dans le répertoire '/usr/src/linux-headers-2.6.38-8-generic'

make: *** Pas de règle pour viser vmlinux', needed bytous '. Arrêtez.

make: Quitter le répertoire '/usr/src/linux-headers-2.6.38-8-generic'

Fait intéressant, je ne reçois aucune erreur lorsque j'utilise shellau lieu de eclipseconstruire ce projet. Pour l'utiliser shell, je crée juste un Makefilecontenant obj-m += TestDriver1.oet j'utilise la makecommande ci-dessus pour construire.

Donc, quelque chose ne va pas avec l'éclipse Makefile. Peut-être qu'il cherche l' vmlinuxarchitecture (?) Ou quelque chose alors que l'architecture actuelle est x86. C'est peut-être à cause de VMWare?

Si j'ai bien compris, la eclipsecréation automatique des makefiles et leur modification manuelle entraîneraient des erreurs à l'avenir OU rendraient la gestion makefiledifficile.

Alors, comment puis-je compiler ce projet sur Eclipse?

Isaac
la source

Réponses:

5

Je suis presque dans la même position que toi. Suite à ces instructions, j'ai réussi à construire le noyau lui-même et un seul module.

J'ai ajouté trois étapes (40 ~ 42) à l'article principal pour que Eclipse compile un pilote spécifique, pas tout le noyau.

  1. Téléchargez et installez Eclipse plus le CDT.
  2. Configurez et construisez votre noyau pour définir CONFIG_*et générer autoconf.h. Cela peut être fait avant ou après le téléchargement et l'installation d'Eclipse.
  3. Assurez-vous d'avoir la bonne source de noyau (par exemple, assurez-vous que vous êtes sur la bonne branche git). Si vous consultez une autre branche plus tard, c'est correct, mais vous devrez réindexer la source, et cela prend environ 20 minutes.
  4. Démarrez Eclipse.
  5. Cliquez sur File-> New->C Project
  6. Remplissez un nom de projet comme my_kernel
  7. Décochez la case Utiliser l'emplacement par défaut et saisissez le répertoire racine de votre noyau dans la zone Emplacement.
  8. Dans le volet Type de projet:, cliquez sur le projet Makefile et sélectionnez Projet vide
  9. Sur le côté droit, sélectionnez Linux GCC
  10. Cliquez sur Advanced settings... et une boîte de dialogue Propriétés apparaîtra.
  11. Sélectionnez Ressource sur la gauche, puis dans la section Encodage du fichier texte, sélectionnez Autre et ISO-8859-1dans la zone, puis cliquez sur Appliquer
  12. Ouvrez la C/C++ Generalsélection à gauche.
  13. Cliquer sur Preprocessor Include Paths
  14. Sélectionnez GNU Cdans la liste Langues
  15. Sélectionnez CDT User Setting Entriesdans la liste des entrées de réglage
  16. Cliquez sur Add.... Choisissez Fichier de macros de préprocesseur dans la liste déroulante en haut à gauche, Chemin du projet dans la liste déroulante en haut à droite, et entrez include/generated/autoconf.hdans la zone de texte Fichier. (Remarque: pour les noyaux plus anciens [pré-2.6.36?], L'emplacement de autoconf.hest include/linux/autoconf.h)
  17. Ajoutez également tous les autres fichiers de macros que vous utilisez.
  18. Cliquez sur Indexer
  19. Cochez la case Activer les paramètres spécifiques au projet.
  20. Décochez les fichiers source d'index non inclus dans la build
  21. Décochez la case Fichiers à indexer à l'avance.
  22. Cliquez sur Chemins et symboles à gauche.
  23. Sélectionnez l'onglet Comprend, puis sélectionnez GNU C
  24. Cliquez Add...
  25. Cliquez sur Workspace... puis sélectionnez le répertoire d'inclusion de votre noyau
  26. Faites un autre ajout, Workspace et ajoutez arch/architecture/include, par exemple,arch/powerpc/include
  27. Cliquez sur l' # Symbolsonglet
  28. Cliquez Add...
  29. Définissez le nom sur __KERNEL__
  30. Définissez la valeur sur 1et cliquez sur OK
  31. Cliquez sur l'onglet Emplacement source
  32. Cliquez sur le twisty pour votre projet.
  33. Sélectionnez l'élément Filtrer et cliquez sur Modifier le filtre ...
  34. Cliquez sur Ajouter plusieurs ... puis sélectionnez tous les répertoires arch / * dans votre source de noyau qui ne seront pas utilisés (c'est-à-dire tous ceux qui ne sont pas pour l'architecture que vous utilisez)
  35. Cliquez sur OK et à nouveau sur OK pour fermer cette boîte de dialogue.
  36. Cliquez sur OK dans la boîte de dialogue Propriétés.
  37. Cliquez sur Terminer dans la boîte de dialogue Projet C.
  38. Faites un clic droit sur le projet et sélectionnez Index puis sélectionnez Reconstruire
  39. Cela prendra environ 20 minutes.
  40. Ouvrez le paramètre de votre projet, accédez au C/C++ build -> Behaviour (tab)
  41. Cochez la Build (Incremental buil)case et ajoutez votre chemin de module à la zone de texte (dans mon cas M=drivers/servo/dynamixel).
  42. Lorsque votre module est prêt et que vous souhaitez compiler le noyau, répétez 41 et remplacez M=..par all.
sorush-r
la source
1

Si vous voulez faire du développement de pilotes avec eclipse, vous devrez le faire dans l'autre sens.

Vous devrez rattraper son retard sur automake, autogen, pkg-config et ainsi de suite, créer un projet autotools et l'importer dans eclipse. Le eclipse-cdt devrait offrir cela sinon vous avez manqué d'installer le 'plugin autotools' (incertain sur le nom exact, en l'écrivant de la mémoire).

Abandonnez simplement l'idée qu'eclipse-cdt pourrait gérer un Makefile décent, C n'est pas Java, malheureusement ou heureusement.

aquaherd
la source
Merci. Je vérifierai autotoolsbientôt le plugin. Connaissez-vous un meilleur IDE pour la programmation des pilotes? Pensez-vous que je (un utilisateur VS paresseux qui n'a aucune expérience de Linux) puisse gérer makefile? Est-ce makefilevraiment gérable dans les grands projets?
Isaac
J'étais aussi un utilisateur VS paresseux et je dois admettre que la maîtrise des outils automatiques a une courbe d'apprentissage abrupte, mais cela en vaut la peine, non seulement pour Linux. Eclipse est l'un des meilleurs IDE du moment, mais les projets d'autotools sont si diversifiés qu'aucun IDE ne peut analyser toutes les possibilités. Essayez Geany si vous voulez le faire correctement, essayez Anjuta et Codelite si vous avez aimé VS6 mais soyez toujours compétent dans la compilation en ligne de commande.
aquaherd
1

Je suis nouveau aussi dans la programmation des pilotes Linux, j'ai trouvé qu'il y avait une nouvelle façon de déployer les modules du noyau (qui ne sont pas dans l'arborescence Linux officielle) appelée DKMS. Le module sera installé comme source et DKMS se chargera de le compiler pour chaque noyau. Cela signifie que le Makefile pour le module sera écrit manuellement et sa source ne sera pas incluse pour les autotools.

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

mise à jour...

DKMS est passé à http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

Cette tutorials / introduction rapide à DKMS (liens de Dell page du projet): article Linux Journal , papier Power Solutions , Ottawa Linux Symposium papier

DKMS utilisé pour le déploiement rapide des pilotes. Par exemple, les modules du noyau utilisant DKMS sur ma machine Ubuntu:

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

Ceci est le code que j'ai écrit auparavant, il pourrait être utile en tant que DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

user.dz
la source
1

1> vous pouvez essayer avec cette commande

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

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

2> dans le répertoire stockez votre code de mot bonjour, créez le nom de fichier "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
la source