linux / init.h: Aucun fichier ou répertoire de ce type

J’essaie de construire un module de kernel pour une classe de la mienne et j’obtiens un mur d’erreurs, mais en haut de ce mur se trouve la fameuse erreur «Aucun fichier ou répertoire». Cela semble être la racine du problème. Cela semble non seulement affecter init.h, mais aussi module.h et kernel.h. Les trois premières lignes du programme sont les suivantes:

#include  #include  #include  

J’ai regardé autour de nous et essayé d’autres chemins pour savoir où ces fichiers devraient se trouver lorsque vous parcourez des problèmes similaires, mais rien n’a fonctionné jusqu’à présent. La partie la plus étrange est que j’ai déjà utilisé ce module; On m’a fourni un code de démarrage qui avait cela en haut (je n’ai rien changé) et cela ne m’a pas donné cette erreur. Bien que, évidemment, le code suivant soit différent, mais cela semble être le plus gros problème pour le moment.

Le code complet est comme suit:

 #include  #include  #include  /* This function is called when the module is loaded. */ int simple_init(void) { printk(KERN_INFO "Loading Module\n"); static LIST_HEAD(birthday_list) struct birthday{ int day; int month; int year; struct list_head list; }; struct birthday *ptr, *next; struct birthday *bob; struct birthday *judy; struct birthday *josh; struct birthday *lana; struct birthday *jan; bob = kmalloc(sizeof(*bob), GFP_KERNEL); bob -> day = 17; bob -> month = 1; bob -> year = 1990; INIT_LIST_HEAD(&bob -> list); ... list_add_tail(bob -> list, &birthday_list); list_add_tail(judy -> list, &birthday_list); list_add_tail(josh -> list, &birthday_list); list_add_tail(lana -> list, &birthday_list); list_add_tail(jan -> list, &birthday_list); struct birthday *ptr; list_for_each_entry(ptr, &birthday_list, list){ kprintf('%d/%d/%d \n', ptr -> month, ptr -> day, ptr -> year); } list_for_each_entry_safe(ptr, &birthday_list, list){ list_del(&ptr->list); kfree(ptr); } return 0; } /* This function is called when the module is removed. */ void simple_exit(void) { printk(KERN_INFO "Removing Module\n"); } /* Macros for registering module entry and exit points. */ module_init( simple_init ); module_exit( simple_exit ); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple Module"); MODULE_AUTHOR("SGG"); 

Je pense que vous devez d’abord installer quelque chose comme linux-headers- [version du kernel] par apt-get, puis vous devez créer un fichier Makefile comme suit:

 ifneq ($(KERNELRELEASE),) # call from kernel build system lifo-objs := main.o obj-m := lifo.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) modules: echo $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules endif clean: rm -rf *.o *~ core .depend *.mod.o .*.cmd *.ko *.mod.c \ .tmp_versions *.markers *.symvers modules.order depend .depend dep: $(CC) $(CFLAGS) -M *.c > .depend ifeq (.depend,$(wildcard .depend)) include .depend endif 

Définissez la variable KERNELDIR dans le fichier Makefile ci-dessus sur la version de votre kernel appropriée. Par défaut, il utilise votre kernel en cours d’exécution. Si vous utilisez ce Makefile, vous devez modifier votre inclusion au format suivant:

 #include  #include  #include  

Je pense que pour le développement de modules de kernel, utilisez le kernel standard de Linus Torvalds, git est meilleur. Pour un module de kernel simple, voir ceci .

lors de la construction des modules du kernel, vous devez utiliser make files

 obj-m := module_name.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build all default: modules install: modules_install modules modules_install help clean: $(MAKE) -C $(KERNELDIR) M=$(shell pwd) $@ 

Il y a une faute de frappe dans la première ligne du code complet “/ usr / unclude …” qui pourrait être responsable de l’impossibilité de trouver init.h