linux / init.h:没有这样的文件或目录

我正在尝试为我的一类构建一个内核模块,并且我遇到了一堵错误,但是在所述墙的顶部是臭名昭着的“没有这样的文件或目录”错误。 这似乎是问题的根源。 这不仅影响init.h,还影响module.h和kernel.h。 该计划的前三行如下:

#include  #include  #include  

在浏览类似的问题时,我环顾四周并尝试了其他路径,这些文件应该是什么,但到目前为止还没有任何工作。 最奇怪的是我已经使用过这个模块; 我提供了顶级的初学者代码(我没有改变任何东西),它没有给我那个错误。 虽然,显然后面的代码是不同的,但这似乎是目前最大的问题。

完整代码如下:

 #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"); 

我认为你必须首先通过apt-get安装类似linux-headers- [kernel version]的东西然后你必须创建Makefile如下:

 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 

将上面的Makefile中的KERNELDIR变量设置为适当的内核版本,默认情况下它使用正在运行的内核。 如果您使用此Makefile,则需要将include更改为以下格式:

 #include  #include  #include  

我认为对于内核模块开发使用来自Linus Torvalds git的标准内核更好。 对于一些简单的内核模块,请参阅此

在构建内核模块时,您应该使用make文件

 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) $@ 

在完整代码“/ usr / unclude …”的第一行中有一个拼写错误,可能导致无法找到init.h