erreur lors de la génération du fichier .ko pour le module hello world simple pour le kernel Linux

Je suis un débutant en développement de kernel Linux et j’essaie de charger un module simple sous Linux. J’ai créé un fichier hello.c, à charger en tant que module du kernel.

#include  #include  #include  MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("A Simple Hello World module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!\n"); return 0; } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.\n"); } module_init(hello_init); module_exit(hello_cleanup); 

ce hello.c et le makefile tous les deux, je les ai conservés dans le répertoire / home / linux /.

makefile

 obj-m +=hello.o src= /usr/src/linux-headers-3.5.0-17-generic all: $(MAKE) -C $(src) SUBDIR-$(PWD) modules clean: rm -rf *.o *.ko 

pour générer un fichier .ko, lorsque j’exécute la commande make sur terminal à partir du répertoire / home / linux, le message d’erreur suivant s’affiche:

 h2o@h2o-Vostro-1015:~/linux$ make make -C /usr/src/linux-headers-3.5.0-17-generic SUBDIR-/home/h2o/linux modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic' make[1]: *** No rule to make target `SUBDIR-/home/h2o/linux'. Stop. make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic' make: *** [all] Error 2 

conseiller gentiment ce que je manque ou fais mal ..

Tu as:

 $(MAKE) -C $(src) SUBDIR-$(PWD) modules 

Mais il semble que tu veuilles:

 $(MAKE) -C $(src)/SUBDIR-$(PWD) modules 

Ou quelque chose du genre; Où vit le code source? Vous devez -C là.

  • Makefile

    obj-m: = hello.o # Le nom du module est hello.c

    KDIR: = / lib / modules / $ (shell uname -r) / build

    tous: modules $ (MAKE) -C $ (KDIR) M = $ (PWD)

    clean: $ (MAKE) -C $ (KDIR) M = $ (PWD) clean $ (RM) Module.markers modules.order

il n’est pas garanti que le fichier d’en-têtes sera toujours situé dans le répertoire / usr / src, mais il le sera sûrement dans le répertoire / lib / modules.

  • assurez-vous que ce système a les derniers fichiers d’en-tête

pour savoir quels fichiers d’en-tête doivent être présents

uname -r

sur le terminal, la sortie sera comme

3.5.0-17-generic

installer des fichiers d’en-tête

sudo apt-get install linux-headers-$(uname -r)

Le système de construction du kernel est un peu complexe. Il serait bon de lire la documentation du processus de construction du kernel . Ce qui donne une meilleure compréhension, disons, de

  • Des cibles comme — modules / modules_install
  • Des options telles que — -C $KDIR / M=$PWD
  • Syntaxe de commande —
  • $ make -C M=$PWD

    $ make -C /lib/modules/ uname -r /build M=$PWD

    $ make -C /lib/modules/ uname -r /build M=$PWD modules_install

  • Objectifs du module chargeable — obj-m

etc…